ARKit将物体放置在飞机上

sli*_*boy 6 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)
Run Code Online (Sandbox Code Playgroud)

他使用上面的代码将它放在你点击屏幕的位置

这是什么意思:

hitResult.worldTransform.columns.3.x
Run Code Online (Sandbox Code Playgroud)

为什么是columns.3而不是columns.0?

Tom*_*mmy 9

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
Run Code Online (Sandbox Code Playgroud)

(d, h, l)没有得到相乘,只是加在,好像他们是独立的载体.它与以下相同:

a b c         x         d
e f g    *    y    +    h
i j k         z         l
Run Code Online (Sandbox Code Playgroud)

因此,矩阵的左上角3x3部分可以执行某些操作(x, y, z)但不会移动它.例如,如果(x, y, z)(0, 0, 0)在开始那么它肯定仍然(0, 0, 0)在最后.所以3x3矩阵可能会旋转,缩放或做其他一些事情,但不能成为翻译.

(d, h, l)虽然,显然只是一个翻译,因为它只是你最后添加的东西.翻译就是你想要的 - 它是你从当前相机位置到达飞机的方式.所以你可以直接把它拉出来.