了解 ARKit 世界变换矩阵
Posted
技术标签:
【中文标题】了解 ARKit 世界变换矩阵【英文标题】:Understanding ARKit World Transform Matrices 【发布时间】:2019-02-13 08:07:52 【问题描述】:在ARKit
中,当我执行命中测试时,我会返回一个ARHitTestResult
的实例。其中一个属性是worldTransform
,据我了解,它包含对象位置的4
x4
变换矩阵——simd_float4x4
。
作为一个非常不熟悉线性代数和 3D 图形的人,我该如何编辑这个矩阵,例如,将其 y
坐标增加 0.05
?
如果有博客文章或我可以查看的内容可以帮助我解决这个问题,请告诉我。我不确定我应该在谷歌上搜索哪些术语。
对不起,如果我的问题充满了误解!正如您可能知道的那样,我对这些概念不太熟悉。
感谢所有提供帮助的人。
【问题讨论】:
你应该通过github.com/olucurious/Awesome-ARKit这个。它有很多例子。通过这个例子你可以清楚地了解 【参考方案1】:编辑:最初的问题最好通过在节点position
的 y 分量上添加 0.05 来解决。但是,如果您对此感兴趣,下面的原始答案确实解决了一些关于组成转换矩阵的问题。
================================================ ========================
如果您想对矩阵应用运算,最直接简单的方法是创建一个执行该运算的矩阵,然后将原始矩阵乘以该新矩阵。
对于翻译,假设您要翻译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])。
但是,可能值得探讨一下您为什么要编辑命中测试结果。我想不出一个实际的用例,所以如果你解释一下你想要做什么,我可以建议一种更直观的方法。
【讨论】:
我想这样做的原因是:我有一个我检测到的飞机,当用户点击飞机时,我希望一个对象出现在那里。如果我直接使用命中测试结果,对象会出现在平面的中间而不是坐在上面,所以我想将它向上移动。 哦,在这种情况下,最简单的方法可能是在平面中创建节点的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 列。列索引为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
希望这会有所帮助。
【讨论】:
我想知道为什么 4*4 矩阵使用最后一列值而不是最后一行进行翻译?如 3*3 矩阵的苹果文档示例所示,最后一行用于转换值。 developer.apple.com/documentation/accelerate/simd/… 在matrix_identity_float4x4
- 最后一行用于投影。以上是关于了解 ARKit 世界变换矩阵的主要内容,如果未能解决你的问题,请参考以下文章
翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)
翻译我的OpenGL学习进阶之旅世界(World)视图(View)和投影变换矩阵(Projection Transformation Matrices)