我正在 Vision OS 中开发一个示例应用程序,其中应用程序在完全沉浸式空间中加载城市的 3D 模型。
加载后,用户可以导航到城市的不同部分,例如走向建筑物或树木等。
我需要知道用户是否靠近特定建筑物,我需要在控制台中记录一条消息(例如 - 您已到达)
从文档中并通过链接(如何在visionOS中了解用户在周围空间中的位置),我能够找到设备在3D空间中的位置,但是如何计算设备与特定建筑物之间的黑白距离3D空间?
可以使用毕达哥拉斯定理计算 3D 空间中两个物体之间的距离,并考虑所有三个轴。使用公式:
d = √( (x2-x1)² + (y2-y1)² + (z2-z1)² )
这是代码:
import SwiftUI
import RealityKit
import ARKit
extension simd_float4 {
var xyz: simd_float3 {
return simd_float3(x, y, z)
}
}
@Observable class CameraAnchorUpdater {
let session = ARKitSession()
let worldTracking = WorldTrackingProvider()
func runSession() async {
Task {
try? await session.run([worldTracking])
}
}
func getMatrix() -> simd_float4x4 {
guard let mtx = worldTracking
.queryDeviceAnchor(atTimestamp: CACurrentMediaTime())
else { return .init() }
return mtx.originFromAnchorTransform
}
}
struct ContentView : View {
var cau = CameraAnchorUpdater()
let head = try! Entity.load(named: "head")
func updatingSceneEventsWith(_ content: RealityViewContent) {
_ = content.subscribe(to: SceneEvents.Update.self) { _ in
let cameraPosition = cau.getMatrix().columns.3.xyz
let x2 = cameraPosition.x // x2
let x1 = head.position.x // x1
let y2 = cameraPosition.y // y2
let y1 = head.position.y // y1
let z2 = cameraPosition.z // z2
let z1 = head.position.z // z1
let distance = sqrtf( (x2-x1) * (x2-x1) +
(y2-y1) * (y2-y1) +
(z2-z1) * (z2-z1) ) - 1.23
let formatted = String(format: "%.2f m", arguments: [distance])
print("Distance from camera to model is:", formatted)
}
}
var body: some View {
RealityView { content in
content.add(head)
updatingSceneEventsWith(content)
}
.task {
await cau.runSession()
}
}
}