ARKit 将对象放置在平面上

ARKit placing objct on a plane

我正在通过 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?

这与 simdtransform 的布局方式有关。其中之一是旋转,一个是缩放,一个是平移。第 3 列属于翻译矩阵

ARHitTestResult.worldTransformmatrix_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) 不过,显然只是翻译,因为它只是您在最后添加的内容。平移就是您想要的——它是您从当前相机位置到达飞机的方式。所以直接拉出来就可以了