如何将节点的边界框转换为不同的坐标系?

时间:2014-10-03 01:25:49

标签: scenekit

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:],你会得到一个没有宽度的混乱边框!

有没有办法解决这个问题?

1 个答案:

答案 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。