ARKit将物体放置在飞机上

时间:2017-07-21 01:08:23

标签: swift arkit

我正在通过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 个答案:

答案 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列涉及转换矩阵