gpt4 book ai didi

swift - ARKit 中的 sceneView.pointOfView.transform 和 ARCamera.transform 有什么区别?

转载 作者:行者123 更新时间:2023-12-04 17:24:05 35 4
gpt4 key购买 nike

我在相机几何方面有一定的背景,但我是 Swift 和 ARKit 开发的新手,我对可以返回的不同类型的变换矩阵有点困惑。

特别是,我遵循的一个教程让我将 ARSCNView 抓取为 sceneView,然后打印 sceneView.pointOfView .转换。这向我展示了我的预期:当 session 开始时,4x4 矩阵非常接近标识。

但是,当使用 ARCamera与每个 ARFrame 相关联,如以下代码片段所示:

extension ViewController: ARSessionDelegate {

func session(_ session: ARSession, didUpdate frame: ARFrame) {
print(frame.camera.transform.transpose)
}
}

我反而得到了一个看起来像的相机矩阵(注意转置是有目的的,因为我更熟悉行优先布局):

[0  1  0  0]
[-1 0 0 0]
[0 0 1 0]
[0 0 0 1]

我已经明确地尝试了 ARWorldAlignment .gravity.gravityAndHeading 的属性,但在 session 运行时都不会产生预期的单位矩阵。

我还添加了 .showWorldOrigin 调试选项,它显示了我所期望的世界轴:+X 在我的手机右侧,+Y 向上,-Z 向下 View 轴。

我在这里错过了什么?有人可以阐明 ARFrame 返回的变换的坐标系以及它们与 ARSCNView 的坐标系有何不同吗?

最佳答案

唯一的区别在于类型。单位矩阵在任何情况下都是相同的。

但是,旋转矩阵的逆是它的转置


SCNMatrix4

// SCNMatrix4 is a typealias of CATransform3D

@IBOutlet var sceneView: ARSCNView!

sceneView.pointOfView?.transform.m41 // camera position x
sceneView.pointOfView?.transform.m42 // camera position y
sceneView.pointOfView?.transform.m43 // camera position z

┌ ┐
| m11 m21 m31 m41 |
| m12 m22 m32 m42 |
| m13 m23 m33 m43 |
| m14 m24 m34 m44 |
└ ┘

float4x4 | simd_float4x4

@IBOutlet var arView: ARView!

arView.cameraTransform.matrix.columns.3.x // camera position x
arView.cameraTransform.matrix.columns.3.y // camera position y
arView.cameraTransform.matrix.columns.3.z // camera position z

// 0 1 2 3 indices
┌ ┐
| 1 0 0 x |
| 0 1 0 y |
| 0 0 1 z |
| 0 0 0 1 |
└ ┘

simd_float4x4

extension ViewController: ARSessionDelegate {

func session(_ session: ARSession, didUpdate frame: ARFrame) {

frame.camera.transform.columns.3.x // camera position x
frame.camera.transform.columns.3.y // camera position y
frame.camera.transform.columns.3.z // camera position z
}
}

┌ ┐
| 1 0 0 x |
| 0 1 0 y |
| 0 0 1 z |
| 0 0 0 1 |
└ ┘

但是,如果您打印 frame.camera.transform,您将获得列的水平表示:

//   1st column     2nd column     3rd column     4th column
([1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [x, y, z, 1])

关于swift - ARKit 中的 sceneView.pointOfView.transform 和 ARCamera.transform 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64525400/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com