我正在Vision OS中开发一个示例应用程序,该应用程序可以在全沉浸式空间中加载城市的3D模型.

加载后,用户可以导航到城市的不同部分,例如走向建筑物或树木等.

我需要知道用户是否靠近特定建筑物;我需要在控制台中记录消息(例如"您已到达").

From the documentation and through How to know user's position in Surrounding Space in visionOS, I'm able to find the location of the device in 3D space, but how do I calculate distance b/w device and particular building in 3D space?

推荐答案

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()
        }
    }
}

Swift相关问答推荐

运行异步任务串行运行

为什么第二项任务不在第一项任务完成之前开始?(并发队列)

在SwiftUI中绘制形状的路径后填充形状

解码器是否需要具有密钥的外部数据表示?

SwiftUI 组合问题:通过 AppEventsManager 在 ViewModel 之间共享数据

Swift 运算符中 inout 的行为

Swift数据关系

本地对象的异步/等待引用捕获总是安全的还是理论上不安全?

如何在不将变量转换为字符串的情况下判断变量在 Swift 中是否为 Optional(nil)?

Swift 包管理器 Package.resolved 文件末尾的版本是什么意思?

如何判断一个值是否为 Int 类型

如何避免从模块导入函数

为什么 Apple Scrumdinger Sample App 使用两个事实来源?

RealityKit – 无法加载 ARView(发现为零)

Swift 2 或 3 中的 Google Analytics 问题

从 NSData 对象在 Swift 中创建一个数组

使用 ARAnchor 插入 node 和直接插入 node 有什么区别?

无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey

如何将应用程序与 iOS 联系人应用程序集成?

如何在 Swift 中从字符串创建类的实例