swift - ARKit 将对象放置在平面上

标签 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?

最佳答案

ARHitTestResult.worldTransformmatrix_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

因此,矩阵左上角的 3x3 部分对 (x, y, z) 做了一些操作,但没有移动它。例如。如果 (x, y, z) 在开始时是 (0, 0, 0) 那么它肯定仍然是 (0, 0, 0) 最后。所以 3x3 矩阵可能会旋转、缩放或做很多其他事情,但不能是平移。

(d, h, l) 不过,这显然只是一种翻译,因为它只是您在最后添加的内容。平移就是您想要的——它是您从当前相机位置到达飞机的方式。所以你可以直接把它拉出来。

关于swift - ARKit 将对象放置在平面上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45227414/

相关文章:

performance - Swift 是唯一具有溢出检查算法的(主流)语言吗?

ios - 翠鸟图像渲染回收单元

swift - 如何解决 'Cannot assign value of type ' CATextLayerAlignmentMode' 以键入 'String' ?

swift - SpriteKit - 暂停输入

ios - 有没有更好的方法来展平 NSDictionaries 的 NSArray?

swift - Swift 中的枚举滑动

swift - 在 ARKit 中查找用户面向的方向

来自 ARKit 深度缓冲区的 SceneKit 点云

ios - 无法在 SceneKit 中加载纹理

swift - ARKit – 使用 CALayer 在 SCNNode 中加载 GIF 图像无法正确渲染