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

Posted

技术标签:

【中文标题】在 ARKit 中查找用户面向的方向【英文标题】:Finding the direction user facing in ARKit 【发布时间】:2017-08-14 01:43:51 【问题描述】:

我想知道我的相机在 ARKit 中朝向什么方向,这样我对我面前的物体的操作是正确的(比如向左滑动向左移动)。

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

有什么建议吗?

【问题讨论】:

【参考方案1】:

你先看pointOfView是对的。

尽管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);

将对象的位置设置为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 版本吗? @kelin 抱歉,我对 Swift 的经验为零。

以上是关于在 ARKit 中查找用户面向的方向的主要内容,如果未能解决你的问题,请参考以下文章

java学习与应用--面向对象

在 ARKit 中,将一个节点放在另一个具有相同方向的节点上

通过Swift设置ARKit方向

如何在 Unity C# 中检查对象是不是面向某个方向

聆听位置和方向的变化

通过 Swift 设置 ARKit 方向