通过旋转获取SCNNode的边界卷

时间:2016-01-16 20:20:06

标签: swift geometry scenekit

我使用XCode关卡编辑器设置了一个非常简单的场景。

enter image description here

如您所见,1x5矩形长方体中的一个已旋转了90º。这是通过在Node Inspector中将Euler Angles属性的y属性设置为90来实现的。

enter image description here

但请注意,边界框不考虑长方体的旋转。当我遍历场景中的SCNNodes时也是这种情况。两个长方体都具有相同的Bounding Volumne

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)

所以似乎使用子节点自己的坐标系计算边界体积,而不是节点父节点(或场景)坐标系。这让我感到疑惑;如何计算场景中的SCNNodes边界体积?

查看SCNNode的文档,似乎所有信息都在那里。我可以阅读eulerAngles,它给我围绕y轴的正确旋转。我可以阅读transform属性。

我认为我可以将矢量乘以节点变换矩阵,但变换矩阵(4x4)和边界框矢量(1x3)似乎不兼容。 SceneKit似乎也没有提供将变换矩阵应用于矢量的任何方法。但是,我对几何学并不是很好,所以我可能会遗漏一些明显的东西。

1 个答案:

答案 0 :(得分:3)

一些想法:

  1. 在Interface Builder中,如屏幕截图所示,有一个编辑空间属性,您可以将其设置为 World (而不是 Local

  2. 在代码中,您可以使用临时节点来计算边界框。确保只有一个子节点(要计算其边界框的节点),对该子节点应用任何转换,并向父节点询问其边界框。来自文档:

  3.   

    包含子节点的节点的边界体积是包含节点子节点的边界体积的最小体积。

    1. 获取节点的边界框,然后使用诸如-convertPosition:toNode:之类的工具来计算另一个坐标系中的边界框