我正在尝试实现一个类来检查两个游戏对象是否相交。谁能给我一个更好的解决方案/更优雅的这个问题?
基本上我想addCollision
知道一个人是否反对collidesWith
另一个人。复式矩阵似乎是个好主意。
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];
}
}
这不是一个完整的答案,但它应该让您走上一条获得更完整解决方案的道路。
最简单(效率不高)的方法是有一个可以相互碰撞的对象的列表,然后对于每一帧时间,通过列表中的每个对象并检查对象是否碰撞(共享相同的空间或边界体积)与列表中的另一个。
伪代码:
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
}
}
}
虽然这在技术上可行,但它不是一个好的解决方案,因为一旦您开始拥有许多对象,它就会变得非常慢,而且不需要那么多就让它变慢。
为了实时实现这一点,您需要添加一些加速技术。这些加速技术之一是使用“边界体积层次结构”或 BVH。https://en.wikipedia.org/wiki/Bounding_volume_hierarchy
简而言之,BVH 是一种技术或算法,可以快速查找可能发生碰撞的对象。
它通常使用某种类型的树结构来跟踪所述对象占据的位置和体积。树结构提供更快的查找时间,而不是多次线性迭代列表。
树的每一层都提供了边界体积的层次结构(对象可能占据的空间)。树的顶层为特定对象提供了更大的体积(更粗糙、粒度更小或更不适合对象的形状),但如果所讨论的对象不在同一个空间中,则更容易丢弃(你会知道很少计算对象永远不会与同一边界体积中的任何东西发生碰撞)。您在树中走得越深,边界体积获得的对象形状越精细或越适合,直到您得到碰撞的对象。
希望这可以帮助 :)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句