对于我的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)乘以它看起来没有实现的向量。我还需要做些什么才能重新计算?
答案 0 :(得分:3)
我在游戏中做了类似的事情。在最小最大值框中转换8个点中的每个点后,需要重新扫描以找到每个轴上的新最小值。
将min max视为鞋盒。新的矩阵旋转并拉伸它。在变换之后,任何8个点中的任何一个都可以是任何轴上的新的最小值或最大值。
答案 1 :(得分:3)
您正在使用轴向对齐的边界框来表示可能旋转的网格。 由于盒子是轴向对齐的,它不能直接处理旋转。但是,您可以通过多种方式处理此问题: