gpt4 book ai didi

swift - 通过旋转获取 SCNNode 的边界体积

转载 作者:搜寻专家 更新时间:2023-10-31 22:21:28 24 4
gpt4 key购买 nike

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

enter image description here

如您所见,其中一个 1x5 长方体已旋转 90º。这是通过在节点检查器中将 Euler Angles 属性的 y 属性设置为 90 来实现的。

enter image description here

但请注意,边界框不考虑长方体的旋转。当我遍历场景中的 SCNNode 时也是如此。两个长方体具有相同的边界体积

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. 在 Interface Builder 中,如您的屏幕截图所示,有一个 Editing space 属性,您可以将其设置为 World(而不是 Local)

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

The bounding volume of a node containing child nodes is the minimal volume that encloses the bounding volumes of the node’s children.

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

关于swift - 通过旋转获取 SCNNode 的边界体积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831701/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com