Swift 获取SCNNode';s带旋转的边界体积

Swift 获取SCNNode';s带旋转的边界体积,swift,geometry,scenekit,Swift,Geometry,Scenekit,我使用XCode级别编辑器设置了一个非常简单的场景 如您所见,其中一个1x5矩形长方体已旋转90º。这是通过在节点检查器中将“Euler Angles”特性的y属性设置为90实现的 但是请注意,边界框不考虑长方体旋转。当我迭代场景中的SCNNodes时也是如此。两个长方体具有相同的边界体积 for wall:SCNNode in walls.childNodes { var v1 = SCNVector3Zero var v2 = SCNVector3Zero wal

我使用XCode级别编辑器设置了一个非常简单的场景

如您所见,其中一个1x5矩形长方体已旋转90º。这是通过在节点检查器中将“Euler Angles”特性的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)
因此,边界体积似乎是使用子节点自己的坐标系计算的,而不是使用节点父节点(或场景)的坐标系。这让我感到疑惑;如何计算场景中的SCNNodes边界体积

查看SCNNode的文档,似乎所有的信息都在那里。我可以读取
eulerAngles
,它使我能够绕y轴正确旋转。我可以读取
转换
属性

我想我可以用节点变换矩阵乘以向量,但变换矩阵(4x4)和边界框向量(1x3)似乎不兼容。SceneKit似乎也没有提供任何将变换矩阵应用于向量的方法。然而,我对几何不是很在行,所以我可能会错过一些明显的东西

一些想法:

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

  • 在代码中,可以使用临时节点来计算边界框。确保只有一个子节点(要计算其边界框的节点),在该子节点上应用任何变换,并向父节点请求其边界框。从文件中:

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

  • 获取节点的边界框,然后使用UTIL,例如
    -convertPosition:toNode:
    来计算其他节点坐标系中的边界框

  • 谢谢第1点-在“世界”模式下,我不必选择调整旋转。我不认为第三点是正确的。它不考虑旋转。我使用了数字2的变体-我的所有墙节点都是墙(复数)节点的子节点。所以我遍历所有的子对象,将它们的隐藏属性设置为true。然后我再次迭代子对象,但这次将hidden设置为false,获取wallsNode的边界框,然后再次将hidden属性设置为true。一旦我完成了所有需要做的事情,我会在所有的墙节点上再次将hidden设置为false。这真的是最聪明的方法吗?了解卷的边界节点似乎是非常常见的情况。这感觉像是一种非常笨拙、不直观的方式来实现这一点。第3点也应该有效。必须转换8个位置(边界框的每个角),然后在新坐标空间中沿每个轴找到最小值和最大值。