swift - 在 ARKit 中查找用户面向的方向

标签 swift scenekit arkit

我想知道我的相机在 ARKit 中面向哪个方向,以便我对我面前的物体所做的操作是正确的(比如向左滑动向左移动)。

现在我尝试使用 POV 方向(不起作用,因为它始终为正)和节点方向(photo.worldFront.z - 这将起作用,除非应用旋转,一旦旋转超过 180 度,方向是错误的) .

有什么建议吗?

最佳答案

您是正确地首先查看 pointOfView

虽然 rotationeulerAngles 都描述了相机朝向的方向,但在处理对象时使用它们并不简单,例如在你面前放置或移动物体,这是相机的空间。

相反,在世界空间中设置您的位置或运动矢量,然后使用相机的变换将其转换到相机空间。

在 Obj-C 中它会像这样:

simd_float4x4 transform = self.sceneView.pointOfView.simdTransform;
simd_float4 myPosInWorldSpace = simd_make_float4(0.0, 0.0, -0.5, 1);
simd_float4 myPosInCamSpace = simd_mul(transform, myPosInWorldSpace);

将对象的位置设置为 myPosInCamSpace。上面的示例将对象放在相机空间中的 z=-0.5 处,在 AR 中它比相机提前半米。

已经在相机前面的物体向右移动 5 厘米,如下所示:

simd_float4x4 transform = self.sceneView.pointOfView.simdTransform;
transform.columns[3].xyz=0; //drop cam translation
simd_float4 myVecInWorldSpace = simd_make_float4(0.05, 0.0, 0.0, 1);
simd_float4 myVecInCamSpace = simd_mul(transform, myVecInWorldSpace);

myVecInCamSpace添加到您面前物体的位置。

第一修正案

如果您只需要 360°(−π, π] 的摄像机偏航来进行记录或其他操作:

simd_float4x4 transform = self.sceneView.pointOfView.simdTransform;
simd_float3 cam_right = transform.columns[0].xyz; //for completeness
simd_float3 cam_up = transform.columns[1].xyz;  //for completeness
simd_float3 cam_ahead = transform.columns[2].xyz;
float yaw = atan2f(cam_ahead.x, cam_ahead.z);

关于swift - 在 ARKit 中查找用户面向的方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45666439/

相关文章:

swift - parse.com 查询后从类中快速返回值

ios - 快速从 iOS 应用导出文件

ios - SCNNode Z轴旋转轴保持不变,而X轴和Y轴在节点旋转时发生变化

ios - ARCamera 变换 matrix_identity_float4x4 中的值代表什么?

ios - 使用 ARKit 中的 ARCamera 信息定位/旋转平面节点

iOS ARKit4 - 如何修复 ARCamera 的白平衡?

arrays - swift 错误 : Cannot convert value of type 'ArraySlice' to expected argument type

swift - ViewDidLoad() 中的导航栏高度未以编程方式更改?

swift - 是否可以在没有平面检测的情况下通过 HitTest 放置物体?

swift - 仅将一个轴的节点裁剪到相机