Я использую WorldTrackingProvider в приложении VisionOS.
let session = ARKitSession()
let worldInfo = WorldTrackingProvider()
...
try? await session.run([worldInfo])
чтобы я мог запросить положение устройства с помощью queryDeviceAnchor в каждом кадре:
guard let pose = worldInfo.queryDeviceAnchor(atTimestamp: CACurrentMediaTime()) else {
return
}
let toDeviceTransform = pose.originFromAnchorTransform
let devicePosition = toDeviceTransform.translation
Это отлично работает, но я понимаю, что не понимаю, какой момент на самом устройстве это соответствует стереоустройству. Левый глаз, средний глаз, между двумя глазами? Я предполагаю, что средний глаз и камеры смещены от него для стерео. Кто-нибудь знает?
Я считаю, что AnchorEntity(.head)
, как и DeviceAnchor
, привязаны к одной и той же точке — к середине воображаемой линии между левой и правой основными камерами. Если вы прикрепите 1-cm-sphere
к якорю головы, в симуляторе VisionOS он будет виден вам только на расстоянии 14+ см от камер (не знаю, какое расстояние для реального устройства).
RealityView { rvc in
let sphere = ModelEntity(mesh: .generateSphere(radius: 0.005))
sphere.position.z = -0.15
let anchor = AnchorEntity(.head)
anchor.addChild(sphere)
rvc.add(anchor)
}
Аналогичная картина поведения наблюдается и при работе с ARFaceAnchor — отслеживание лица начинает работать только в том случае, если расстояние от селфи-камеры до лица пользователя составляет не менее 10+ см. Это происходит за счет фокусировки ИК-точек датчика TrueDepth. В случае с симулятором VisionOS объект блокируется искусственно, возможно, с помощью OcclusionMaterial или свойства opacity
.
Кстати, при работе со стереоскопическими изображениями или с пространственными изображениями (также известными как Multiview HEVC) мне кажется, что расположение привязки должно быть именно там, где оно есть — посередине вышеупомянутой воображаемой линии. Это становится логичным, когда вы начинаете контролировать disparity
.
Я заметил, что если я отрегулирую сообщаемое положение привязки устройства на 3 см (y — 0,03), то получу лучшее представление о том, где находится «средний глаз» (примерно на 3 см выше аннотированной точки на изображении).