了解 ARKit 世界变换矩阵

Zac*_*ack 9 matrix augmented-reality scenekit swift arkit

在 中ARKit,当我执行命中测试时,我会返回一个ARHitTestResult. 这个的属性之一是worldTransform,我理解它包含对象位置的4x4变换矩阵 – simd_float4x4

作为对线性代数和 3D 图形非常不熟悉的人,我将如何编辑此矩阵以将其y坐标增加0.05

如果有博客文章或我可以查看的内容可以帮助我解决这个问题,请告诉我。我不确定我应该用谷歌搜索哪些术语。

对不起,如果我的问题充满了误解!您可能会说,我对这些概念不太熟悉。

感谢任何帮助的人。

Den*_*s L 11

编辑:最初的问题最好通过将 0.05 添加到节点的position. 但是,下面的原始答案确实解决了一些有关组合变换矩阵的问题,如果您对此感兴趣的话。

================================================== ====================

如果您想对矩阵应用运算,最直接的简单方法是创建一个执行该运算的矩阵,然后将原始矩阵乘以该新矩阵。

对于翻译,假设您想通过x, y,翻译z,您可以这样做:

let translation = simd_float4x4(
    float4(1, 0, 0, 0),
    float4(0, 1, 0, 0),
    float4(0, 0, 1, 0),
    float4(x, y, z, 1)
)
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个单位矩阵(沿对角线向下 1),最后一列(!!!重要的是,上面的 float4s 是 COLUMNS,而不是 ROWS,因为它们在视觉上看起来)设置为包含 x/y/z 值。您可以进一步研究齐次坐标,但可以将其视为平移的表示方式。

然后,在 simd 中,只需执行以下操作:let newWorldTransform = translation * oldWorldTransform您将通过 x/y/z 转换值转换旧世界变换(在您的示例中,[x, y, z] = [0, 0.05, 0])。

但是,可能值得探讨为什么要编辑命中测试结果。我想不出一个实际的用例,所以也许如果你解释一下你正在尝试做的事情,我可以建议一种更直观的方法来做到这一点。


ARG*_*Geo 5

3D 图形中的矩阵是平移、旋转、缩放和剪切 3D 对象的常规方法。在 ARKit、RealityKit 和 SceneKit 中,为了实现一致的线性变换,您需要使用simd_float4x4类似矩阵:

\n
var myMatrix: simd_float4x4\n
Run Code Online (Sandbox Code Playgroud)\n
\n
\n

翻译 4x4 矩阵在 \xe2\x80\x93 4 个元素 (float4) x 4 列中有 16 个元素。列索引为0123平移矩阵使用带有索引的第四列3

\n

在此输入图像描述

\n

场景工具包示例

\n

使用以下代码将模型放置25 cm在其默认位置之上SCNVector3(0,0,0)

\n
let sphereNode = SCNNode()\nsphereNode.geometry = SCNSphere(radius: 1.0)\nsphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red\nscene.rootNode.addChildNode(sphereNode)\n    \n\nvar translation = matrix_identity_float4x4\ntranslation.columns.3.y = 0.25\nsphereNode.simdWorldTransform = translation\n
Run Code Online (Sandbox Code Playgroud)\n

RealityKit 示例

\n
let model = ModelEntity(mesh: .generateBox(size: 0.3))\nlet anchor = AnchorEntity()\nanchor.addChild(model)\n\nlet currentMatrix = anchor.transform.matrix\nvar positionMatrix = simd_float4x4()\npositionMatrix.columns.3.y = 0.25\nlet transform = simd_mul(currentMatrix, positionMatrix)\nanchor.move(to: transform, relativeTo: model, duration: 1.0)\n
Run Code Online (Sandbox Code Playgroud)\n