【问题标题】:OpenGL BoundingBox collision detectionOpenGL BoundingBox 碰撞检测
【发布时间】:2015-04-08 07:26:30
【问题描述】:

对于我的 OpenGL 场景中的每个对象,我想添加一个 BoundingBox,以便我可以将它们用于简单的碰撞检测。为此,我创建了一个简单的 BoundingBox 类,如下所示:

public class BoundingBox
{
    private float[] mathVector;

    public float[] minVector;
    public float[] maxVector;

    public BoundingBox(float minX, float maxX, float minY, float maxY,float minZ, float maxZ)
    {
        mathVector = new float[] {0, 0, 0, 0};

        minVector = new float[] {minX, minY, minZ, 1};
        maxVector = new float[] {maxX, maxY, maxZ, 1};
    }

    public void recalculate(float[] modelMatrix)
    {
        Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, minVector, 0);
        System.arraycopy(mathVector, 0, minVector, 0, minVector.length);

        Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, maxVector, 0);
        System.arraycopy(mathVector, 0, maxVector, 0, maxVector.length);
    }

    public boolean overlap(BoundingBox bb)
    {
        return (maxVector[0] >= bb.minVector[0] && bb.maxVector[0] >= minVector[0]) && 
               (maxVector[1] >= bb.minVector[1] && bb.maxVector[1] >= minVector[1]) && 
               (maxVector[2] >= bb.minVector[2] && bb.maxVector[2] >= minVector[2]);
    }
}

我现在的问题是重新计算功能实际上不起作用。我认为将矩阵(因为存储了旋转、位置和 sclae)与向量相乘就足够了,它看起来还不够。我还需要做什么才能进行重新计算工作?

【问题讨论】:

    标签: opengl collision-detection bounding-box


    【解决方案1】:

    您正在为可能旋转的网格使用轴向对齐的边界框。 由于盒子是轴向对齐的,它不能直接处理旋转。然而,您可以通过多种方式处理此问题:

    • 使用定向边界框,它可以旋转,以便一对一跟踪对象的移动。
    • 更昂贵的方法是使用轴向对齐的框并重新计算最小值和最大值,通过变换对象的顶点并在每次旋转对象时提取最小值和最大值,不仅这样更昂贵,碰撞检测通常不太准确,因为定向边界框不太适合(取决于对象的形状)。

    【讨论】:

    • 啊,我想我明白你的意思了。所以我需要最后 4 个点来获得定向边界框?
    • @Cilenco 可以 但是当你旋转一个轴向对齐的盒子时,你会得到它的拉伸版本,不是旋转的版本,因此您的边界框将变得比预期大得多。但这取决于您要实现的目标..
    • @Cilenco 你需要存储不同的信息来创建一个 OBB,它是一个不同的故事,这取决于你想要实现什么样的模拟。 gamedev.stackexchange.com/questions/49041/…
    • 好的,感谢您提供的这个链接,它帮了很多忙。所以当我实现它时,我有一个 OBB,但是如何计算两个 OBB 是否相互接触?链接中的表达对我来说真的没有意义。
    • @Cilenco AABB 交叉口要容易得多。因此,使用 OBB 或 AABB 取决于您真正想要实现的目标。不管这里是 OBB 相交测试(更复杂)gamedev.stackexchange.com/questions/25397/…
    【解决方案2】:

    我在我的游戏中做类似的事情。转换最小最大框上的 8 个点后,您需要重新扫描以找到沿每个轴的新最小最大值。

    将 min max 想象成一个鞋盒。新矩阵旋转并拉伸它。转换后,8 个点中的任何一个都可以是任何轴上的新最小值或最大值。

    【讨论】:

    • 谢谢你,当然你是对的,我忘记了。我现在已经实现了,但这并没有帮助。是否还有其他错误或我忘记的事情?
    猜你喜欢
    • 2011-08-14
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多