【问题标题】:How do I convert a node's bounding box to a different coordinate system?如何将节点的边界框转换为不同的坐标系?
【发布时间】:2014-11-28 02:30:17
【问题描述】:

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

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

【问题讨论】:

    标签: scenekit


    【解决方案1】:

    要将(轴对齐)边界框从一个节点转换到另一个节点,您需要转换 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个变换后的顶点,找到新变换的最小值和最大值。

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2021-09-27
      • 1970-01-01
      • 2022-12-28
      • 2019-06-18
      • 2012-01-17
      相关资源
      最近更新 更多