OpenGL边界框碰撞检测

OpenGL边界框碰撞检测,opengl,collision-detection,bounding-box,Opengl,Collision Detection,Bounding Box,对于OpenGL场景中的每个对象,我想添加一个边界框,以便使用它们进行简单的碰撞检测。为此,我创建了一个简单的BoundingBox类,如下所示: public class BoundingBox { private float[] mathVector; public float[] minVector; public float[] maxVector; public BoundingBox(float minX, float maxX, float mi

对于OpenGL场景中的每个对象,我想添加一个边界框,以便使用它们进行简单的碰撞检测。为此,我创建了一个简单的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)与向量相乘就足够了,看起来还不够。我还需要做什么才能重新计算呢?

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


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

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


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

您正在为可能旋转的网格使用轴向对齐的边界框。 由于长方体是轴向对齐的,因此无法直接处理旋转。但是,您可以通过多种方式处理此问题:

  • 使用定向边界框,它可以旋转,以便一对一地跟踪对象的移动
  • 更昂贵的方法是使用轴向对齐的长方体并重新计算最小值和最大值,方法是变换对象的顶点,并在每次旋转对象时提取最小值和最大值,这不仅成本更高,而且由于定向边界长方体不太合适,碰撞检测通常精度较低(取决于对象的形状)

您正在为可能旋转的网格使用轴向对齐的边界框。 由于长方体是轴向对齐的,因此无法直接处理旋转。但是,您可以通过多种方式处理此问题:

  • 使用定向边界框,它可以旋转,以便一对一地跟踪对象的移动
  • 更昂贵的方法是使用轴向对齐的长方体并重新计算最小值和最大值,方法是变换对象的顶点,并在每次旋转对象时提取最小值和最大值,这不仅成本更高,而且由于定向边界长方体不太合适,碰撞检测通常精度较低(取决于对象的形状)

谢谢你,当然你是对的,我忘记了这一点。我现在已经实施了,但没有帮助。还有其他错误或事情我已经忘记了吗?谢谢你,当然你是对的。我已经实施了,但没有帮助。还有其他错误或事情我已经忘记了吗?啊,我想我知道w你的意思是什么。所以我需要一个定向边界框的最后4个点?@Cilenco它可以,但当你旋转一个轴向对齐的框时,你会得到它的拉伸版本,而不是旋转版本,因此你的边界框会变得比预期的大得多。但这取决于你想要实现什么。@Cilenco你需要存储不同的t info创建OBB,这是一个不同的故事,它取决于您想要实现的模拟类型。好的,谢谢您的链接,它帮助了很多。所以当我实现它时,我有一个OBB,但是如何计算两个OBB是否相互接触?链接中的表达式对我来说没有意义。@Cilenco AABB交叉点是更简单。所以使用OBB或AABB取决于您真正想要实现的目标。不管怎样,这里是OBB交叉测试(更复杂).啊,我想我知道你的意思。所以我需要一个定向边界框的最后4个点?@Cilenco它可以,但当你旋转一个轴向对齐的框时,你会得到它的拉伸版本,而不是旋转版本,因此你的边界框会变得比预期的大得多。但这取决于你想要实现什么。@Cilenco你需要存储不同的信息来创建OBB,这是一个不同的故事,这取决于你想要实现什么样的模拟。好的,谢谢你的链接,它帮助了很多。所以当我实现它时,我有一个OBB,但是如何计算两个OBB是否相互接触?链接中的表达式对我来说没有真正意义。@Cilenco The AABB交叉更容易。因此使用OBB或AABB取决于您真正想要实现的目标。不管怎样,这里是OBB交叉测试(更复杂)。