我正在创建各种物理模拟器,并且同时有数千个点状对象(单个像素)移动。目前,我进行此设置的方式是每个点每帧仅移动一个像素,这使在二维数组中轻松跟踪它们并检查它们是否会发生碰撞变得很容易。但是,此解决方案不允许帧独立移动,这是必需的,因为碰撞检测非常慢。在这种情况下,进行碰撞检测的最有效方法是什么?
好的,首先要做的是:
在任何现代操作系统上,您的应用将
而且,您永远都不知道您的应用程序(如果分发)将在哪种硬件上运行。这会带来很多麻烦,但是首先要注意的是,在编译时,您永远都不知道帧之间经过了多少实时时间。
(最近发生了一个有趣的情况,当时客户希望在关闭笔记本电脑,上飞机并重新打开笔记本电脑后正确进行轨道计算。很容易修复,但您可能希望每帧的运行时间为12小时。 )
那么,您如何处理呢?
任何框架都会提供某种计时器。我不确定SDL如何处理此问题,但通常在Windows上,您通常会用它GetTickCount()
来获取帧之间经过的毫秒数。每个粒子都有一个速度,以每秒单位表示。(请使用仪表。拯救世界,以用户1868866为单位)。
移动粒子时
pos + =速度*经过时间
或者,举一个具体的例子,如果我正在以50 mph的速度行驶的汽车中,
位置+ = 50英里/小时* 2个小时= 100英里。
这样做将解决粒子在帧时间内而不是模拟/游戏/实时移动的问题。
现在,是碰撞检测问题。由于我们在这里进行2D工作...
对于多个对象,您无法在合理的时间内将每个对象与其他对象进行比较,以查看它们是否发生碰撞。
所以,我们有像Quadtrees这样的奇特的东西。想法是将您的空间递归地划分为多个象限,每个象限实际上是一个数据结构,以某种方式“包含”了其范围内的所有项目。然后,您只需要检查同一四叉树节点内的项目之间是否存在冲突。
为您的特定应用程序实现四叉树的方式太长了,无法适合SO答案,但是我鼓励您进行研究,尝试并实施它,并在遇到任何问题时回到这里。另一个很棒的资源是gamedev.stackexchange.com,它比SO更加关注游戏/图形。
祝好运。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句