Как можно закрепить модель над головой пользователя в VisionOS?

Скажем, например, я хочу закрепить облако над головой пользователя.

я знаю этоAnchorEntityсуществует и что вы можете получить ссылку на голову пользователя с помощьюAnchorEntity(.head). Но как мне на самом деле его использовать? С этим кодом я вообще ничего не вижу.

      import SwiftUI
import RealityKit

struct CloudSpace: View {
    
    let headAnchor = AnchorEntity(.head)
    
    var body: some View {
        RealityView { content in
            async let cloud = ModelEntity(named: "Cloud")
            do {
                content.add(headAnchor)
                let cloud = try await cloud
                headAnchor.addChild(cloud)
            } catch {
                print(error)
            }
        }
    }
}

2 ответа

Привязка модели с помощью привязки головы в VisionOS

Для использования привязки вам понадобится настоящее устройство Vision Pro или SwiftUI Canvas (Cmd+Opt+ ). Симулятор Xcode 15 VisionOS не позволяет вам видетьAnchoringComponent.Target.headВ бою. По крайней мере сейчас. Чтобы активировать мишень в виде головы человека (также известную какcameratarget в iOS), попробуйте следующий код. Но учтите тот факт, чтоheadпо умолчанию якорь автоматически обновляется в каждом кадре – используйте.onceрежим отслеживания, чтобы изменить его.

      import SwiftUI
import RealityKit
import RealityKitContent

struct ContentView: View {
    var body: some View {
        VStack {
            RealityView { content in

                if let cloud = try? await Entity(named: "Scene",
                                                in: realityKitContentBundle) {

                    let anchor = AnchorEntity(.head)
                    anchor.anchoring.trackingMode = .once
                    cloud.setParent(anchor)
                    content.add(anchor)
    
                    cloud.transform.translation.y = 0.25
                    cloud.transform.translation.z = -1.0
                    anchor.name = "Head Anchor"
                    print(content)
                }
            }
        }
    }
}

Чтобы протестировать процесс привязки в симуляторе VisionOS, используйте привязку плоскости RealityKit:

      let anchor = AnchorEntity(.plane(.horizontal,
                           classification: .table,
                           minimumBounds: [0.12, 0.12]))

Если вы хотите просто получить положение головы, чтобы правильно разместить контент для тестирования, вы можете использоватьWorldTrackingProvider.queryPose(atTimestamp). Это даст вам преобразование устройства в указанный интервал времени.

Это будет означать настройку ARKitSession с WorldTracking. Согласно документации, это также «дорогая» операция , но она, по крайней мере, даст вам текущее местоположение головы:

let pose = worldInfo.queryPose(atTimestamp: CACurrentMediaTime())

https://developer.apple.com/documentation/visionos/tracking-points-in-world-space/#Track-the-device-position-in-the-world

Другие вопросы по тегам