通过旋转获取 SCNNode 的边界体积
Getting an SCNNode's bounding volume with rotation
我使用 XCode 关卡编辑器设置了一个非常简单的场景。
如您所见,其中一个 1x5 长方体已旋转 90º。这是通过在节点检查器中将欧拉角 属性 的 y 属性设置为 90 来实现的。
但请注意边界框不考虑长方体旋转。当我遍历场景中的 SCNNode 时也是如此。两个长方体具有相同的 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 似乎也没有提供任何将变换矩阵应用于向量的方法。但是,我不太擅长几何,所以我可能会遗漏一些明显的东西。
一些想法:
在 Interface Builder 中,如屏幕截图所示,有一个 Editing space 属性,您可以将其设置为 世界(而不是本地)
在代码中,您可以使用临时节点来计算边界框。确保只有一个子节点(您要计算其边界框的节点),在该子节点上应用任何变换,然后他们向 父节点 询问其边界框。来自文档:
The bounding volume of a node containing child nodes is the minimal volume that encloses the bounding volumes of the node’s children.
- 获取节点的边界框,然后使用
-convertPosition:toNode:
等实用程序计算另一个坐标系中的边界框
我使用 XCode 关卡编辑器设置了一个非常简单的场景。
如您所见,其中一个 1x5 长方体已旋转 90º。这是通过在节点检查器中将欧拉角 属性 的 y 属性设置为 90 来实现的。
但请注意边界框不考虑长方体旋转。当我遍历场景中的 SCNNode 时也是如此。两个长方体具有相同的 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 似乎也没有提供任何将变换矩阵应用于向量的方法。但是,我不太擅长几何,所以我可能会遗漏一些明显的东西。
一些想法:
在 Interface Builder 中,如屏幕截图所示,有一个 Editing space 属性,您可以将其设置为 世界(而不是本地)
在代码中,您可以使用临时节点来计算边界框。确保只有一个子节点(您要计算其边界框的节点),在该子节点上应用任何变换,然后他们向 父节点 询问其边界框。来自文档:
The bounding volume of a node containing child nodes is the minimal volume that encloses the bounding volumes of the node’s children.
- 获取节点的边界框,然后使用
-convertPosition:toNode:
等实用程序计算另一个坐标系中的边界框