0

我正在尝试使用 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 中的投影矩阵解释这个理论并验证我的方法吗?我是在使用正确的矩阵还是在代码中遗漏了什么?

非常感谢您!

4

1 回答 1

1

您可能还需要使用相机的transform矩阵,因为当用户在现实世界的相机周围移动时,这就是帧之间的变化,并且虚拟相机的变换会更新以最好地匹配它。将其与投影矩阵组合在一起应该可以让您进入屏幕空间。

于 2020-08-08T19:48:03.060 回答