如何使用 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]
注意:
LF
和 RT
的定义基于:https://github.com/ManuelTS/augmentedFaceMeshIndices
LF = 159
是包含左眼Vector3条件的索引
RT = 386
是包含右眼Vector3条件的索引
计算中心点(在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
}
运行时结果不正确。
- 实际距离:~20 cm
- 应用内距离:~3 cm
谁能告诉我问题出在哪里,甚至是另一种解决方案?
谢谢。
假设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 转换为另一个节点的局部坐标
我正在使用 ARCore + SceneKit(Swift
语言)来计算两只眼睛的中心点到相机的距离。
我确定相机坐标:
let cameraPos = sceneView.pointOfView?.position
左右眼坐标:
let buffer = face.mesh.vertices
let left = buffer[LF]
let right = buffer[RT]
注意:
LF
和 RT
的定义基于:https://github.com/ManuelTS/augmentedFaceMeshIndices
LF = 159
是包含左眼Vector3条件的索引RT = 386
是包含右眼Vector3条件的索引
计算中心点(在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
}
运行时结果不正确。
- 实际距离:~20 cm
- 应用内距离:~3 cm
谁能告诉我问题出在哪里,甚至是另一种解决方案? 谢谢。
假设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 转换为另一个节点的局部坐标