ARKit在平面上放置物体

7

我正在网上的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呢?

在其他行中,你能发布教程的链接吗? - Rahul Dess
2个回答

10
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)则显然只是一个平移,因为它只是在最后添加的一些内容。而平移正是你想要的——这是从当前相机位置到平面的方法。因此,您可以直接提取它。


Tommy,我知道这可能是老问题了,也许我没有理解到点子上(在看到类似的教程时曾经跌倒)。但是如果不检查向量,怎么知道需要第三列呢?这是否归结于OPENGL或其他3D引擎中构建这些向量的标准? - TommyBs

-2

这与simdtransform的布局有关。其中一个是旋转,一个是缩放,另一个是平移。第三列涉及平移矩阵。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接