Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 超越交叉测试的碰撞检测_Testing_2d_Collision Detection_Intersection - Fatal编程技术网

Testing 超越交叉测试的碰撞检测

Testing 超越交叉测试的碰撞检测,testing,2d,collision-detection,intersection,Testing,2d,Collision Detection,Intersection,为了阐明这一点,想象一个二维游戏,玩家控制一个小精灵,这个精灵可以被赋予任意的速度。它只受重力作用。它最初位于一个横跨屏幕底部大部分的大平台上,而在它上面的一小段距离是另一个更小的平台。如果精灵笔直向上跳跃,它将能够通过平台底部向上移动,在其上方移动一段时间,然后下降并降落在上部平台的顶部。它可以从底部向上穿过,但不能从顶部向下穿过 通过将屏幕上物体的每一个实心边视为一个可以从右、左或两者通过的向量,就可以做到这一点;在本例中,主基础平台的顶部需要一条边(如果它从右角指向左角,则从右侧是不可渗透

为了阐明这一点,想象一个二维游戏,玩家控制一个小精灵,这个精灵可以被赋予任意的速度。它只受重力作用。它最初位于一个横跨屏幕底部大部分的大平台上,而在它上面的一小段距离是另一个更小的平台。如果精灵笔直向上跳跃,它将能够通过平台底部向上移动,在其上方移动一段时间,然后下降并降落在上部平台的顶部。它可以从底部向上穿过,但不能从顶部向下穿过

通过将屏幕上物体的每一个实心边视为一个可以从右、左或两者通过的向量,就可以做到这一点;在本例中,主基础平台的顶部需要一条边(如果它从右角指向左角,则从右侧是不可渗透的),较小平台的顶部需要另一条边,精灵需要多条边(如果它是一个小矩形,则需要四条)。如果一个点从错误的方向通过边缘,它会向碰撞解决算法发送一个信号,以确保该点不会这样做

这一切都非常有效,唯一的问题是效率不高。使用传统的碰撞检测机制,正方形是一个对象。如果你有一个n个方块的列表来测试它们之间的碰撞,你必须运行——最多;大多数方法都会缩小这个数字——n平方碰撞测试。使用点边方法,每个正方形大约有四条边,每条边都有两个要测试的端点。这意味着对于n个正方形,您将运行大约(8n)个正方形碰撞测试。碰撞试验的64倍;那太可怕了


那么,在很大程度上,是否有任何广泛使用或更被接受的碰撞检测方法可以完成与点边缘方法相同的任务,但不会过度增加计算机的处理能力?请注意,这仅适用于2D;它的意思是让事物分层来表示某种轴内,而3D完全能够表示空间的所有三维空间,并且不需要进行扩充。

这通常是使用四叉树边界框来完成的。树的每个节点都有包含其直接子节点的边界。对于n个节点,最多需要k个日志(n)比较。这是一个二维的二进制搜索

请注意,边界框不一定与正方形完全对应。它们是网格对齐的,用于通过范围比较进行廉价的命中测试

一旦你击中了你的一个原子的边界框,就对这个原子做一个完整的命中测试

这种方法通常与多边形命中测试结合使用,这对于具有多条边的多边形来说非常昂贵(不要称之为复杂多边形,复杂多边形是指具有相交边的“扭曲”多边形)