模拟汽车沿着轨道移动
对于操作系统类我要写一个名为“Jurrasic Park”的调度模拟器。模拟汽车沿着轨道移动
的最终目标是,让我有以下一组路径和乘客对这些车返回,使他们可以捡起来,并采取在巡回赛上的一组位置排队等候一个系列轿车。这将是一个简单的二维自上而下的赛道视图,以及沿着赛道行驶的汽车。
虽然我可以,而不必在视觉上很容易地编写这显示任何东西我不太知道什么是最好的办法是实行汽车沿着固定轨道移动。要开始,我将简单地使用OpenGL将我的汽车绘制为矩形,但我仍然对如何更新汽车的位置并确保它沿着设定的模拟路径进行模拟感到困惑主题公园。
我应该存储轨道的顶点列表中,让每个调用update()
动车近了一步到下一个顶点?
我会保持它的简单:
运行计时器(每100毫秒),并在每个定时器画出汽车的每个那些在新的位置。该位置是从包含汽车(每辆汽车?)的二维坐标的文件中读取的。
如果你设计的路很长(可以说,30秒),写30 * 10分会很难。那么如何在文件中存储每一整秒的位置呢?然后,在这两个间隔之间,您将有9个盲点,只需以恒定速度移动汽车(x + = dx/9,y + = dy/9)。
我想听到更好的方法:)
那么你可以使用一些路径为你描述,醚定点路径或花键。然后在此路径上以固定的“速度”移动。这可能看起来很僵硬,如果汽车在转弯时在直路上花费相同。
所以,你可以再为每个路径段的速度,但你会需要很多的速度设定点,或混合的速度,否则你会得到生涩的速度变化。
或者你可以去全车模拟,并使用A *来建立最佳路径。这已结束但非常酷。
如果只有前进和后退,你知道你要往前走,你可以只看看你周围的细胞,发现在路上的颜色的那些和移动,你留在路的中心。
如果您认为您不会有陡峭的曲线,那么您可以假设道路直接位于您的前方,只需扫描左侧和右侧,查看道路是否有一点弯曲,以留在中央,以减少处理。
有可以工作的其他方法,但是这一个是简单的,海事组织,并允许你在你的路上柔和的曲线。
另一种方法是基于瓦片,所以你只需看一看前面的瓦片,并在道路方向上有不同的瓦片,这样你就知道如何将汽车保持在瓦片上。
这不会那么顺利,但也很容易做到。
如果您想要弯曲轨迹,可以使用样条曲线,这是由两个矢量端点指定的数学定义的曲线。你把终点放下来,然后解决它们之间的一条不错的曲线。搜索应该显示源代码或数学,你可以导入到源代码。关于这一点的好处是,您可以准确解决车辆的前进方向,并通过百分比计算获得路上的下一个位置。困难的是,如果您不希望每组端点之间的步数相同,则必须执行曲线长度计算。
另一种方法是使用一个隐藏的位图,其上绘制的路径作为单个像素宽曲线。您可以通过将当前位置周围的像素与行进方向向量进行匹配,然后在每个步骤中使用delta函数更新向量来查找路径中的下一个位置。我们将这种方法用于路径行驶原型,其中使用操纵杆沿着各种路径“驱动”“车辆”,并且其工作正常,直到您有一些交叉点混淆了向量计算。但是,如果它是一个单向闭环,这将工作得很好,而且实现起来很简单。您可以通过平均最后几个增量来平滑车辆的航向角度。另外,每个像素都变成一个“步”,所以你的速度控制很容易。
在前一种情况下,您可以为开始/停止位置或感兴趣的点设置特殊标记的端点。在后者中,只需在路径上为特殊节点使用不同的颜色像素。无论哪种情况,您显示的内容可能都不是底层路径数据,但有些可能会使您的“公园”更具代表性。
只要选择最简单的方法,然后编写一个tick()函数,该函数可以在下一个路径位置步进,并在车辆行驶时更新车辆的前进方向。如果你真的很聪明,你可以做一些基于半径的碰撞处理,这样当赛道前面的赛车停下时,赛车会自动停止。
似乎是一种合理的方法。 – dommer 2009-04-15 20:53:58
你必须在操作系统类中使用OpenGL? – 2009-04-15 20:58:27
@mmyers,no ...我必须为我们的操作系统问题之一构建一个引人入胜的模拟。实施取决于我。 – Mithrax 2009-04-15 21:02:20