我正在尝试使用 ARCamera 矩阵在 ARkit/Scenekit 中将 3D 点转换为 2D。以前,我曾经projectpoint
得到投影的 x 和 y 坐标,它工作正常。但是,该应用程序的速度明显变慢,并且会因附加长录音而崩溃。
所以我转向另一种方法:使用 ARCamera 参数自己进行转换。projectionMatrix的 Apple 文档并没有提供太多帮助。所以我研究了关于投影矩阵的理论透视和正交投影矩阵和金属教程。据我了解,当我们有一个 3D 点 P=(x,y,z) 时,理论上我们应该能够像这样得到 2D 点:P'(2D)=P(3D)*projectionMatrix。
我假设情况会如此,所以我做了:
func session(_ session: ARSession, didUpdate frame: ARFrame) {
guard let arCamera = session.currentFrame?.camera else { return }
//intrinsics: a matrix that converts between the 2D camera plane and 3D world coordinate space.
//projectionMatrix: a transform matrix appropriate for rendering 3D content to match the image captured by the camera.
print("ARCamera ProjectionMatrix = \(arCamera.projectionMatrix)")
print("ARCamera Intrinsics = \(arCamera.intrinsics)")
}
我能够获得投影矩阵和内在函数(我什至厌倦了获得内在函数来查看它是否发生变化),但它们对于每一帧都是相同的。
ARCamera ProjectionMatrix = simd_float4x4([[1.774035, 0.0, 0.0, 0.0], [0.0, 2.36538, 0.0, 0.0], [-0.0011034012, 0.00073593855, -0.99999976, -1.0], [0.0, 0.0, -0.0009999998, 0.0]])
ARCamera Intrinsics = simd_float3x3([[1277.3052, 0.0, 0.0], [0.0, 1277.3052, 0.0], [720.29443, 539.8974, 1.0]])...
我不太确定我是否理解这里发生的事情,因为我期望每个帧的投影矩阵都不同。有人可以在这里用 scenekit/ARKit 中的投影矩阵解释这个理论并验证我的方法吗?我是在使用正确的矩阵还是在代码中遗漏了什么?
非常感谢您!