OpenGL BoundingBox 碰撞检测
OpenGL BoundingBox collision detection
我想为我的 OpenGL 场景中的每个对象添加一个 BoundingBox,以便我可以使用它们进行简单的碰撞检测。为此,我创建了一个简单的 BoundingBox class,如下所示:
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 存储在那里)与向量相乘就足够了,看起来还不够。我还需要做什么才能让重新计算工作?
我在我的游戏中做类似的事情。在你的 min max 盒子上的 8 个点中的每一个点都被变换之后,你需要重新扫描以找到沿每个轴的新的 min max。
将 min max 想象成一个鞋盒。新矩阵旋转并拉伸它。转换后,这8个点中的任何一个都可以是任何轴上的新最小值或最大值。
您正在为可能旋转的网格使用轴向对齐的边界框。
由于盒子是轴向对齐的,因此不能直接处理旋转。然而,您可以通过多种方式处理这个问题:
- 使用定向边界框,它可以旋转,因此可以一对一地跟踪对象的移动。
- 一种更昂贵的方法是使用轴向对齐的盒子并重新计算最小值和最大值,通过变换对象的顶点并在每次旋转对象时提取最小值和最大值,不仅这样更昂贵,碰撞检测通常不太准确,因为定向边界框不太适合(取决于对象的形状)。
我想为我的 OpenGL 场景中的每个对象添加一个 BoundingBox,以便我可以使用它们进行简单的碰撞检测。为此,我创建了一个简单的 BoundingBox class,如下所示:
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 存储在那里)与向量相乘就足够了,看起来还不够。我还需要做什么才能让重新计算工作?
我在我的游戏中做类似的事情。在你的 min max 盒子上的 8 个点中的每一个点都被变换之后,你需要重新扫描以找到沿每个轴的新的 min max。
将 min max 想象成一个鞋盒。新矩阵旋转并拉伸它。转换后,这8个点中的任何一个都可以是任何轴上的新最小值或最大值。
您正在为可能旋转的网格使用轴向对齐的边界框。 由于盒子是轴向对齐的,因此不能直接处理旋转。然而,您可以通过多种方式处理这个问题:
- 使用定向边界框,它可以旋转,因此可以一对一地跟踪对象的移动。
- 一种更昂贵的方法是使用轴向对齐的盒子并重新计算最小值和最大值,通过变换对象的顶点并在每次旋转对象时提取最小值和最大值,不仅这样更昂贵,碰撞检测通常不太准确,因为定向边界框不太适合(取决于对象的形状)。