我正在通过 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?
最佳答案
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)
不过,这显然只是一种翻译,因为它只是您在最后添加的内容。平移就是您想要的——它是您从当前相机位置到达飞机的方式。所以你可以直接把它拉出来。
关于swift - ARKit 将对象放置在平面上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227414/