SceneKit中的节点有一个边界框,它由两个点组成:一个具有节点所有坐标的最小值,另一个具有节点所有坐标中最大的坐标。这些坐标位于节点自己的坐标系中,我看不到如何在不同的坐标系中找到边界框。
例如,假设我们的节点具有这样的单位框几何,其轴标记为.
或:
:
:
A---------+
| : |
..|....:....|...
| : |
+---------B
:
在节点自己的坐标系中,A是(-0.5,-0.5,-0.5),B是(0.5,0.5,0.5)。如果框位于世界坐标系中的(45,0,0),则A为(44.5,-0.5,-0.5),B为(45.5,0.5,0.5)。我们可以通过调用-[SCNNode getBoundingBoxMin:max:]
然后调用-[SCNNode convertPosition:toNode:]
来获取这些值。
但是,如果节点围绕Z轴旋转45°,那么在世界坐标系中,它看起来像这样呢?
A
/ \
/ \
...+.........+...
\ /
\ /
B
如果你在这种情况下调用-[SCNNode convertPosition:toNode:]
,你会得到一个没有宽度的混乱边框!
有没有办法解决这个问题?
答案 0 :(得分:0)
将(轴对齐)边界框从一个节点转换为另一个节点,需要转换bbox的8个顶点(不仅仅是最小值和最大值):
(min.x,min.y,min.z) (max.x,min.y,min.z) (min.x,max.y,min.z) (max.x,max.y,min.z) (min.x,min.y,max.z) (max.x,min.y,max.z) (min.x,max.y,max.z) (max.x,max.y,max.z)
然后解析这8个变换顶点并找到新变换的min和max。