Create enhanced spatial computing experiences with ARKit

니냐뇨·2024년 8월 19일
0

Spatial Computing

목록 보기
16/19

링크: https://developer.apple.com/videos/play/wwdc2024/10100/

blackbox에서는 ARKit을 활용하여 플레이어의 손제스처를 감지한다.

Super Fruit Ninja 또한 Hand tracking을 사용하여 과일 자르기를 하고

scene understanding feature를 통해 남은 과일이 바닥에 튀는 장면도 표현한다.

visionOS의 ARKit

visionOS 앱이 Full Space를 표시할 때 ARKit에서 앵커 형태로 데이터를 수신 할 수 있다. 앵커는 3차원 공간에서 위치와 방향을 나타낸다.

예를 들어 plane detection data는 현실에서 감지된 표면 정보를 담고 있는 PlaneAnchor 형태로 전달된다.

ARKit은 Data Provider를 통해 앱에 앵커를 전달한다. Data Provider는 개별 ARKit 기능을 구성하고 해당 데이터를 수신하기 위한 인터페이스이다.
Plane DetectionProvider는 PlaneAnchor를 수신하는 인터페이스이다.

ARKitSession을 실행하려면 경험에 사용하려는 Data Provider 세트를 제공하면 된다.

ARKit에 대해 더 알고 싶다면 이 영상을 보도록.

Room tracking

mesh와 plane anchor data로도 사실적으로 배치된 가상 콘텐츠를 활용하여 AR 배경을 만들 수 있지만 사용자의 참여도를 새로운 차원으로 끌어올릴 수 있다. 침실에 들어갈 때 가상의 반려 동물이 반갑게 맞아준다고 상상해봐라. Room tracking을 사용하면 방문하는 각 공간마다 경험을 맞춤화할 수 있다.

사용자가 주변을 둘러볼 때 ARKit이 실내를 식별한다. 이 정보로 감지된 벽과 바닥의 정확히 정렬된 geometry를 계산한다.

추가적으로 ARKit은 방 사이의 전환을 인식할 수 있다. 이를 통해 사용자가 있는 공간에 따라 다른 경험을 표시할 수 있다.

모든 정보는 Room Tracking Data Provider를 통해 표시되며 world sensing authorization이 필요하다.

RoomTrackingProvider는 방문한 방이 어딘지 알려준다.
ARKit이 사용자가 밀폐된 공간에 있다고 판단하는 경우 이 인터페이스를 통해 현재 방의 anchor에 접근할 수 있다. 현재 방 anchor를 사용하여 실내 레이아웃에 맞춘 경험을 형성할 수 있다.

앱에서 비동기식 실내 추적 업데이트를 수신할 수도 있는데 이는 다른 Data Provider로부터 앵커를 수신하는 방식과 유사하다. 이는 다른 방으로 이동했을 때 새 방에 대한 최신 정보를 수신하기 좋은 방법이다.

참고로 RoomTrackingProvider는 현재 사용자가 있는 방의 anchor data만 업데이트 한다.

각 RoomAnchor는 한정된 특정 공간에 대한 공간 정보를 보유한다.

이 앵커는 현재 방의 모델링 여부를 나타낼 수 있다. 이는 특정 콘텐츠를 사용자가 현재 있는 공간에만 표시하려는 경우에 유용하다.

각 RoomAnchor는 주변 벽과 바닥의 geometry로 보유한다. 이는 방의 모양을 정의하는 꼭짓점, edge, 삼각형 면의 모음으로 구성된다. 이 mesh는 mesh 및 평면 앵커에서 볼 수 있는 geometry에 비해 방의 경계를 더 잘 나타낸다.

완벽한 벽 또는 바닥마다 mesh를 하나씩 분리된 geometry 배열로 가져올 수도 있다. 이는 방 외부에 배치된 가상 콘텐츠를 가리거나 벽 전체를 따라 가상 포털을 여는 등의 AR 경험에 유용할 수 있다.

지정된 3차원 point가 방에 존재하는지도 확인할 수 있다. world tracking과 함께 사용하면 특정 방에 진입할 때 가상 객체가 살아 움직이는 마법 같은 경험을 만들 수 있다.

마지막으로, 이 새로운 앵커는 방과 관련된 plane과 mesh anchor id를 제공한다. other scene understanding feature들과 결합하여 앱을 최적화하는 데 유용할 수 있다. 예를 들어 현재 방 외부의 평면 및 mesh에서 고비용 연산을 제외할 수 있다.

Plane detection

ARKit은 주변에서 평면 표면을 감지하여 PlaneAnchor의 형태로 정보를 제공한다. table에 보드 게임을 배치하거나 벽에 가상 포스터를 배치하는 등 표면에 가상 콘텐츠를 배치할 때 유용하다.

PlaneDetectionProvider는 감지된 수평 표면과 수직 표면을 앱에 알려줄 수 있다.

올해 Slanted plane alignement가 새롭게 추가되어 경사진 표면의 감지가 가능해졌다.

간단한게 slanted 정렬만 추가하면 된다.

Object tracking

이제 ARKit은 환경에 정적으로 배치된 현실 객체를 추적할 수 있다. Object tracking을 통해서 각 물건들의 위치와 방향을 파악하여 가상 콘텐츠를 고정할 수 있다.

