制作复式矩阵

阿方索·马托斯

我正在尝试实现一个类来检查两个游戏对象是否相交。谁能给我一个更好的解决方案/更优雅的这个问题?

基本上我想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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从多个向量制作矩阵

来自分类Dev

制作列均值的矩阵

来自分类Dev

制作列均值的矩阵

来自分类常见问题

从表示关系的矩阵制作邻接矩阵

来自分类Dev

根据R中的子矩阵制作矩阵

来自分类Dev

从表示关系的矩阵制作邻接矩阵

来自分类Dev

在MATLAB中制作包含矩阵的矩阵

来自分类Dev

制作特定结构的矩阵

来自分类Dev

使用TextView制作像素矩阵

来自分类Dev

制作国际象棋矩阵

来自分类Dev

python使用数组制作矩阵

来自分类Dev

制作特定结构的矩阵

来自分类Dev

如何读取边缘列表以制作稀疏矩阵

来自分类Dev

制作距离矩阵或重复计算距离

来自分类Dev

如何在Python中制作矩阵?

来自分类Dev

MATLAB:制作具有移位行的矩阵

来自分类Dev

在python中制作完整的矩阵输出

来自分类Dev

C ++制作二维布尔矩阵

来自分类Dev

使用组信息制作邻接矩阵

来自分类Dev

从成对的列表制作Numpy对称矩阵

来自分类Dev

如何在MATLAB中制作特定矩阵?

来自分类Dev

在C中使用for循环制作矩阵

来自分类Dev

在矩阵Matlab中制作Nan条

来自分类Dev

C ++制作二维布尔矩阵

来自分类Dev

从一维数组制作矩阵

来自分类Dev

如何制作包含空数组的矩阵?

来自分类Dev

R,如何从简单的矩阵制作热图?

来自分类Dev

Matlab从带有间隙的向量中制作矩阵

来自分类Dev

DLIB C ++如何制作dlib ::矩阵的std ::向量