如何对由许多小三角形组成的物体执行碰撞检测?


13

我知道可以通过较小的三角形来创建(或近似)任何形状。任何矩形都可以由2个较小的三角形创建。任何圆形都可以由许多薄的“比萨饼切片”三角形创建。这如何转换为碰撞检测?

我了解如何使用顶点计算矩形重叠。我了解如何使用中心,半径和距离来计算圆重叠。

但是,如何对由小三角形构成的形状进行碰撞检测?不是细节,而是一般概念。

Answers:


26

但是,如何对由小三角形构成的形状进行碰撞检测?

通过不这样做。

对任意三角形集合(或更糟糕的是,在任意三角形的两个集合之间)的碰撞检测非常昂贵。

取而代之的是,我们通常以分层的方式执行集合检测,首先从极其粗糙,简单的形状(例如盒子或球体)开始(近似)底层对象。

这使我们能够迅速将大多数潜在的碰撞排除为“未发生”,这是通常的情况。如果通过了这样的粗略检查,表明存在潜在的实际碰撞,我们将针对更详细的基本形状(例如,由多个紧密配合的胶囊形状制成的形状,或许多对齐的边框)。

本质上,冲突检测从粗略的测试开始,并且随着这些测试的通过,继续进行越来越详细的表示。Shiro在评论Alexandre的答案时提供的这张图片说明了如何用一系列较简单的形状来表示一个复杂的模型(人类):

打箱

实际上,实际上很少需要在单个三角形级别上执行碰撞,并且当我们这样做时,我们通常使用更粗略的方法来向下钻取非常小的一组潜在三角形进行测试。那时,将使用特定的算法来执行测试,就像您要测试两个矩形是否重叠一样。例如,您可以确定射线是否击中三角形以及在何处击中三角形


谢谢。是的,如果我实际上是在玩游戏,我只会使用一些现有的引擎。但是,我只想了解在预制的碰撞检测引擎中实现的基本思想。在上面的图表中,您将使用矩形数学来查看是否有任何东西触及组成该人的数十个矩形中的任何一个。这是基本思想吗?
JackOfAll 2015年

这些是定向的边界框(3D),而不是矩形。但是,是的。如果我要测试射线(代表子弹)是否与玩家相撞,我会在那些盒子上测试射线-可能是在先对代表整个角色的一个巨型盒子进行测试之后,而不是对每个盒子渲染网格的三角形)。

这个想法是,您可以使用字符的粗略近似,例如上图所示的定向边界框,并先进行测试,以进行更便宜的点击测试,然后如果发生碰撞,然后向下钻至更低的级别如果有必要,请测试包围盒中包含的各个三角形。通常,可以分层使用几种不同的BV,外部BV的准确性较低,但测试速度最快(球形,边界框),并且向下钻取更特定的对象(k-DOP),并且可能进一步向下钻取(三角形) )
2015年

4

碰撞检测基于几何体(原语,例如直线,平面,球体,盒子,胶囊,圆柱体)。

如果需要对由三角形制成的形状(例如不平坦的地形)执行碰撞检测,则必须对构成网格的所有三角形进行测试。

如果您达到了这一点,我强烈建议您使用预制的碰撞检测引擎,因为这种东西变得非常复杂,非常快。


如何在由三角形组成的形状上进行碰撞检测?
JackOfAll 2015年

@JackOfAll他已经在答复中提到,这通常是通过使用几何形状i.stack.imgur.com/CAhxn.jpg
dimitris93

@JackOfAll我编辑了答案;就像Shiro所说的,如果您的环境中有更复杂的“项目”(身体,椅子,汽车等),那么在游戏开发中,它们通常是由更简单的基本元素组合而成。对碰撞的检测是在原始形状上进行的,然后在整个身体上进行物理模拟。
Vaillancourt

4
我并不是从字面上试图做游戏,我只是想了解在预制的碰撞检测引擎中实现的基本思想。如果我真的在做游戏,我显然不会重复发明轮子。
JackOfAll 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.