了解 ARKit 世界变换矩阵

Posted

技术标签:

【中文标题】了解 ARKit 世界变换矩阵【英文标题】:Understanding ARKit World Transform Matrices 【发布时间】:2019-02-13 08:07:52 【问题描述】:

ARKit 中,当我执行命中测试时,我会返回一个ARHitTestResult 的实例。其中一个属性是worldTransform,据我了解,它包含对象位置的4x4 变换矩阵——simd_float4x4

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

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

对不起,如果我的问题充满了误解!正如您可能知道的那样,我对这些概念不太熟悉。

感谢所有提供帮助的人。

【问题讨论】:

你应该通过github.com/olucurious/Awesome-ARKit这个。它有很多例子。通过这个例子你可以清楚地了解 【参考方案1】:

编辑:最初的问题最好通过在节点position 的 y 分量上添加 0.05 来解决。但是,如果您对此感兴趣,下面的原始答案确实解决了一些关于组成转换矩阵的问题。

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

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

对于翻译,假设您要翻译xyz,您可以这样做:

let translation = simd_float4x4(
    float4(1, 0, 0, 0),
    float4(0, 1, 0, 0),
    float4(0, 0, 1, 0),
    float4(x, y, z, 1)
)

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

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

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

【讨论】:

我想这样做的原因是:我有一个我检测到的飞机,当用户点击飞机时,我希望一个对象出现在那里。如果我直接使用命中测试结果,对象会出现在平面的中间而不是坐在上面,所以我想将它向上移动。 哦,在这种情况下,最简单的方法可能是在平面中创建节点的position 值的 y 分量后添加 0.05。这行得通吗? 哦,是的,我没想到。我会回复你是否有效,谢谢。 谢谢,已经成功了!我已将您的答案标记为已接受,我认为编辑您的答案以引用 cmets 也是一个好主意。谢谢! 感谢@Zack,很高兴听到它奏效了。我继续并更新了我的答案以反映这一点。【参考方案2】:

3D 计算机图形中的矩阵是平移、旋转、缩放和剪切 3D 对象的常规方式。在 ARKit 和 SceneKit 中,您需要使用 matrix_identity_float4x4 全局变量进行所有此类转换:

let matrix_identity_float4x4: simd_float4x4

翻译 4x4 矩阵 内部有 16 个元素 - 4 个元素 (float4) 4 列。列索引为0123。平移矩阵使用索引为3 的第四列。

示例:

使用以下代码将您的 3D 对象 5cm 置于其默认位置上方 – SCNVector3(0,0,0)

let sphereNode = SCNNode()
sphereNode.geometry = SCNSphere(radius: 1.0)
sphereNode.geometry?.firstMaterial?.diffuse.contents = UIColor.red
scene.rootNode.addChildNode(sphereNode)
    

var translation = matrix_identity_float4x4
translation.columns.3.y = 0.05
sphereNode.simdWorldTransform = translation

希望这会有所帮助。

【讨论】:

我想知道为什么 4*4 矩阵使用最后一列值而不是最后一行进行翻译?如 3*3 矩阵的苹果文档示例所示,最后一行用于转换值。 developer.apple.com/documentation/accelerate/simd/… matrix_identity_float4x4 - 最后一行用于投影。

以上是关于了解 ARKit 世界变换矩阵的主要内容,如果未能解决你的问题,请参考以下文章

ARKit – 变换矩阵中的不同列代表啥?

翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)

翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)

[转]世界变换观察变换投影变换 矩阵

Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换

Cg入门10:Vertex Shader - 几何变换 —MVP矩阵变换