如何使用 ARCore + SceneKit 计算两眼中心点到相机的距离?

How to calculate distance from the centering point between two eyes to the camera using ARCore + SceneKit?

我正在使用 ARCore + SceneKit(Swift 语言)来计算两只眼睛的中心点到相机的距离。

我确定相机坐标:

let cameraPos = sceneView.pointOfView?.position

左右眼坐标:

let buffer = face.mesh.vertices
let left   = buffer[LF]
let right  = buffer[RT]

注意:

LFRT 的定义基于:https://github.com/ManuelTS/augmentedFaceMeshIndices

计算中心点(在SCNVector3):

let center = SCNVector3(x: (left.x - right.x) * 0.5,
                        y: (left.y - right.y) * 0.5,
                        z: (left.z - right.z) * 0.5)

最后,我计算距离:

let distance = distance(start: cameraPos!, end: center)

distance 定义为:

func distance(start: SCNVector3, end: SCNVector3) -> Float {
  let dx = start.x - end.x
  let dy = start.y - end.y
  let dz = start.z - end.z

  let distance = sqrt(dx * dx + dy * dy + dz * dz)

  return round(distance * 100 * 10) / 10.0
}

运行时结果不正确。

谁能告诉我问题出在哪里,甚至是另一种解决方案? 谢谢。

假设center是两眼之间的中点,那么公式不应该是:

中点: (x1, y1, z1) 和 (x2, y2, z2) 是 (x1+x2 )/2,(y1+y2)/2,(z1+z2)/2.

编辑:在这里进行猜测,但是...

示例:为了使弹丸实际上从带有长管炮的炮塔发射,正好在发射时炮管旋转到的位置,您必须计算管末端的相关位置到桶连接到的节点的位置,否则射击看起来不像是来自正确的位置。

需要一点想象力,但这是你的脸在四处移动=炮塔在四处移动。我“认为”这就是你的数学正在发生的事情。我不认为你得到了正确的 LF/RF 位置,因为你没有提到转换点。您发送的 link [面部网格由构成面部的数百个顶点组成,并且是相对于中心姿势定义的。] 相对于中心姿势 - 我很确定这意味着您必须转换LF相对于中心得到真实位置。

// 像这样转换位置:

    let REAL_LF = gNodes.gameNodes.convertPosition(LF.presentation.position, from: POSE_POSITION)

convertPosition(_:to:) 将位置从节点的局部坐标 space 转换为另一个节点的局部坐标