了解 ARKit 世界变换矩阵
Understanding ARKit World Transform Matrices
在 ARKit
中,当我执行命中测试时,我得到了 ARHitTestResult
的一个实例。其中一个属性是 worldTransform
,据我所知,它包含一个对象位置的 4
x4
变换矩阵 – simd_float4x4
.
作为一个非常不熟悉线性代数和 3D 图形的人,我将如何编辑这个矩阵,比如说,将其 y
坐标增加 0.05
?
如果有博客 post 或我可以查看的内容可以帮助我解决这个问题,请告诉我。我不确定我应该搜索哪些术语。
对不起,如果我的问题充满了误解!你可能会说,我对这些概念不太熟悉。
感谢所有提供帮助的人。
编辑:最初的问题最好通过将 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 在对角线上),最后一列(!!!重要的是,上面的 float4s 是 COLUMNS,而不是 ROWS,因为它们在视觉上看起来)设置为包含 x/y/z 值。您可以进一步研究齐次坐标,但将其视为平移的表示方式。
然后,在 simd 中,只需执行以下操作:let newWorldTransform = translation * oldWorldTransform
,您将通过 x/y/z 翻译值(在您的示例中,[x, y, z] = [0, 0.05, 0]).
但是,可能值得探讨为什么要编辑命中测试结果。我想不出一个实际的用例,所以也许如果你多解释一下你想做什么,我可以建议一种更直观的方法。
Matrices in 3D computer graphics is a regular way to translate, rotate, scale and shear 3D objects. In ARKit and SceneKit for all such transformations you need to use matrix_identity_float4x4
global variable:
let matrix_identity_float4x4: simd_float4x4
平移 4x4 矩阵 内部有 16 个元素 – 4 个元素(float4
)4 列。列索引为 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
希望对您有所帮助。
在 ARKit
中,当我执行命中测试时,我得到了 ARHitTestResult
的一个实例。其中一个属性是 worldTransform
,据我所知,它包含一个对象位置的 4
x4
变换矩阵 – simd_float4x4
.
作为一个非常不熟悉线性代数和 3D 图形的人,我将如何编辑这个矩阵,比如说,将其 y
坐标增加 0.05
?
如果有博客 post 或我可以查看的内容可以帮助我解决这个问题,请告诉我。我不确定我应该搜索哪些术语。
对不起,如果我的问题充满了误解!你可能会说,我对这些概念不太熟悉。
感谢所有提供帮助的人。
编辑:最初的问题最好通过将 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 在对角线上),最后一列(!!!重要的是,上面的 float4s 是 COLUMNS,而不是 ROWS,因为它们在视觉上看起来)设置为包含 x/y/z 值。您可以进一步研究齐次坐标,但将其视为平移的表示方式。
然后,在 simd 中,只需执行以下操作:let newWorldTransform = translation * oldWorldTransform
,您将通过 x/y/z 翻译值(在您的示例中,[x, y, z] = [0, 0.05, 0]).
但是,可能值得探讨为什么要编辑命中测试结果。我想不出一个实际的用例,所以也许如果你多解释一下你想做什么,我可以建议一种更直观的方法。
Matrices in 3D computer graphics is a regular way to translate, rotate, scale and shear 3D objects. In ARKit and SceneKit for all such transformations you need to use
matrix_identity_float4x4
global variable:
let matrix_identity_float4x4: simd_float4x4
平移 4x4 矩阵 内部有 16 个元素 – 4 个元素(float4
)4 列。列索引为 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
希望对您有所帮助。