【问题标题】:How to rotate BoundingBox如何旋转边界框
【发布时间】:2012-12-08 11:53:02
【问题描述】:

这是我显示边界框的代码

 Vector3[] corners = box.GetCorners();
        for (int i = 0; i < 8; i++)
        {
            verts[i].Position = Vector3.Transform(corners[i],modelMatrix);
            verts[i].Color = Color.White;
        }

        vbo.SetData(verts);
        ibo.SetData(indices);

        foreach (EffectPass pass in effect.CurrentTechnique.Passes)
        {
            effect.World = Matrix.Identity; 
            effect.View = view;
            effect.Projection = projection;

            pass.Apply();
            ContentLoader.SetBuffers(ibo, vbo);
        }

我想使用BoundingBox 类实现相同的结果。 我试着这样做,但它不起作用

        for (int i = 0; i < boundingBoxes.Count; i++)
        {
            Vector3 min = Vector3.Transform(boundingBoxes[i].Min, modelMatrix);
            Vector3 max = Vector3.Transform(boundingBoxes[i].Max, modelMatrix);
            boundingBoxes[i] = new BoundingBox(min, max);
        }

如果没有旋转,上面的代码就可以工作。旋转时事情会变得一团糟。知道为什么以及如何解决它吗?

【问题讨论】:

  • BoundingBox 是轴对齐的。它不能旋转 - 它的边缘始终平行于主轴(x、y 和 z)。
  • 如何绘制边界框?如果你使用 DrawIndexedPrimitives 或类似的,也许你应该将你的 Matrix rotatin 作为世界变换传递......

标签: c# xna


【解决方案1】:

您不能在 Xna 中旋转 BoundingBox 对象。 BoundingBox 类的内置碰撞检测方法将始终根据轴对齐中的框的最小值和最大值计算。通过转换最小值和最大值,您不会旋转框,您只是更改轴对齐框的 x、y、z 尺寸。

学习“定向边界框”可能会更好。您可以通过将角用作顶点并在“DrawIndexedPrimitives”方法中选择“LineList”作为 PrimitiveType 而不是“TriangleList”来绘制一个定向框。定向盒的碰撞检测与轴对齐盒的碰撞检测不同且更复杂。

【讨论】:

  • 这是错误的,正如我在这个答案中所证明的那样:stackoverflow.com/a/63094985/3214889 令人难以置信的是,有多少人认为 AABB 和 OBB 之间存在差异。从数学上讲,它们完全相同。
  • 其实答案不假。答案表明旋转最小值和最大值不会解决问题。这是真实的。是的,您也正确的是,您可以想象旋转 OBB 的所有角以与基轴对齐,然后测试为 AABB。你到底为什么要浪费所有这些 CPU 周期来做那件事?如果一个盒子是定向的,只需对它使用 OBB 测试...... Dot & Cross product 方法比所有需要的旋转(在后台使用三角函数和 CPU 密集型平方根来规范化变换)的 CPU 效率要高得多.
  • @Krythic 此外,当您旋转角或最小/最大值时,所有使用 AABB 最小值/最大值的检测方法都将失败。最小/最大值将始终参考轴对齐,即使它们或角被旋转。最小值/最大值与内置的碰撞检测方法一起使用。简而言之,您旋转 AABB 以使其成为 OBB 的想法将导致不准确的碰撞检测。此外,即使您编写了自己的检测方法来解决这个问题,也不要忘记您必须旋转您正在测试的对象才能使其与 BB 具有相同的参考。
  • 看这个视频,我在其中的一点显示了边界框。我已经完全确认传统的 aabb 碰撞测试适用于此。在那个视频中,我正在剔除旋转的几何体,包括板条箱。它可以完美地检测到所有这些;即使我飞到它的一个角落。射线投射碰撞也可以完美运行。你错了。我礼貌地要求您删除您的 cmets。 youtu.be/WsvsRpjkaF8
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 2021-08-25
  • 2015-12-27
  • 1970-01-01
  • 2020-01-26
  • 2021-09-01
  • 2016-12-23
相关资源
最近更新 更多