Python:最佳粒子自碰撞/三角碰撞算法

时间:2011-11-24 17:25:36

标签: python collision-detection kdtree aabb octree

我开始在Python中为Blender开发这个粒子引擎:http://www.youtube.com/watch?v=uoK4QV3jg58&feature=channel_video_title

所有数据都由我的脚本处理,Blender只是用于视觉。我现在的问题是,在上面的视频中,我计算了每个粒子之间的距离,以便所有粒子检测它们是否相互碰撞。

我开始读到:

  • 八叉树
  • kdTree
  • BVHTree
  • AABBtree
  • ......还有更多

Kdtree似乎非常有效地搜索最近的邻居,但仅用于静态云。我的粒子总是移动,因此必须在每次迭代时重新生成kdTree,我认为消耗了太多的过程。我看过许多游戏都使用AABB树。我有点失落......我不知道该选择什么。我想要的是:

  • 检测大量粒子(250 000或更多)之间的碰撞
  • 不需要实时(无论如何有250 000个粒子,这是不可能的)。对于200万个颗粒,每帧20分钟对我来说不是问题。
  • 我的粒子总是球形
  • 检测粒子与多边形对象之间的碰撞
  • 减少必要距离计算的算法(避免计算每个其他粒子或多边形的所有粒子,即使它们距离很远)
  • 我的粒子是动态的,我的多边形对象可以是动态的或静态的。

如果有人能告诉我什么是最好的猜测,我可以在哪里找到Python文档和示例。

1 个答案:

答案 0 :(得分:0)

如果“一切都是动态的”,那么您将失去快速查找和慢插入的数据结构的好处。

理想情况下,您可以在数据中找到一些结构以简化运行时间。也许移动的多边形都朝着相同的方向移动,因此您可以将它们用作参照系,从而有效地使它们成为静态。也许运动很小,因此数据结构可以就地更新,而不是在每次通过时从头开始重建。或者粒子和多边形的运动局限于小邻域,因此计算上难以处理的大问题可以减少到更小的问题。

说“没有任何附加约束”的“一切都在移动”类似于说从迭代到迭代的数据是完全随机的;因此,您的问题的关键是确定前一次迭代中的任何计算是否可重用。这将决定适当的数据结构和算法。