스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
visionOS의 물체 추적 기능 살펴보기
visionOS 앱에서 물체 추적을 사용하여 현실 세계의 객체를 가상 앵커로 바꾸는 방법을 확인해 보세요. 물체 추적을 통해 공간 경험을 만드는 방법을 처음부터 끝까지 자세히 공유합니다. Create ML에서 머신 러닝을 통해 참조 객체를 만들고 Reality Composer Pro, RealityKit 또는 ARKit API에서 대상 객체와 관련된 콘텐츠를 추가하는 방법을 확인해 보세요.
챕터
- 0:00 - Introduction
- 5:07 - Create reference object
- 9:28 - Anchor virtual content
리소스
- Exploring object tracking with ARKit
- Forum: Spatial Computing
- Implementing object tracking in your visionOS app
관련 비디오
WWDC24
- ARKit으로 향상된 공간 컴퓨팅 경험 제작하기
- Create ML의 새로운 기능
- Reality Composer Pro에서 대화식 3D 콘텐츠 만들기
- RealityKit으로 공간 드로잉 앱 빌드하기
WWDC23
-
다운로드
‘visionOS의 물체 추적 기능 살펴보기’ 세션을 시작합니다 저는 Object Tracking 팀의 엔지니어인 Henning입니다 오늘은 Apple의 최신 객체 추적 기술을 사용하여 실제 객체를 가상 앵커로 변환해 visionOS 앱에서 생동감 있게 만드는 방법을 알아보겠습니다 Reality Composer Pro 또는 RealityKit 및 ARKit 프레임워크를 사용하여 공간 경험을 이미 생성해 보셨을 겁니다 또한 주변 환경에 가상 객체를 앵커링하는 개념도 익숙하실 것입니다 예를 들어, visionOS 앱은 RealityKit 및 ARKit API를 사용해 평면, 이미지 또는 손을 기준으로 콘텐츠를 배치합니다 앵커는 현실과 가상의 경계를 허무는 몰입형 경험의 훌륭한 시작점입니다 객체 추적 기능을 통해 실제 물체를 앱에서 앵커로 사용하도록 하는 지원이 추가되었습니다 일상의 사물을 살짝 보기만 해도 유용한 정보를 알려준다면 어떨까요? 또는 가상 설명서가 함께 제공되는 가전제품이나 기기 생동감 있게 움직이는 수집품과 장난감이 상호작용을 통해 몰입감 넘치는 스토리텔링 경험을 선사한다면요? 마법처럼 들리시나요? 바로 보여드리죠 여기 제 공간에는 책상 위에 몇 가지 물체가 있습니다 지구본과 현미경 오실로스코프가 있죠 객체 추적을 사용하면 제 앱은 각 물체의 위치와 방향을 얻을 수 있고 이는 여기 예제에서처럼 좌표계와 바운딩 박스로 표현됩니다 이제 앱이 물체의 공간 좌표를 정확히 알게 되었으니 한 단계 더 나아가 흥미로운 콘텐츠로 강화해 보죠 다시 지구본을 보시면 이번에는 지구본과 연결된 가상 레이블이 있으며 탭하면 더 많은 정보를 볼 수 있다고 알려 줍니다 지구본을 탭하니 지구본 주위를 도는 객체가 나타납니다 그리고 우주 왕복선이 제 방에서 발사되고 있네요 가상 달과 우주 정류장이 실제 지구본 뒤로 어떻게 사라지는지 살펴보세요 이 부분이 정말 좋습니다 몰입도를 훨씬 높여 주거든요 잠깐만요, 이게 다가 아니에요 지구본을 다시 탭하면 지구본 위에서 지구의 내핵 부분을 볼 수 있습니다 정말 멋있네요!
이것은 제 컬렉션의 객체를 사용해 만든 한 가지 예에 불과합니다 여러분도 생동감을 불어 넣고 싶은 물체가 있을 것입니다 객체 추적을 사용해 구현하는 방법을 알아보겠습니다
앱에서 이제 간편하게 객체 추적을 사용할 수 있습니다 3단계만 따라 진행하면 되죠 먼저 3D 모델을 제공해야 하는데요 이 3D 모델은 추적하려는 실제 객체를 나타냅니다 사용하기 쉬운 도구가 있어서 3D 모델이 아직 없는 경우에도 쉽게 얻을 수 있습니다 이를 사용하여 머신 러닝 모델을 학습시킬 겁니다 객체 추적에 필요하거든요 학습 과정에서 이 3D 애셋을 Create ML 앱으로 가져옵니다 학습이 완료되면 참조 객체라는 결과물을 얻습니다 객체 추적을 위해 올해 도입된 새로운 파일 유형이죠
마지막으로 앱에서 이 참조 객체를 사용하여 가상 콘텐츠를 앵커링하고 경험을 만듭니다 마지막 단계를 활성화하는 데 여러 도구와 프레임워크를 사용할 수 있으며, 이 세션의 후반부에서 몇 가지 예를 다루겠습니다 우선, 객체 추적에 필요한 3D 모델에 대해 이야기하겠습니다
앞서 말씀드린 대로 Create ML 앱은 객체의 머신 러닝 모델을 학습시키려면 3D 애셋이 필요합니다 학습에 필요한 3D 애셋은 USDZ 파일 포맷이어야 합니다 최고의 추적 품질을 보장하려면 애셋을 가능한 한 사실적으로 표현해야 합니다 기본적으로는 실제 객체의 디지털 트윈을 찾는다 할 수 있죠 사진처럼 정확하고 상세한 3D 모델을 얻을 수 있는 간단한 방법은 Object Capture 기술을 사용하는 것입니다 iPhone이나 iPad만 있으면 할 수 있습니다 유광 또는 투명 부분이 포함된 물체에 대해서도 다중 소재 애셋을 제공할 수도 있으며 이는 다른 획득 워크플로에서 얻은 것입니다 Object Capture의 모범 사례에 대한 자세한 내용은 ‘iOS용 Object Capture 알아보기’ 세션에서 확인하세요
이제 객체 추적이 지원하는 객체를 살펴보겠습니다 객체 추적은 주변에서 주로 정지 상태인 객체에 가장 적합하게 작동합니다 또한 형태와 질감이 단단한 형태의 객체를 대상으로 해야 합니다 마지막으로, 객체는 비대칭이어야 합니다 즉 모든 각도에서 고유한 모습을 가져야 합니다 앞서 제가 보여드린 지구본은 구 형태의 비대칭적인 질감을 가지고 있어 매우 근사하게 작동했죠 지구본을 캡처하기 위해 스탠드를 제거했습니다 이는 추적 설정 시 객체의 단단한 부분만 고려되도록 하기 위해서였죠
이제 여러분의 객체와 콘텐츠를 이용해 어떻게 구현할 수 있는지 자세히 알아보겠습니다 기본적인 사항은 이미 살펴봤으니 이제 다음 섹션에서는 훨씬 더 자세히 알아보겠습니다 참조 객체를 만드는 방법을 시작으로 기존 도구를 사용하여 가상 콘텐츠를 실제 물체로 앵커링하는 예시를 보여드리겠습니다 우선 참조 객체부터 만들어 보죠 앞서 말씀드린 대로 객체 추적을 하려면 각 목표 객체마다 개별 머신 러닝 학습이 필요합니다 Create ML 앱에 이 작업을 통합하여 과정을 간소화했습니다 이번 작업에 가장 적합한 방식이죠 머신 러닝 학습은 모두 Mac에서 로컬로 실행됩니다
Create ML 앱을 실행하면 다양한 템플릿 중에서 선택할 수 있으며 여기에는 이미지 분류 또는 2D 물체 인식이 포함됩니다 올해에는 새로운 객체 추적 템플릿과 함께 공간이라는 카테고리가 새로 도입됩니다
학습 워크플로는 세 가지 간단한 단계로 이루어집니다 먼저, USDZ 애셋으로 학습 세션을 구성합니다 그런 다음 Mac에 로컬로 ML 모델을 학습시킵니다 끝으로 참조 객체를 저장하여 Apple Vision Pro의 공간 경험을 빌드합니다 세션 초반의 예시에서 이 작업이 어떻게 이루어졌는지 살펴보죠 객체 추적 템플릿을 사용하여 새 프로젝트를 생성하는 경우 CreateML은 빈 3D 뷰포트를 사용하여 학습 구성 뷰를 시작합니다 다음 단계는 USDZ 파일을 내 데스크탑에서 이 뷰포트로 간단히 드래그 앤 드롭하는 것입니다
여기서 앞서 보여드린 지구본의 3D 애셋을 사용합니다 3D 뷰포트는 매우 유용합니다 다양한 각도에서 3D 모델을 볼 수 있고 실제 객체와 일치하는지 확인할 수 있으니까요 오른쪽 아래에 표시된 크기가 물체의 실제 크기와 일치하는지 확인하는 것이 좋습니다
프로젝트에 추적할 객체를 여러 개 추가할 수 있습니다 앞서 보여드린 예시와 비슷하게 말이죠 왼쪽 메뉴에 있는 모델 소스 옆의 더하기 아이콘을 클릭하여 다른 USDZ 애셋을 가져올 수 있습니다 모델 학습을 시작하기 전에 물체에 가장 적합한 보기 각도를 선택하는 구성 단계를 수행해야 합니다 이렇게 하면 객체의 유형과 객체가 공간에 배치되는 방식에 따라 객체 추적 경험을 최적화할 수 있습니다 예를 들어 대부분의 정지된 객체는 수직 또는 정면 위치에서만 볼 수 있습니다 최고의 추적 품질을 얻기 위해 이 정보를 활용하여 머신 러닝 학습을 안내할 수 있습니다 세 개의 보기 각도 카테고리 중에서 선택할 수 있으며 All Angles, Upright, Front가 있습니다 각 요소를 자세히 알아보겠습니다 3D 뷰포트 바로 아래에서 보기 각도 항목을 확인할 수 있습니다 앞서 추가한 지구본 애셋에서 실제 물체를 살펴보죠 지구본은 스탠드에 고정되어 있으며 중력과 정렬되지 않은 축을 중심으로 회전할 수 있습니다 지구본을 모든 각도에서 볼 수 있기 때문에 구성 보기에서 All Angles’ 옵션을 선택합니다 이 옵션을 사용하는 경우 높은 추적 품질을 얻으려면 객체가 모든 뷰에서 뚜렷하고 고유한 모양을 가져야 한다는 점을 명심하세요 제 컬렉션의 다른 물체인 현미경을 살펴보겠습니다 중력 방향으로 표면 위에 위치할 테죠 이러한 이유로 저는 ‘Upright’ 설정을 선택하겠습니다 이 설정은 밑에서 보는 각도를 배제합니다 마지막으로 세 번째 물체인 오실로스코프를 살펴보죠 이 물체도 표면에 놓여 있을 것으로 예상되지만 후면 보기에서 추적될 필요는 없으므로 ‘Front’ 옵션을 선택하겠습니다 이 모드는 후면 및 하단 보기 각도를 제외하여 내 공간 경험에 중요한 것에만 객체 추적을 지원합니다
3D 뷰포트에는 접지 평면 및 후면 평면과 함께 3D 모델의 위쪽 및 앞쪽 방향을 가리키는 두 개의 축도 포함됩니다 3D 모델이 잘못된 방향으로 나타나는 경우 예를 들어 후면을 향하고 있다면 Reality Composer Pro를 사용하여 학습을 실행하기 전에 이를 수정할 수 있습니다 이제 구성이 완료되었으므로 학습을 시작할 준비가 되었습니다 프로젝트로 돌아가 왼쪽 상단에 있는 Train 버튼을 클릭하겠습니다 학습이 즉시 시작되며 진행 표시줄에서 프로젝트 상태를 추적할 수 있습니다 참조 객체를 학습시키려면 몇 시간이 걸릴 수 있습니다 정확한 진행 시간은 Mac 구성에 따라 다릅니다 또한 Apple Silicon 기반 Mac에서만 지원됩니다
학습이 완료되면 Output 탭으로 이동하여 결과 참조 객체를 저장할 수 있습니다
Xcode의 Developer Tools 메뉴에서 Create ML 앱을 볼 수 있습니다 Create ML은 다양한 작업에 사용할 수 있으며 객체 추적 외에 머신 모델의 학습에도 활용할 수 있습니다 Create ML에 관한 자세한 정보는 ‘Create ML의 새로운 기능’ 세션에서 확인하세요 이제 참조 객체에 가상 콘텐츠를 앵커링하는 단계로 넘어가겠습니다 추적된 객체로 몰입형 경험을 만드는 방법에는 여러 가지가 있습니다 Reality Composer Pro를 사용해 가상의 콘텐츠를 앵커링할 수 있고 새로운 RealityKit 및 ARKit API를 사용할 수 있습니다 저는 Reality Composer Pro로 제작 프로세스를 시작하고 싶습니다 가상 콘텐츠를 직관적으로 편집하고 배치할 수 있거든요
visionOS 앱 템플릿을 사용하여 새로운 Xcode 프로젝트부터 생성하겠습니다
이렇게 하면 기본 장면이 자동으로 생성되어 Reality Composer Pro에서 열 수 있죠 Reality Composer Pro로 전환합니다 동일한 기본 장면을 찾고 기본 구를 삭제하겠습니다
이 장면에서는 먼저 빈 Transform 엔티티를 생성하여 앵커링 구성요소를 추가합니다
이 엔티티는 객체 앵커의 컨테이너 역할을 합니다 객체를 쉽게 추적할 수 있도록 ‘Object’라는 이름의 대상이 새로 도입되었고 저는 이것을 선택하겠습니다
그런 다음 Create ML로 생성된 참조 객체를 가져옵니다 그리고 이 객체를 내 AnchoringComponent에 연결합니다
이 예에서는 Reality Composer Pro를 사용하지만 RealityKit API를 사용하여 런타임 시 AnchoringComponent를 생성할 수도 있다는 점을 알아두세요 계속 진행하겠습니다 기존 USDZ 모델의 반투명 시각적 신호가 뷰포트에 나타난 것을 확인할 수 있습니다 이는 특히 대상 객체의 특정 부분과 관련하여 콘텐츠를 정확하게 배치해야 할 때 유용합니다 제 지구본 경험에 사용된 장면을 살펴보겠습니다 이 예에서는 몰입감 넘치는 효과의 연출을 위해 어떻게 설정했는지 보여드리겠습니다
지구본에서 직접 발사된 우주 왕복선을 기억하시나요? 저는 특정 발사 위치를 선택했습니다 플로리다주의 케이프 커내버럴로 말이죠
뷰포트의 시각 신호를 사용하면 지구본에서 이 지점을 쉽게 찾아 우주 왕복선 엔티티를 설정할 수 있습니다 또 다른 몰입감 효과로 어떻게 가상의 달과 우주 정거장이 지구 주위를 돌면서 사라지게 만들었을까요? 지금 살펴보죠! 달과 우주 정류장에 타임라인 애니메이션을 사용하여 지구본의 주위를 공전하도록 합니다 장면에는 앵커 엔티티의 하위 노드로 연결된 별도의 USDZ 지구본 엔티티가 포함되어 있습니다 이는 장면에서 가리는 형태로 작용합니다 객체 추적은 상위 앵커 엔티티의 변환을 업데이트하므로 가리는 물체가 실제 지구본과 정렬되죠 이 부분을 완료하려면 ShaderGraph 편집기를 사용하여 USDZ 지구본 엔티티에 오클루전 소재를 적용할 수 있습니다 이렇게 하면 공전하는 객체가 지구본 엔티티 뒤로 이동하면 사라지게 됩니다
끝으로 이 오클루더 엔티티에 대한 탭 제스처를 추가하여 Behaviors 구성 요소를 사용해 두 경험 사이를 전환합니다 Apple Vision Pro에서 지금까지 빌드한 동작을 확인해 보겠습니다 탭하여 첫 번째 애니메이션을 재생하면 궤도를 선회하는 물체가 나타나고 이 물체들이 지구본 뒤로 사라집니다
멋지네요! 이제 두 번째 애니메이션입니다 다시 탭하면 예상대로 작동합니다 멋집니다, 하지만 제 앱에는 이 경험을 어떻게 시작해야 할지 안내하는 방법이 부족합니다 특히 처음 사용한다면 어떤 객체를 찾아야 하는지 알 수 없을 겁니다 이 문제를 개선하기 위해 앱에 코칭 UI를 추가하겠습니다 객체 추적에 의해 감지되는 지점까지 대상 객체의 미리보기를 표시하는 거죠 또한 지구본과 상호작용하는 방법을 설명하는 가상 레이블도 추가하겠습니다 RealityKit API는 이 작업을 비롯한 다양한 작업에 필요한 광범위한 도구 세트를 제공합니다 코칭 UI 구현 단계를 설명하겠습니다 먼저 3D 모델 미리보기를 표시하여 공간의 오른쪽 객체를 찾게 합니다 코칭 UI는 AnchorState의 변경 사항에 반응해야 하므로 코드에서 확인해야 합니다 객체가 추적되면 표시된 3D 모델이 AnchorEntity의 위치로 변환되는 전환을 보여 주고 싶습니다 그런 다음, 지구본을 탭해 시작하라는 지침이 포함된 가상 레이블을 추가하겠습니다 이 코드 샘플은 코칭 UI에서 대상 객체의 3D 모델을 표시하는 방법을 보여 줍니다 ARKit API의 도움을 받아 참조 객체 파일에서 검색하고 다른 모델 엔티티와 마찬가지로 USDZ 파일을 로드합니다 또한 미리보기 엔티티임을 나타내도록 불투명도를 50%로 설정했습니다 마지막으로 이것을 장면에 추가하여 표시합니다
객체가 추적되는지 확인하기 위해 먼저 이전에 Reality Composer Pro에서 생성한 객체의 앵커 엔티티를 찾아보겠습니다 그런 다음 업데이트 루프에서 엔티티의 isAnchored 플래그 상태를 확인하고 두 경우 모두 표시할 물체를 결정할 수 있습니다 전환 애니메이션의 경우 추적이 시작될 때 객체 미리보기가 추적된 객체의 위치 쪽으로 이동하도록 하고 싶습니다 그렇게 하려면 앵커의 변환 데이터를 가져와야 합니다 올바른 승인을 요청하기 위해 SpatialTrackingSession을 사용합니다 그러면 내 객체 앵커의 변환에 액세스할 수 있고 이를 사용하는 애니메이션을 구현할 수 있습니다
마지막으로 지구본 근처에 가상 레이블을 추가합니다 이 레이블은 경험을 시작하는 방법을 안내합니다 RealityView 첨부를 사용하여 RealityKit 앵커 엔티티에 SwiftUI 요소를 손쉽게 배치할 수 있습니다 먼저, RealView 내의 attachments 섹션에서 SwiftUI 요소를 정의합니다 그런 다음 장면 설정에서 이 UI 엔티티를 찾아서 앞서 Reality Composer Pro에서 정의한 참조 변환의 하위 노드로 추가할 수 있습니다 Apple Vision Pro에서 이 추가 기능을 확인해 보겠습니다 이번에는 지구본이 감지되기 전에 대상 객체의 미리보기를 표시하여 사용자가 무엇을 찾아야 하는지 알 수 있게 합니다 추적이 시작되면 이 미리보기가 대상 객체 쪽으로 이동하여 사용자의 시선을 유도합니다 경험 시작을 위한 가상 레이블도 볼 수 있습니다 좋습니다! 이제 예제를 마무리하겠습니다
올해에는 객체 추적을 위한 새로운 ARKit API도 출시됩니다 이전 섹션에서 설명한 대로 이 API는 추적된 객체의 바운딩 박스와 해당 USDZ 파일에 액세스할 수 있게 해줍니다 이 API는 객체의 추적 가능 시점 또는 문제가 있었는지 여부에 대한 상세한 정보를 제공하여 앱이 그러한 이벤트에 제어된 방식으로 반응하도록 할 수 있습니다 새로운 API와 함께 기기에 다운로드하여 사용해 볼 수 있는 객체 추적 샘플 앱도 공개됩니다 자세한 내용은 ‘ARKit으로 향상된 공간 컴퓨팅 경험 제작하기’ 세션에서 확인하세요 이제 visionOS에서 객체 추적을 위해 살펴봐야 할 내용을 모두 확인했습니다 객체 추적은 가상 콘텐츠를 실제 물체에 정확하게 배치해야 하는 공간 컴퓨팅에 관한 새로운 사용 사례의 가능성을 열어줍니다 지금 알려 드린 내용은 이 새로운 기술로 구현할 수 있는 일부 예시에 불과하며 더 많은 내용을 발견하실 수 있을 겁니다 Reality Composer Pro 및 RealityKit은 여기서 다룬 것 이상으로 멋진 공간 경험을 빌드할 수 있는 다양하고 흥미로운 기능을 제공합니다 자세한 내용을 보려면 이 세션을 확인하시기 바랍니다 여러분이 보여줄 아이디어와 생동감 넘치는 결과물이 무척 기대됩니다
-
-
13:55 - Coaching UI - display object USDZ preview
// Display object USDZ struct ImmersiveView: View { @State var globeAnchor: Entity? = nil var body: some View { RealityView { content in // Load the reference object with ARKit API let refObjURL = Bundle.main.url(forResource: "globe", withExtension: ".referenceobject") let refObject = try? await ReferenceObject(from: refObjURL!) // Load the model entity with USDZ path extracted from reference object let globePreviewEntity = try? await Entity.init(contentsOf: (refObject?.usdzFile)!) // Set opacity to 0.5 and add to scene globePreviewEntity!.components.set(OpacityComponent(opacity: 0.5)) content.add(globePreviewEntity!) } } }
-
14:13 - Coaching UI - check anchor state
// Check anchor state struct ImmersiveView: View { @State var globeAnchor: Entity? = nil var body: some View { RealityView { content in if let scene = try? await Entity(named: "Immersive", in: realityKitContentBundle) { globeAnchor = scene.findEntity(named: "GlobeAnchor") content.add(scene) } let updateSub = content.subscribe(to: SceneEvents.AnchoredStateChanged.self) { event in if let anchor = globeAnchor, event.anchor == anchor { if event.isAnchored { // Object anchor found, trigger transition animation } else { // Object anchor not found, display coaching UI } } } } } }
-
14:31 - Coaching UI - Transform space with SpatialSession
// Transform space struct ImmersiveView: View { @State var globeAnchor: Entity? = nil var body: some View { RealityView { content in // Setup anchor transform space for object and world anchor let trackingSession = SpatialTrackingSession() let config = SpatialTrackingSession.Configuration(tracking: [.object, .world]) if let result = await trackingSession.run(config) { if result.anchor.contains(.object) { // Tracking not authorized, adjust experience accordingly } } // Get tracked object's world transform, identity if tracking not authorized let objectTransform = globeAnchor?.transformMatrix(relativeTo: nil) // Implement animation ... } } }
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.