Java 制作复式矩阵

Java 制作复式矩阵,java,Java,我试图实现一个类来检查两个游戏对象是否相交。有谁能给我一个更好的解决这个问题的方法吗 基本上我想addCollision并知道一个对象是否与另一个对象发生碰撞。复式矩阵似乎是个好主意 private class CollisionMatrix { private boolean[][] matrix; private HashMap<Tag, Integer> matrixIndexes = new HashMap<Tag, Integer>()

我试图实现一个类来检查两个游戏对象是否相交。有谁能给我一个更好的解决这个问题的方法吗

基本上我想
addCollision
并知道一个对象是否与另一个对象发生碰撞。复式矩阵似乎是个好主意

    private class CollisionMatrix {

    private boolean[][] matrix;
    private HashMap<Tag, Integer> matrixIndexes = new HashMap<Tag, Integer>();

    public CollisionMatrix() {
        int i = 0;
        for (Tag tag : Tag.values())
            matrixIndexes.put(tag, i++);
        matrix = new boolean[i][i];
    }

    private void addCollision(Tag tag1, Tag tag2) {
        int p1 = matrixIndexes.get(tag1);
        int p2 = matrixIndexes.get(tag2);
        matrix[p1][p2] = true;
        matrix[p2][p1] = true;
    }

    private boolean collidesWith(Tag tag1, Tag tag2) {
        int p1 = matrixIndexes.get(tag1);
        int p2 = matrixIndexes.get(tag2);
        return matrix[p1][p2] || matrix[p2][p1];
    }

}
私有类冲突矩阵{
私有布尔[][]矩阵;
私有HashMap matrixIndexes=新HashMap();
公共冲突矩阵(){
int i=0;
对于(标记:Tag.values())
put(tag,i++);
矩阵=新布尔[i][i];
}
私有void addCollision(标记tag1、标记tag2){
int p1=矩阵索引.get(tag1);
int p2=矩阵索引.get(tag2);
矩阵[p1][p2]=真;
矩阵[p2][p1]=真;
}
专用布尔碰撞开关(标记tag1,标记tag2){
int p1=矩阵索引.get(tag1);
int p2=矩阵索引.get(tag2);
返回矩阵[p1][p2]| |矩阵[p2][p1];
}
}

这不是一个完整的答案,但它应该能帮助您找到一个更完整的解决方案

最简单(不高效)的方法是列出可能相互碰撞的对象,然后在每一帧的时间内,通过列表中的每个对象,检查该对象是否与列表中的另一个对象发生碰撞(共享相同的空间或边界体积)

伪代码:

L: list of objects that can potentially collide.
t: time

for each frame in t {
    for each object obj in L {
        P: list of objects without obj
        for each object otherObj in P {
             does obj collide with otherObj
        }
    }
}
虽然这在技术上是可行的,但这并不是一个好的解决方案,因为一旦开始有很多对象,它就会非常慢,而且不需要太多的对象就能使它变慢

为了实时实现这一点,您需要添加一些加速技术。 其中一种加速技术是使用“边界体积层次”(Bounding volume hierarchy)或BVH

简而言之,BVH是一种技术或算法,用于快速查找可能发生碰撞的对象

它通常使用某种类型的树结构来跟踪所述对象占用的位置和体积。树结构提供了比线性迭代列表多次更快的查找时间

树的每个级别都提供了边界体积的层次结构(对象可能占用的空间)。树的顶层为特定对象提供了更大的体积(更粗糙、更小粒度或更不适合对象的形状),但如果所讨论的对象不在同一空间中,则更容易丢弃(只需很少的计算,您就会知道对象永远不会与同一边界体积中的任何对象发生碰撞)。树越深,边界体积得到的对象形状就越细粒度或更适合,直到得到发生碰撞的对象为止

希望这有帮助:)