【发布时间】:2020-11-11 08:03:09
【问题描述】:
通过打印faceAnchor.transform.columns.3 进行一些测试后,挖掘SO:ARFaceAnchor have negative Z position? 和Apple 的文档:ARFaceAnchor,我意识到z 轴实际上是翻转的,它不是文档中的右手坐标系. ARFaceAnchor 声明坐标:
x 正方向指向观察者的右侧(即人脸自身的左侧),y 正方向指向上方(相对于人脸本身,而不是世界),z 正方向指向从面对(朝向观察者)
Sarasvati 提出了关于进行改造的建议:
func faceAnchorPoseToRHS(_ mat: float4x4) -> float4x4 {
let correctedPos = float4(x: mat.columns.3.x, y: mat.columns.3.y, z: -mat.columns.3.z, w: 1)
let quat = simd_quatf(mat)
let newQuat = simd_quatf(angle: -quat.angle, axis: float3(quat.axis.x, quat.axis.y, -quat.axis.z))
var newPose = float4x4(newQuat)
newPose.columns.3 = correctedPos
return newPose
}
基于 Andy Fedoroff 的更新:
extension ViewController: ARSCNViewDelegate {
func renderer(_ renderer: SCNSceneRenderer, didAdd node: SCNNode, for anchor: ARAnchor) {
guard let faceAnchor = anchor as? ARFaceAnchor else { return }
currentFaceAnchor = faceAnchor
if node.childNodes.isEmpty, let contentNode = selectedContentController.renderer(renderer, nodeFor: faceAnchor) {
node.addChildNode(contentNode)
}
selectedContentController.session = sceneView?.session
selectedContentController.sceneView = sceneView
}
/// - Tag: ARFaceGeometryUpdate
func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
guard anchor == currentFaceAnchor,
let contentNode = selectedContentController.contentNode,
contentNode.parent == node
else { return }
sceneView.session.currentFrame!.anchors.first!.transform
print(currentFaceAnchor!.transform.columns.3)
selectedContentController.session = sceneView?.session
selectedContentController.sceneView = sceneView
selectedContentController.renderer(renderer, didUpdate: contentNode, for: anchor)
}
}
但是,我打印了faceAnchor.transform.columns.3 并使用 True Depth 相机获得了 z 负片。下图显示 x,y,z,w 轴:
关于如何校正 z 轴的任何建议?提前谢谢你
【问题讨论】:
标签: swift xcode augmented-reality scenekit arkit