swift - 将 ARFaceAnchor 从左手坐标系翻转到右手坐标系
问题描述
通过打印进行一些测试后faceAnchor.transform.columns.3
,挖掘 SO:ARFaceAnchor 有负 Z 位置?和 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)
}
}
但是,我使用 True Depth 相机打印faceAnchor.transform.columns.3
并获得了 z 负片。下面显示 x,y,z,w 轴:
有关如何校正 z 轴的任何建议?先感谢您
解决方案
首先,让我们看看默认矩阵值是什么。
单位矩阵
这是一个Identity 4x4 matrix
带有默认值的。
如果您需要有关4x4 matrices
阅读这篇文章的元素的更多信息。
// 0 1 2 3
┌ ┐
| 1 0 0 0 | x
| 0 1 0 0 | y
| 0 0 1 0 | z
| 0 0 0 1 |
└ ┘
位置镜像
要翻转实体的Z axis
and X axis
,以便将轴从人脸跟踪环境重新定向到世界跟踪环境,请使用以下形式的4x4 transform matrix
.
// 0 1 2 3
┌ ┐
| -1 0 0 0 | x
| 0 1 0 0 | y
| 0 0 -1 0 | z
| 0 0 0 1 |
└ ┘
旋转镜像
4x4 transform matrices
轮流是combination of scale and skew
一个。要选择右旋转的方向,顺时针 (CW) 或逆时针 (CCW) 使用+
或-
表达式cos
。
这是一个正 Z 旋转表达式 (CCW)。
正面+cos(a)
:
┌ ┐
| cos -sin 0 0 |
| sin cos 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
└ ┘
这是一个负 Z 旋转表达式 (CW)。
负面-cos(a)
:
┌ ┐
|-cos -sin 0 0 |
| sin -cos 0 0 |
| 0 0 1 0 |
| 0 0 0 1 |
└ ┘
推荐阅读
- mysql - 如何获取mysql中的数据是否相同?
- r - 在 R 中将 JSONL 文件转换为 CSV
- c++ - Clang根据什么发出“未使用的表达式结果”警告
- pandas - 一级中具有重复值的 pandas MultiIndex
- postgresql - 如何在 Postgres 中选择复制下的表或在 Postgres 中列出复制下的数据库
- python - Python 语句结构
- arrays - 从任意两个或多个连续自然数相乘形成的排序数组中找到第 N 个数
- python - 在python中存储crf Tagger
- c# - C# 控制台应用程序在一段时间后偶尔挂起?
- sublimetext3 - biblatex 引文问题“输入行 z 上未定义的页面 y 上的引文 x”