计算Vision OS相机与Vision OS中3D模型之间的距离

问题描述 投票:0回答:1

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

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

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

从文档中并通过链接(如何在visionOS中了解用户在周围空间中的位置),我能够找到设备在3D空间中的位置,但是如何计算设备与特定建筑物之间的黑白距离3D空间?

swiftui arkit realitykit visionos visionos-simulator
1个回答
0
投票

可以使用毕达哥拉斯定理计算 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()
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.