我正在通过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,例如?
答案 0 :(得分:8)
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)
。那么请看一下矩阵在应用于矢量时的作用:
a b c d x a*x + b*y + c*z + d
e f g h y e*x + f*y + g*z + h
i j k l * z = i*x + j*y + k*z + l
0 0 0 1 1 1
(d, h, l)
不会成倍增加,只是作为一个单独的向量添加。它与:
a b c x d
e f g * y + h
i j k z l
因此,矩阵的左上角3x3部分会对(x, y, z)
执行某些操作,但不会移动它。例如。如果(x, y, z)
在开始时为(0, 0, 0)
,那么它最终仍然是(0, 0, 0)
。所以3x3矩阵可能会旋转,缩放或做其他一些事情,但不能成为翻译。
(d, h, l)
但显然只是一种翻译,因为它只是你最后添加的东西。翻译就是你想要的 - 它是你从当前相机位置到达飞机的方式。所以你可以直接把它拉出来。
答案 1 :(得分:-2)
这与simdtransform的布局有关。其中一个是旋转,一个是刻度,一个是平移。第3列涉及转换矩阵