首页 文章

ARKit 将 objct 放置在平面上

提问于
浏览
6

我正在从 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 回答

  • 8

    ARHitTestResult.worldTransform的类型为matrix_float4x4。所以它是一个 4x4 矩阵。 .columns0编号,因此向量(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
    

    因此,矩阵的 top-left 3x3 部分可以对(x, y, z)进行某些操作,但不会移动它。 E.g。如果(x, y, z)开头是(0, 0, 0),那么末尾肯定仍是(0, 0, 0)。因此 3x3 矩阵可能会旋转,缩放或执行其他操作,但不能成为平移。

    不过(d, h, l)显然只是翻译,因为这只是您最后添加的内容。而平移就是您想要的-这就是您从当前相机位置到飞机的方式。因此,您可以直接将其拉出。

  • -2

    这与 simdtransform 的布局方式有关。其中之一是旋转,一个是刻度,一个是平移。第 3 列与转换矩阵有关

相关问题