如何解决获得 ARKit 或 RealityKit 相机旋转的最佳方法?
我正在用 Swift 编写并尝试获取 RealityKit 相机的旋转。 我已成功获得职位:
xsettings.xcam = arView.session.currentFrame?.camera.transform.columns.3.x ?? 0);
xsettings.ycam = arView.session.currentFrame?.camera.transform.columns.3.y ?? 0);
xsettings.zcam = arView.session.currentFrame?.camera.transform.columns.3.z ?? 0);
这非常有效,但我还没有找到似乎也有效的旋转解决方案。 目前我正在这样做:
xsettings.xcamrot = arView.session.currentFrame?.camera.eulerAngles[0] ?? 0;
xsettings.ycamrot = arView.session.currentFrame?.camera.eulerAngles[1] ?? 0;
xsettings.zcamrot = arView.session.currentFrame?.camera.eulerAngles[2] ?? 0;
但它似乎无法正常工作,滚动中有很多奇怪的地方(eulerAngles[2]),并且总体上有些不一致,至少与出色的定位相比。 只是想知道是否有更好的方法来访问相机的旋转?
解决方法
这并不奇怪。 ARKit 或 RealityKit 的相机的方向表示为滚动 (z
)、俯仰 (x
) 和偏航 (y
)。因此,您可以使用前面提到的表达式轻松获得正确的值:
arView.session.currentFrame?.camera.eulerAngles.x
arView.session.currentFrame?.camera.eulerAngles.y
arView.session.currentFrame?.camera.eulerAngles.z
However,the order of rotation is ZYX
。阅读它here。
还有几个关于下标和点符号的词。每两行相同:
DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) {
// Pitch
print(arView.session.currentFrame?.camera.eulerAngles[0]) // -0.6444593
print(arView.session.currentFrame?.camera.eulerAngles.x) // -0.6444593
// Yaw
print(arView.session.currentFrame?.camera.eulerAngles[1]) // -0.69380975
print(arView.session.currentFrame?.camera.eulerAngles.y) // -0.69380975
// Roll
print(arView.session.currentFrame?.camera.eulerAngles[2]) // -1.5064332
print(arView.session.currentFrame?.camera.eulerAngles.z) // -1.5064332
}
那是因为 ARView 相机的 eulerAngles
实例属性是 SIMD3<Float>
(又名 simd_float3
)类型,支持下标和点符号。
另一方面,ARSCNView pointOfView 的 eulerAngles
实例属性是 SCNVector3
类型,不支持下标但支持点表示法。
附言
您不需要(也不能)显式分配 a rotation order
,因为它是隐式内部旋转机制。
您最好将四元数用于旋转,这取决于您想对输出做什么。
您还可以使用 arView.cameraTransform
来获取相机的变换。从那里,可以从 arView.cameraTransform.translation.{x,y,z}
进行平移,并使用 arView.cameraTransform.rotation
进行四元数旋转。此处使用四元数的好处之一是您不会遇到旋转顺序问题。
如果您仍然想获得欧拉旋转,您可以随时使用 MDLTransform:MDLTransform(matrix: self.cameraTransform.matrix).rotation.{x,z}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。