在 ARKit 中寻找用户面对的方向

Lim*_*ean 2 scenekit swift arkit

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

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

有什么建议?

div*_*aki 5

你一开始是对的pointOfView

Hovewer同时rotationeulerAngles两个描述相机正面临着什么方向,什么时候是不能直接使用它们工作对象,如放置或在移动的物体你面前的是相机的空间。

相反,在世界空间中设置您的位置或运动向量,然后使用相机的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);
Run Code Online (Sandbox Code Playgroud)

将对象的位置设置为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);
Run Code Online (Sandbox Code Playgroud)

添加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);
Run Code Online (Sandbox Code Playgroud)