我正在从 ARKit 在线教程中学习如何将物体放置在飞机上。
boxNode.position = SCNVector3(hitResult.worldTransform.columns.3.x,hitResult.worldTransform.columns.3.y + Float(boxGeometry.height/2), hitResult.worldTransform.columns.3.z)
他使用上面的代码将其放置在屏幕上您点击的位置
这是什么意思:
hitResult.worldTransform.columns.3.x
例如为什么是 columns.3 而不是 columns.0?
2 回答
ARHitTestResult.worldTransform
的类型为matrix_float4x4
。所以它是一个 4x4 矩阵。.columns
从0
编号,因此向量(hitResult.worldTransform.columns.3.x, hitResult.worldTransform.columns.3.y, hitResult.worldTransform.columns.3.z)
是 4x4 向量最后一列顶部的三件事。您可以安全地假定矩阵的底行是
(0, 0, 0, 1)
,并且位置矢量的形式为(x, y, z, 1)
。因此,请看一下将矩阵应用于矢量时的作用:(d, h, l)
不会被相乘,只是像它们是单独的向量一样被相加。等同于:因此,矩阵的 top-left 3x3 部分可以对
(x, y, z)
进行某些操作,但不会移动它。 E.g。如果(x, y, z)
开头是(0, 0, 0)
,那么末尾肯定仍是(0, 0, 0)
。因此 3x3 矩阵可能会旋转,缩放或执行其他操作,但不能成为平移。不过
(d, h, l)
显然只是翻译,因为这只是您最后添加的内容。而平移就是您想要的-这就是您从当前相机位置到飞机的方式。因此,您可以直接将其拉出。这与 simdtransform 的布局方式有关。其中之一是旋转,一个是刻度,一个是平移。第 3 列与转换矩阵有关