了解ARKit世界转换矩阵

时间:2018-09-08 02:44:33

标签: swift matrix scenekit augmented-reality arkit

ARKit中,当我执行一次命中测试时,我得到了ARHitTestResult的一个实例。其属性之一是worldTransform,据我所知,它包含对象位置4的{​​{1}} x 4变换矩阵。

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

如果有博客文章或我可以看的东西可以帮助我解决这个问题,请告诉我。我不确定应该使用哪些术语。

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

感谢所有提供帮助的人。

2 个答案:

答案 0 :(得分:3)

编辑:只需将0.05添加到节点position的y分量中,便可以很好地解决原始问题。但是,如果您对此感兴趣,那么下面的原始答案确实可以解决有关构成变换矩阵的问题。

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

如果要将运算应用于矩阵,最直接的简单方法是制作一个执行该运算的矩阵,然后将原始矩阵乘以该新矩阵。

对于翻译,假设您想按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),最后一列(!!!重要,上面的float4是COLUMNS,而不是像看起来那样是ROWS)设置为包含x / y / z值。您可以进一步研究同构坐标,但是可以将其视为翻译的表示形式。

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

但是,可能值得探索为什么要编辑命中测试结果。我想不出一个实际的用例,所以也许如果您对尝试做的事情进行更多的解释,我可能会建议一种更直观的方法。

答案 1 :(得分:0)

  

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

let matrix_identity_float4x4: simd_float4x4

4x4转换矩阵里面有16个元素– 4列中的4个元素( float4 )。列索引为0123。翻译矩阵使用索引为3的第四列。

enter image description here

示例:

使用以下代码将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

希望这会有所帮助。