【问题标题】:ARKit placing objct on a planeARKit 将物体放置在平面上
【发布时间】:2017-07-21 10:55:53
【问题描述】:

我正在学习有关 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?

【问题讨论】:

  • 另外几行,可以发一下教程的链接吗?

标签: swift arkit


【解决方案1】:

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) 不过,显然只是一个翻译,因为它只是你最后添加的东西。翻译就是你想要的——它是你从当前相机位置到达飞机的方式。所以你可以直接把它拉出来。

【讨论】:

  • Tommy 我知道这很老,也许我没有抓住重点(偶然发现了一个类似的教程)。但是如果不检查向量,人们怎么知道它是您需要的第 3 列?在 OPENGL 或其他 3d 引擎中如何构建这些向量是否归结为一个标准?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-04-03
    • 2018-03-21
    • 1970-01-01
    • 2017-11-20
    • 2018-01-11
    • 2018-02-15
    • 2018-01-14
    • 2017-12-07
    • 1970-01-01
    相关资源
    最近更新 更多