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是一种技术或算法,用于快速查找可能发生碰撞的对象
它通常使用某种类型的树结构来跟踪所述对象占用的位置和体积。树结构提供了比线性迭代列表多次更快的查找时间
树的每个级别都提供了边界体积的层次结构(对象可能占用的空间)。树的顶层为特定对象提供了更大的体积(更粗糙、更小粒度或更不适合对象的形状),但如果所讨论的对象不在同一空间中,则更容易丢弃(只需很少的计算,您就会知道对象永远不会与同一边界体积中的任何对象发生碰撞)。树越深,边界体积得到的对象形状就越细粒度或更适合,直到得到发生碰撞的对象为止
希望这有帮助:)