이를 위해서는 ReferenceObjects 세트를 제공해야한다. ReferenceObjects는 real world item의 공간적 특징을 인코딩한다.
ReferenceObject를 만드려먼 tracking 하려는 항목의 3D model을 USDZ 형식으로 준비해야 한다. 그리고 create ML과 ARKit을 이용한다.

이 세션에서는 ReferenceObject를 만든 후 ARKit으로 실제 항목을 추적하는 마지막 단계를 집중적으로 본다.

ReferenceObject는 런타임에 file URL혹은 bundle에서 불러올 수 있다.

여기서는 전역 ReferenceObject를 URL과 함께 로드한다.

ReferenceObject를 성공적으로 불러온 후에는 이것으로 새 ObjectTrackingProvider를 구성할 수 있다.

다음으로 ARKitSession에서 새 ObjectTrackingProvider를 실행할 수 있다.

Data Provider가 실행 상태가 되면 수신된 추적 결과를 처리할 수 있게 된다. 이 tracking result는 각각 추적된 항목을 나타내는 ObjectAnchor의 형태로 전달된다.

ObjectAnchor는 감지된 객체의 axis align된 바운딩 박스를 가지고 있다. 바운딩 박스의 중심과 범위는 물론 최소 및 최대 3D 좌표점을 얻을 수 있다.

이 앵커는 해당하는 ReferenceObject도 보유한다. ReferenceObject가 파일 경로에 포함된 경우 이 앵커에서 기본 USDZ 파일 경로에 접근할 수 있다. 다른 Data Provider와 마찬가지로 ObjectAnchor 업데이트를 수신할 수 있다.

그런 다음 최신 추적 업데이트를 사용하여 객체에 감각적인 가상 콘텐츠를 추가할 수 있다.

World tracking

이 플랫폼의 Foundational 한 부분.

ARKit은 공간 추적과 같은 정교한 알고리즘을 위해 다양한 카메라와 센서를 사용합니다.

사용자의 실제 위치에 조명이 충분하지 않으면 센서 데이터에 영향을 미치고 알고리즘이 원활히 작동하지 않을 수 있다.
그래서 올해 애플은 이러한 조명 변화에 대응하는 메커니즘을 추가했다. 방향의 변화만 tracking하고 공간에서 위치는 추적하지 않는 것이다.
이미 시스템 수준에서 orient-based tacking이 앱에 적용되고 있어서 가능하다.
또한 이러한 상황들에 대비하여 경험을 조정하고자 한다면 추적 변경 사항을 알려주는 API를 사용해봐라.

앱이 full world tracking에 완전히 의존하는 경우 사용자에게 더 밝은 환경으로 이동하여 경험을 다시 시작하도록 요청할 수도 있다.

SwiftUI를 사용하는 경우, 새로운 worldTrackingLimitations 환경 값 envionment value를 통해 이 표시를 사용할 수 있다.
예를 들어, 위치 추적을 사용할 수 없을 때 콘텐츠 재정렬을 위해 이 값에 변경이 있는지 볼 수 있다.

ARKit에서는 확장된 DeviceAnchor가 trackingState 속성을 보유하므로 추적이 완전히 작동하는지 또는 방향 기반 추적으로만 제한되는지 알 수 있다. 시스템이 orientation-based tracking으로 전환한다면, 기존 공간 앵커는 not tracked로 표시될 수 있다.
world tracking이 재게되면, persistency anchor의 추적 상태가 복원된다.

Hand tracking

visionOS의 주요 입력 수단인 손!

작년에는 HandAnchor의 형태로 손과 손가락의 정보를 얻을 수 있는 2가지 방법을 마련했다.

HandTackingProvider에 최신 업데이트를 poll하거나 HandAnchors가 제공될 때마다 비동기적으로 수신하는 것이다.

이제 HandTackingProvider가 이 데이터를 디스플레이 속도로 전달할 수 있게 되었다.

Asynchoronous HandAnchor 업데이트는 약간의 지연 시간이 있지만, 디스플레이에 맞춰 전송되는 빈도가 증가함에 따라 더 매끄러워진다.

앱 렌더링에 Compositor Services 또는 RealityKit을 사용하든 새로운 hand prediction API를 통해 추적 결과를 더 빨리 얻을 수 있다.

Compositor Service를 사용하는 경우, visionOS에 새로 도입된 'trackable anchor time'을 타겟팅해야 한다. 이 timestamp에서 HandAnchor를 예측하면 콘텐츠를 가장 적절하게 등록하는 데 도움이 된다.

이 타임 스탬프를 초 단위로 변환하여 ARKit에 제공하면 전방을 정교하게 예측할 수 있다.

디스플레이에 맞는 HandAnchor 업데이트는 지연 시간이 중요하지 않은 환경에서 제스처를 감지하여 부드러운 stroke를 그리는데 적합하다.

hand prediction은 유동성이 크게 중요하지 않으면서 콘텐츠를 최대한 손에 밀착시키고 싶을 때 유용하다.

이 개선 사항은 RealityKit의 AnchorEnitites에도 도입되었다. RealityKit을 사용하여 손 근처에 콘텐츠를 둘 때, 필요에 따라 continous or predicted 중에 선택 가능.

자세한 예제는 이 영상을 봐라.

profile
열심히 살자.

0개의 댓글