
-
visionOS에서 공간 액세서리 입력 살펴보기
앱에서 공간 액세서리를 통합하는 방법을 알아보세요. visionOS에서의 향상된 가상 경험을 위해 가상 콘텐츠를 표시하고, 앱과 상호작용하며, 공간에서 액세서리를 추적하고, 상호작용에 대한 정보를 확인하세요.
챕터
- 0:00 - 시작
- 2:41 - 조각 앱 빌드하기
- 13:37 - ARKit으로 액세서리 추적하기
- 14:45 - 디자인 관련 고려 사항
리소스
관련 비디오
WWDC25
WWDC24
WWDC21
WWDC20
-
비디오 검색…
안녕하세요 저는 RealityKit 팀의 엔지니어 Amanda Han입니다 이 세션에서는 새 공간 액세서리 지원을 사용해 visionOS용 공간 조각 앱을 만드는 방법을 설명합니다 visionOS에는 강력한 눈 및 손 입력 패러다임이 있습니다 눈과 손만으로 Apple Vision Pro를 원활하게 조작할 수 있죠 Apple은 더 세밀한 제어, 버튼 입력, 햅틱 피드백을 실현하는 도구로 Vision Pro에서 빌드 가능한 경험을 확장하고 있습니다 올해는 공간 액세서리 지원이 추가됩니다 두 공간 액세서리가 새로 지원되는데요 PlayStation VR2 Sense 컨트롤러와 Logitech Muse입니다
PS VR 2 Sense 컨트롤러는 게임에 적합합니다 버튼, 조이스틱, 트리거가 있죠 탭 등 표준 제스처로 시스템을 탐색할 수도 있습니다
PS VR 2 Sense 컨트롤러는 공간에서 추적 가능하므로 Resolution Games의 Pickle Pro 같이 스포츠도 즐길 수 있습니다
또 다른 새 액세서리는 Logitech Muse입니다 Logitech Muse는 촉과 측면 버튼으로 다양한 입력이 가능한 힘 센서가 있습니다 강력한 햅틱 피드백도 제공합니다
정밀하므로 생산성 및 창작 앱 모두에 유용합니다 이것은 이 세션에서 예시로 빌드할 조각 앱입니다 옆에 사진 앱이 열려 있고요 전체 공간 및 공유 공간 앱에서 이러한 액세서리를 사용할 수 있죠 Apple Vision Pro의 카메라와 공간 액세서리의 센서를 조합해 이러한 공간 액세서리의 위치와 회전을 추적합니다 앱에서 촉각 햅틱 피드백을 사용하면 몰입도를 높일 수 있습니다 Game Controller 프레임워크로 공간 액세서리에 연결하고 RealityKit 또는 ARKit을 사용해 앵커 데이터에 접근합니다 오늘은 앱에서 공간 액세서리 입력을 사용하는 방법을 설명하죠 GameController, RealityKit 및 ARKit을 조합해 조각 앱을 빌드하겠습니다 ARKit을 직접 사용해 공간 액세서리를 추적하는 방법을 보고 디자인 고려 사항을 다룹니다
이제 조각 앱을 빌드하겠습니다 먼저 Xcode 프로젝트를 설정합니다
Game Controller 프레임워크로 공간 액세서리에 연결합니다 조각 도구를 가상으로 표시합니다 가상 점토를 조각하여 앱과 상호작용합니다 상호작용 데이터 추적에 기반해 반응형 도구 막대를 표시합니다 Xcode 설정부터 시작하죠
Game Controller 프레임워크로 액세서리와의 연결을 관리합니다 그래서 Xcode 기능 편집기로 plist에 공간 게임 컨트롤러 지원을 추가합니다 Spatial Gamepad(공간 게임패드)를 선택해 공간 액세서리 추적으로 게임 컨트롤러를 지원함을 표시합니다
앱의 plist에서 Accessory Tracking Usage의 설명 필드에 액세서리를 사용하는 방법을 설명하겠습니다
조각 앱에 대해 “가상 점토를 조각하기 위해 액세서리의 움직임을 추적”한다고 하겠습니다 사용자에게는 액세서리 추적을 허용하는 팝업으로 표시됩니다
이제 액세서리 중 하나를 추적해 보죠 공간 액세서리에는 관성 센서 데이터를 전송할 활성 연결이 필요하므로 조각 도구를 만들려면 이 연결을 찾아야 합니다
GameController 프레임워크로 공간 액세서리와의 연결을 찾습니다 연결 및 분리 이벤트를 수신하거나 현재 연결을 반복하죠 게임 컨트롤러에 대한 내용은 “가상 및 물리적 게임 컨트롤러 활용하기”를 시청하세요 Game Controller의 두 클래스가 공간 액세서리 추적이 가능합니다 GCController와 GCStylus입니다 각각 게임 컨트롤러와 스타일러스를 나타냅니다 둘 다 GCDevice 프로토콜을 준수합니다
일부 게임 컨트롤러, 스타일러스는 추적 기능을 지원하지 않습니다 조각 앱에서 지원 여부를 확인하는 방법을 알려 드리겠습니다 앱을 열었을 때 액세서리가 연결되어 있지 않을 수 있습니다 액세서리를 연결할 때를 수신해야 하죠 스타일러스의 경우 GCStylusDidConnect 알림을 수신하고 GCStylus를 잡습니다 GCStylus가 공간 액세서리 추적을 지원하는지 확인하기 위해 제품 카테고리가 Spatial Stylus가 되도록 합니다 앱이 실행되는 동안 액세서리가 분리될 수도 있습니다 분리 이벤트도 비슷한 방식으로 구현됩니다 GCController API를 사용하려면 GCStylus를 GCController로 교체하되 GCController의 제품 카테고리가 Spatial Controller인지 확인하죠 연결을 설정했지만 아직 액세서리에 표시 내용이 없습니다 끝에 가상 촉을 표시해 보겠습니다 visionOS에서는 공간에서 객체의 위치 및 방향을 추적하는 기술을 앵커링이라고 합니다 RealityKit, ARKit, 둘의 조합 중 무엇을 사용하든 전체 공간 및 공유 공간 앱에서 액세서리 앵커링이 가능합니다 이 조각 앱에서는 공유 공간을 사용하는데 Safari, 사진 등 다른 앱에서 조각용 참조 이미지를 가져오면 유용하기 때문입니다 개인정보 보호를 위해 현재 중점에 있고 승인된 앱만 액세서리 움직임을 추적할 수 있습니다
각 액세서리는 앵커링 위치 세트에 레이블을 지정합니다 PS VR 2 Sense 컨트롤러는 조준 그립, 그립 표면에 레이블을 지정합니다 Logitech Muse는 그립 위치를 빼고 조준 위치에만 레이블을 지정합니다 조각 앱은 각 공간 액세서리의 Aim에 앵커링합니다 RealityKit AnchorEntity를 사용해 가상 콘텐츠를 액세서리에 앵커링합니다 AnchorEntity는 가상 콘텐츠를 실제 세계에 연결하는 Entity입니다 RealityKit 장면의 다른 요소와 상호작용할 수 있습니다 코드로 앵커링을 살펴보겠습니다 공간 액세서리로 AccessoryAnchoringSource를 생성합니다
액세서리의 “aim” 위치를 대상으로 삼습니다 액세서리가 해당 위치를 지원하지 않으면 앵커링할 수 없습니다
`accessory` 대상, 해당 “aim” 위치, 예측 추적 모드를 이용해 AnchorEntity를 생성합니다
왼쪽에 AnchorEntity를 만들었습니다 예측 추적 모드는 정교한 모델을 사용해 콘텐츠가 렌더링될 때 액세서리의 위치를 예측합니다 하지만 갑자기 움직이면 움직임이 튈 수 있습니다 4번 프레임에서 보라색 예측 프레임이 회색 실제 위치와 일치하지 않습니다 렌더링과 저지연 상호작용에 이 모드를 사용하세요 더 정확해야 하면 연속 추적 모드를 사용하세요 지연 시간이 길지만 포즈가 더 정확하고 움직임이 튀지 않습니다 여기서는 예측 추적 모드로 반응성을 극대화하겠습니다 조각 앱에서 사용자가 손을 갑자기 움직이지는 않을 테니까요 이제 액세서리에 가상 촉이 추가되었습니다 괜찮아 보이지만 조각 도구가 앱의 타 기능과 상호작용하지 못합니다 액세서리의 위치를 기준으로 점토를 조각하고 햅틱 피드백을 제공하고 싶습니다 가상 점토를 조각하려면 조각 도구의 변형이 필요합니다 작년에 추가된 SpatialTrackingSession으로 구성된 대상 AnchorEntity 유형의 변환을 받을 수 있습니다 올해는 지원되는 SpatialTrackingSession 구성 목록에 .accessory가 추가되었습니다 Spatial Tracking Configuration에 .accessory를 추가하면 세션을 실행해 모든 액세서리 AnchorEntity의 변환을 가져올 수 있습니다 SpatialTrackingSession에 대한 자세한 내용은 Adrian의 “RealityKit으로 공간 드로잉 앱 빌드하기” 세션을 시청하세요 조각에 촉각적 느낌을 더해 보겠습니다 공간 액세서리에 가능한 햅틱은 훌륭한 피드백 메커니즘입니다 점토를 느낄 수 있도록 조각 앱에 추가하겠습니다 액세서리에서 햅틱을 가져와 햅틱 엔진을 만들고 시작합니다
햅틱 패턴 설정 등 햅틱에 대한 자세한 내용은 게임 컨트롤러의 발전 세션을 시청하세요 조각 도구로 점토에 조각을 하는 것을 살펴보겠습니다 액세서리가 점토 속으로 움직일 때마다 재료를 일부 없애고 햅틱을 재생해 몰입형 경험을 연출합니다 하지만 작품에서 재료를 너무 많이 없앨 경우도 있습니다 그래서 단계적 조각 모드를 추가해 보겠습니다 사용자와 액세서리의 상호작용에 따라 나타나며 조각 모드 간에 전환할 수 있는 도구 막대를 표시하겠습니다 액세서리를 든 손에 따라 액세서리 왼쪽이나 오른쪽에요 이때 ARKit AccessoryAnchor를 사용하면 됩니다 ARKit AccessoryAnchor는 네 가지 속성을 제공합니다 액세서리를 든 손을 말하는 손 방향 공간에서 액세서리의 상대적 모션 공간에서 상대적 회전 운동 그리고 추적 상태입니다 센서나 카메라의 적용 범위가 줄어들면 추적 품질이 떨어집니다
공간 액세서리를 사용한 현실 측정 등 특정 사용 사례의 경우 ARKit은 지표 앵커 변환을 수신할 수 있는 API도 제공합니다 자세한 내용은 문서의 “Coordinate spaces” API를 확인하세요 예를 다시 보죠 ARKit AccessoryAnchor에 접근해야 하는데 RealityKit AnchorEntity만 있습니다 올해 RealityKit에서는 RealityKit AnchorEntity로 ARKit 앵커를 얻을 수 있습니다 SpatialTrackingSession이 실행 중이고 구성되어 있다면 말입니다 RealityKit AnchorEntity로 ARKit AccessoryAnchor를 얻는 함수를 설정해 보겠습니다 AnchorEntity에 대한 ARKitAnchorComponent에 접근해 ARKitAnchor를 가져와서 조건부로 AccessoryAnchor에 캐스팅하면 됩니다 ARKitAnchorComponent에 대한 자세한 내용은 Laurence의 RealityKit의 새로운 기능 세션을 확인하세요
이제 도구 막대를 표시해 볼까요 방금 만든 헬퍼 함수를 사용해 AnchorEntity에서 액세서리 Anchor를 가져옵니다 손 방향을 사용해 도구 막대의 위치를 결정합니다 해당 속성은 액세서리 앵커의 보유 카이랄성에 저장됩니다
손 방향이 왼손이면 도구 막대를 양의 x로 표시하고 오른손이면 반대로 합니다 이외에는 액세서리가 손에 없으니 오프셋을 적용하지 않습니다
앱에서 반응형 도구 막대를 보겠습니다 오른손에 들고 버튼을 누르면 액세서리 왼쪽에 표시됩니다 단계적 모드로 전환해 아까의 실수 부분을 커버할 수 있습니다
이 정도면 되겠죠 요약해 보겠습니다 새로운 공간 액세서리 API로 몰입형 조각 앱을 만들었고요 GameController를 사용해 액세서리에 연결했습니다 그런 다음 RealityKit API를 사용해 조각 도구를 만들었습니다 그리고 RealityKit과 ARKit의 기능을 조합해 반응형 도구 막대를 표시했습니다 완성된 앱이 괜찮아 보이네요 하지만 ARKit으로 직접 작업하는 편이 좋거나 맞춤형 렌더링으로 앱을 빌드하는 경우 동등한 공간 액세서리 추적 기능을 확보할 수 있는 API가 있습니다 같이 살펴보겠습니다 액세서리 추적 제공자와 액세서리 앵커 업데이트로 ARKit의 액세서리 추적 요점을 정리해 보죠 GCStylus 또는 GCController를 사용해 Accessory를 만듭니다
Accessory 추적 제공자를 사용해 Accessory 객체를 추적합니다 액세서리가 앱에서 연결 또는 분리되면 매끄럽게 처리해야 합니다 즉 Accessory의 변경된 구성으로 ARKit 세션을 다시 실행해야 하죠
구현된 모습을 살펴보려면 ARKit 샘플 앱 “볼류메트릭 윈도우의 추적 액세서리”를 확인하세요 액세서리 앵커는 업데이트 패턴이 손 앵커와 비슷합니다 스트림으로 정확한 업데이트를 수신하거나 대화형 사용자 피드백을 위해 주문형 예측을 사용할 수 있습니다 ARKit 예측에 대한 자세한 내용은 “ARKit으로 향상된 공간 컴퓨팅 경험 제작하기”를 시청하세요 지금까지 멋진 공간 액세서리 API를 다수 살펴보았습니다 다음으로 앱을 빌드할 때의 디자인 고려 사항을 설명하죠 먼저 제스처를 사용해 UI와 상호작용하는 것을 알아보겠습니다 이미 제스처 대신 입력 방식으로 버튼, 트리거 같은 게임 컨트롤러 입력을 수신하도록 보기에 지시할 수 있는데요 이제 일반적인 손 제스처와 게임 컨트롤러 모두 보기의 입력으로 처리할 수 있죠
작동 방식을 코드로 볼까요 SwiftUI 보기에 게임 컨트롤러 이벤트를 수신하도록 지시합니다 그런 다음 .receivesEventsInView 수정자를 설정해 제스처 이벤트도 수신하도록 지시합니다
게임 컨트롤러에 공간 액세서리 추적 기능이 있으면 공간 이벤트 제스처에 채워진 게임 컨트롤러의 카이랄성 즉 손 방향이 있습니다
전체 공간에서 실행되는 앱의 경우 .persistentSystemOverlays API로 홈 표시기를 숨기고 .upperLimbVisibility API로 팔과 액세서리를 숨길 수 있습니다 이렇게 하면 앱과 게임의 몰입감을 더 향상할 수 있습니다 공간 액세서리로 앱 및 게임과 강력하고 새로운 방법으로 상호작용할 수 있으며 앱에서 최대한 많은 사용자를 지원하려면 공간 액세서리와 손 모두에 적응형 지원을 제공하세요
올해 ARKit의 기본 손 추적 속도가 더 빨라졌기 때문에 손과 눈을 입력으로 사용하면 더 효과적입니다
공간 액세서리 추적 기능이 있는 게임 컨트롤러를 지원함을 표시하려면 App Store에 “Spatial game controller support” 배지를 추가하세요 앱에 공간 액세서리 추적 기능이 있는 게임 컨트롤러가 필수라면 “Spatial game controller required” 배지를 표시하면 됩니다 문서에서 배지 표시를 위해 앱의 plist에 추가할 해당 키를 확인하세요 세션을 요약하겠습니다 공간 액세서리로 더 세밀한 입력 제어와 햅틱 피드백이 가능합니다 GameController, RealityKit 및 ARKit으로 액세서리를 통합할 수 있으며 앱을 디자인할 때는 손과 액세서리를 위한 적응형 지원을 염두에 두세요 공간 액세서리로 빌드할 수 있는 앱과 게임은 무궁무진합니다 여러분의 작품이 기대됩니다 WWDC25를 잘 즐기시기 바랍니다
-
-
0:09 - Get in-app transforms
// Get in-app transforms let session = SpatialTrackingSession() let configuration = SpatialTrackingSession.Configuration(tracking: [.accessory]) await session.run(configuration)
-
4:57 - Check for accessory support
// Check spatial accessory support NotificationCenter.default.addObserver(forName: NSNotification.Name.GCControllerDidConnect, object: nil, queue: nil) { notification in if let controller = notification.object as? GCController, controller.productCategory == GCProductCategorySpatialController { } }
-
7:20 - Anchor virtual content to an accessory
// Anchor virtual content to an accessory func setupSpatialAccessory(device: GCDevice) async throws { let source = try await AnchoringComponent.AccessoryAnchoringSource(device: device) guard let location = source.locationName(named: "aim") else { return } let sculptingEntity = AnchorEntity(.accessory(from: source, location: location), trackingMode: .predicted) }
-
9:45 - Add haptics to an accessory
// Add haptics to an accessory let stylus: GCStylus = ... guard let haptics = stylus.haptics else { return } guard let hapticsEngine: CHHapticEngine = haptics.createEngine(withLocality: .default) else { return } try? hapticsEngine.start()
-
11:25 - Access ARKit anchors from AnchorEntity
// Access ARKit anchors from AnchorEntity func getAccessoryAnchor(entity: AnchorEntity) -> AccessoryAnchor? { if let component = entity.components[ARKitAnchorComponent.self], let accessoryAnchor = component.anchor as? AccessoryAnchor { return accessoryAnchor } return nil }
-
-
- 0:00 - 시작
visionOS 개발에 대한 이 세션은 새로운 공간 액세서리 지원을 사용하여 공간 조각 앱을 생성하는 데 중점을 두고 있습니다. visionOS에서는 이제 PlayStation VR2 Sense 컨트롤러 및 Logitech Muse를 활용하여 앱을 구축함으로써 제어 기능과 몰입감을 향상시킬 수 있습니다. 버튼, 조이스틱, 트리거가 있는 PS VR2 Sense 컨트롤러는 게임과 탐색에 적합한 반면, 힘 센서와 햅틱 피드백이 특징인 Logitech Muse는 생산성과 창의성 앱에 도움이 됩니다. 이 세션은 새로운 공간 액세서리 지원을 사용하여 공간 조각 앱을 생성하는 데 중점을 두고 있습니다. visionOS에서는 이제 PlayStation VR2 Sense 컨트롤러 및 Logitech Muse를 활용하여 앱을 구축함으로써 제어 기능과 몰입감을 향상시킬 수 있습니다. 버튼, 조이스틱, 트리거가 있는 PS VR2 Sense 컨트롤러는 게임과 재미있는 인터랙티브형 경험에 적합한 반면, 힘 센서와 햅틱 피드백이 특징인 Logitech Muse는 생산성과 창의성 앱에 도움이 됩니다. Game Controller 프레임워크를 사용하여 이러한 액세서리를 연결하고 RealityKit 또는 ARKit을 활용하여 액세서리 움직임과 회전을 추적합니다. 이 세션은 조각 앱을 구축하는 방법을 보여주고 visionOS 전체 공간 및 공유 공간 앱에 공간 보조 입력을 통합하기 위한 디자인 고려 사항에 대해 살펴봅니다.
- 2:41 - 조각 앱 빌드하기
예제 프로젝트에서는 Xcode 프로젝트를 설정하고 plist 항목을 통해 공간 게임 컨트롤러 지원을 구성하여 조각 앱을 구축합니다. 그런 다음 Game Controller 프레임워크를 사용하여 공간 액세서리를 검색하고 연결합니다. 연결이 설정되면 앱은 RealityKit AnchorEntity를 사용하여 가상 콘텐츠를 액세서리의 ‘Aim’ 위치에 고정합니다. 이 고정 기술을 사용하면 공간에서 액세서리의 움직임을 정확하게 추적하는 가상 조각 툴을 표시할 수 있습니다. 앱은 또한 연결 및 연결 해제 이벤트를 처리하고 예측 추적 모드를 활용하여 가상 콘텐츠의 렌더링을 원활하게 함으로써 반응성이 뛰어나고 직관적인 조각 경험을 보장합니다. 가상 점토와의 상호작용을 활성화하려면 앱이 조각 툴의 변형에 액세스해야 합니다. 이는 이제 액세서리 추적을 지원하는 ‘SpatialTrackingSession’을 통해 달성되어 앱이 모든 액세서리 ‘AnchorEntity’의 변환을 확보할 수 있습니다. 다음으로, 프로젝트에서는 촉각적 피드백을 제공하는 햅틱 기술을 추가하여 몰입감 높은 조각 경험을 만듭니다. 앱은 ARKit의 ‘AccessoryAnchor’를 사용하여 어느 손이 액세서리를 잡고 있는지 확인할 수 있는데, 이는 상대적 움직임과 추적 상태에 대한 정보도 제공합니다. RealityKit 및 ARKit API를 결합하면 앱은 사용자 손의 방향에 따라 반응형 툴바를 표시하여 사용자가 조각 모드를 전환할 수 있도록 합니다. 이를 통해 사용자 경험이 향상되고 조각 과정을 정확하게 제어할 수 있습니다.
- 13:37 - ARKit으로 액세서리 추적하기
자체 렌더링을 사용하여 앱을 생성하는 경우 ARKit은 ‘GCStylus’ 및 ‘GCController’와 같은 공간 액세서리를 추적하는 API를 제공합니다. Accessory 추적 제공자를 사용해 Accessory 객체를 생성하고 관리합니다. 액세서리를 연결하고 분리하면 새로운 액세서리 구성으로 ARKit 세션을 재실행합니다. 액세서리 앵커는 핸드 앵커와 유사한 업데이트를 제공합니다. 바로 스트리밍된 정확한 업데이트 또는 인터랙티브형 피드백을 위한 주문형 예측 중에서 선택할 수 있습니다.
- 14:45 - 디자인 관련 고려 사항
사용자의 손쉬운 사용을 극대화하기 위해 손과 공간 액세서리에 대한 적응형 지원이 권장됩니다. ARKit을 사용하면 이제 게임 컨트롤러와 공간 액세서리를 통합하여 입력 제어 기능을 강화할 수 있고 SwiftUI 뷰에서는 햅틱 피드백을 사용할 수 있습니다. ‘receivesEventsInView’ 수정자를 사용하면 표준 손 제스처와 게임 컨트롤러 이벤트를 모두 처리할 수 있습니다. App Store 배지를 표시하면 공간 게임 컨트롤러에 대한 지원을 나타낼 수 있습니다. 전체 공간 앱의 경우, 홈 표시기와 위쪽 팔을 숨겨 몰입감을 높이는 API를 사용할 수 있습니다.