ARKit 将对象放置在平面上
ARKit placing objct on a plane
我正在通过 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?
这与 simdtransform 的布局方式有关。其中之一是旋转,一个是缩放,一个是平移。第 3 列属于翻译矩阵
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)
不过,显然只是翻译,因为它只是您在最后添加的内容。平移就是您想要的——它是您从当前相机位置到达飞机的方式。所以直接拉出来就可以了
我正在通过 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?
这与 simdtransform 的布局方式有关。其中之一是旋转,一个是缩放,一个是平移。第 3 列属于翻译矩阵
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)
不过,显然只是翻译,因为它只是您在最后添加的内容。平移就是您想要的——它是您从当前相机位置到达飞机的方式。所以直接拉出来就可以了