Как можно закрепить модель над головой пользователя в 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
В бою. По крайней мере сейчас. Чтобы активировать мишень в виде головы человека (также известную какcamera
target в 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())