我想知道我的相机在ARKit中朝向哪个方向,以便我对面前物体的操作是正确的(说向左滑动向左移动(。
现在我已经尝试使用 POV 方向(不起作用,因为它总是正的(和节点方向(photo.worldFront.z - 除非应用旋转,否则这将起作用,一旦旋转超过 180 度,方向是错误的(。
有什么建议吗?
你先看pointOfView
是对的。
Hovewer 虽然rotation
和eulerAngles
都描述了相机面向的方向,但在处理物体(例如在您面前放置或移动物体(时,使用它们并不简单,这是相机的空间。
相反,请在世界空间中设置位置或移动矢量,然后使用相机的transform
将其转换为摄像机的空间。
在 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);