在ARKit
中,当我执行一次命中测试时,我得到了ARHitTestResult
的一个实例。其属性之一是worldTransform
,据我所知,它包含对象位置4
的{{1}} x 4
变换矩阵。
作为一个非常不熟悉线性代数和3D图形的人,我将如何编辑该矩阵,例如将其simd_float4x4
坐标增加y
?
如果有博客文章或我可以看的东西可以帮助我解决这个问题,请告诉我。我不确定应该使用哪些术语。
对不起,如果我的问题充满误解!您可能会说,我对这些概念不太熟悉。
感谢所有提供帮助的人。
答案 0 :(得分:3)
编辑:只需将0.05添加到节点position
的y分量中,便可以很好地解决原始问题。但是,如果您对此感兴趣,那么下面的原始答案确实可以解决有关构成变换矩阵的问题。
================================================ ======================
如果要将运算应用于矩阵,最直接的简单方法是制作一个执行该运算的矩阵,然后将原始矩阵乘以该新矩阵。
对于翻译,假设您想按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)
)
请注意,这只是一个单位矩阵(对角线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
)。列索引为0
,1
,2
和3
。翻译矩阵使用索引为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
希望这会有所帮助。