OpenGL BoundingBox碰撞检测

时间:2015-02-08 14:05:46

标签: opengl collision-detection bounding-box

对于我的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]);
    }
}

我现在的问题是重新计算功能不起作用。我认为应该将矩阵(因为存储了roatation,position和sclae)乘以它看起来没有实现的向量。我还需要做些什么才能重新计算?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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