有什么好的算法可以检测运动球体之间的碰撞?


27

如果(出于碰撞检测的目的)3D对象在游戏中由球体表示,那么检测球体之间的碰撞的好的算法是什么?

如果每个对象的位置都与上一帧相同,并且有一个新的(期望的)位置,那么一种好的算法可以识别出球体在前一帧中不相交并且在第二帧中不相交的碰撞,但它们确实在两者之间相交?

Answers:


18

基本上,您正在寻找踪迹。

该页面可能会为您提供帮助:http : //www.realtimerendering.com/intersections.html

移动球体/球体:(位置)将移动球体的半径添加到静态球体,并将移动球体视为射线。使用此射线执行射线/球体相交。见戈麦斯;施罗德(Schroeder)用于代码(文章存在派生错误,代码很好);和RTR2,第2页。622。


1
如果两个球体都移动,那是行不通的(即使重复两次也不行)。在我看来,您首先必须在跨度a和跨度b的直线之间进行距离检查,如果该距离小于半径a +半径b,则可能发生碰撞。之后,我将进行检查,以了解球形A的时间在哪里,球形B的时间在哪里接近。如果是这样,我会针对该点及时检查速度与距离的关系,如果仍然有可能发生碰撞,我将进行逐步优化。
Kaj 2010年

15
实际上,您只需要使运动相对即可。因此,如果两个球体都在运动,则只需从两个球体中减去一个球体的速度,即可得到一个“运动”球体和一个“静止”球体。然后,您可以使用以上内容。
Tetrad


4

从我的头顶上:

  1. 从每个圆的中间开始创建两个线段,从它的开始位置到在该时间步中移动的位置。
  2. 找到这两条线段之间的最小距离;正如这里所解释的
  3. 如果该距离小于或等于第一个圆的半径加上第二个圆的半径,则它们发生碰撞;否则他们没有。

这就是全部内容,我希望很快。


1

这是另一篇关于Gamasatura的不错的文章。


1
我知道这是7年后的事,但这答案仅是链接。幸运的是,该链接仍然有效,但是如果没有激活,您的答案将不会是答案。
Draco18s

0

以这样做的人的身份讲话:这不值得麻烦。除非您的游戏设计绝对需要它,而且几乎可以肯定不需要,否则您将花费​​更多的精力进行真正的工作。而且它会比您希望的慢。


他可能正在为您所知道的做台球游戏。
Kaj 2010年

如果他在做台球游戏,他的“游戏设计绝对需要”
deft_code

没错,不要重新发明轮子。但是仅仅为了锻炼,这是值得的。
user712092 2011年

4
我不同意直接劝阻作为答案
bobobobo

我同意@bobobobo的观点,问题不在于是否值得为之烦恼,无论成本如何,看到该线程的未来用户可能绝对需要答案。作为评论,这样会更好。
TomTsagk


0

运动物体的碰撞检测通常称为“扫掠体积计算”,此处是有关此主题的一些代码/文章。

http://www.gpu-voxels.org/demos/(演示)

源代码库:

https://github.com/fzi-forschungszentrum-informatik/gpu-voxels

https://libigl.github.io/tutorial/#swept-volume

https://github.com/gradientspace/geometry3Sharp

文章:

http://gamma.cs.unc.edu/SV/sm03.pdf

https://www.cs.columbia.edu/~allen/PAPERS/abrams.swept.pdf (不幸的是没有源代码)

http://www.realtimerendering.com/intersections.html (链接的集合非常多)


1
仅包含链接(或在本示例中为多个链接)的答案不包含实际答案。您应该在帖子中包含相关信息,以便如果这些链接失效,您的帖子仍然可以理解。
Draco18s '18

目前,链接后面的信息比我解释得更好。链接后还有演示视频,可以实时了解发生的情况。
TarmoPikaro

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.