我使用XCode级别编辑器设置了一个非常简单的场景。
正如您所看到的,其中一个1x5的矩形立方体已经旋转了90度。这是通过在节点检查器中将欧拉角属性的y属性设置为90来实现的。
但请注意,边界框不考虑长方体的旋转。当我在场景中遍历SCNNodes时也是如此。两个长方体都有相同的边界体积。for wall:SCNNode in walls.childNodes {
var v1 = SCNVector3Zero
var v2 = SCNVector3Zero
wall.getBoundingBoxMin(&v1, max:&v2)
print(v1, v2)
}
// Prints
// SCNVector3(x: -0.5, y: 0.0, z: -2.5) SCNVector3(x: 0.5, y: 0.5, z: 2.5)
// SCNVector3(x: -0.5, y: 0.0, z: -2.5) SCNVector3(x: 0.5, y: 0.5, z: 2.5)
因此,似乎使用子节点自己的坐标系计算Bounding Volume,而不是节点父级(或场景)的坐标系。这让我想知道; 我如何计算场景中SCNNode的Bounding Volume?
查看SCNNode文档,似乎所有信息都在那里。我可以读取eulerAngles,它给出了正确的绕y轴旋转。我可以读取transform属性。
我想我可以通过节点的变换矩阵来乘以向量,但变换矩阵(4x4)和边界框向量(1x3)似乎不兼容。SceneKit似乎也没有提供任何将变换矩阵应用于向量的方法。然而,我对几何学不太擅长,可能会错过一些明显的东西。