OpenGL边界框碰撞检测
对于OpenGL场景中的每个对象,我想添加一个边界框,以便使用它们进行简单的碰撞检测。为此,我创建了一个简单的BoundingBox类,如下所示: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
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个点中的任何一个都可以是任意轴上的新最小值或最大值。您正在为可能旋转的网格使用轴向对齐的边界框。 由于长方体是轴向对齐的,因此无法直接处理旋转。但是,您可以通过多种方式处理此问题:
- 使用定向边界框,它可以旋转,以便一对一地跟踪对象的移动
- 更昂贵的方法是使用轴向对齐的长方体并重新计算最小值和最大值,方法是变换对象的顶点,并在每次旋转对象时提取最小值和最大值,这不仅成本更高,而且由于定向边界长方体不太合适,碰撞检测通常精度较低(取决于对象的形状)
- 使用定向边界框,它可以旋转,以便一对一地跟踪对象的移动
- 更昂贵的方法是使用轴向对齐的长方体并重新计算最小值和最大值,方法是变换对象的顶点,并在每次旋转对象时提取最小值和最大值,这不仅成本更高,而且由于定向边界长方体不太合适,碰撞检测通常精度较低(取决于对象的形状)