模拟汽车沿轨道移动

3

我将为操作系统课程编写一个名为“侏罗纪公园”的调度模拟器。

最终目标是让一系列汽车沿着预设路径行驶,乘客在指定位置排队等待这些汽车返回,以便上车参观。这将是一个简单的二维俯视图,显示轨道和汽车沿着轨道移动。

虽然我可以轻松地编写代码而无需显示任何内容,但我不太确定实现沿着固定轨道移动汽车的最佳方法是什么。

首先,我将使用OpenGL将我的汽车绘制为矩形,但我仍然有点困惑如何更新汽车的位置,并确保它沿着模拟主题公园的预设路径移动。

我应该将轨道的顶点存储在列表中,并且每次调用update()时将汽车移动到下一个顶点吗?


似乎是一个合理的方法。 - dommer
你在操作系统课程中需要使用OpenGL吗? - Michael Myers
@mmyers,不...我必须为我们的某个操作系统问题构建一个引人入胜的模拟。具体实现由我决定。 - Mithrax
4个回答

2
如果你想要曲线轨迹,可以使用样条线,它是由两个向量端点指定的数学定义曲线。你只需放置端点,然后解决它们之间的漂亮曲线即可。搜索应该会揭示源代码或数学公式,供你转换为源代码。好处是,你可以精确地解决车辆的方向问题,以及通过进行百分比计算来获得路径上的下一个位置。困难在于,如果你不希望在每组端点之间有相同数量的步骤,则必须进行曲线长度计算。
另一种方法是使用绘制了路径的隐藏位图作为单像素宽曲线。你可以通过将当前位置周围的像素与行进方向向量匹配,然后在每个步骤中使用增量函数更新向量来找到路径中的下一个位置。我们在路径行驶原型中使用了这种方法,在那里“车辆”通过操纵杆沿着各种路径行驶,它的效果还可以。但是,如果是单向闭合循环,这将完全有效,并且实现起来非常简单。你可以通过平均最近几个增量来平滑车辆的航向角度。此外,每个像素都成为一个“步骤”,因此速度控制很容易。
在前一种情况下,你可以为起始/停止位置或感兴趣的点设置特殊标记端点。在后一种情况下,只需在路径上使用不同颜色的像素来表示特殊节点即可。在任何情况下,你显示的可能都不是底层路径数据,而是你“公园”的某些美化表示形式。
只需选择最简单的方法,并编写一个tick()函数,该函数在汽车行驶时步进到下一个路径位置并更新你的车辆方向。如果你真的很聪明,你可以进行一些基于半径的碰撞处理,以便当轨道上前面的车辆停止时,车辆将自动停止。

0

我认为简单点比较好:

设一个计时器(每100毫秒),在每个计时器上绘制每个汽车的新位置。 位置从文件读取,文件包含汽车的二维坐标(每辆汽车?)。

如果您将道路设计得非常长(假设为30秒),编写30 * 10个点会很困难。因此,将文件中的位置存储在每个整秒处如何?然后在两个时间间隔之间,您将有9个盲区,只需以恒定速度移动汽车(x + = dx / 9,y + = dy / 9)。

我想听听更好的方法 :)


保持他们的位置不动是行不通的。他们可能在等待乘客,等等,等等。 - Mithrax

0

你可以使用一些路径,如你所描述的,固定点路径或样条。然后在此路径上以固定的“速度”移动。如果汽车在直线和转弯时以相同的速度移动,这可能看起来很僵硬。

因此,您可以为每个路径部分设置速度,但是您需要许多速度设置点或混合速度,否则您将获得不连续的速度变化。

或者,您可以进行完整的汽车模拟,并使用A*构建最佳路径。那太过于复杂了,但非常酷。


他只有一条路径……为什么他需要找到“最优”的路径呢? - mpen
他说他有一个固定的赛道而不是单一的路径,我见过的大多数“赛道”都有宽度,如果你想让它看起来更真实,大多数汽车会贴着弯道行驶,在拐角后漂移。 - Simeon Pilgrim

0

如果只有前进和后退,而且你知道想要前进,那么你可以看看周围的单元格,找到与道路颜色相同的单元格并移动,以便保持在道路中心。

如果假设没有突然的曲线,那么可以假设道路直接在你面前,只需向左右扫描以查看道路是否稍微弯曲,以保持在中心,减少处理量。

还有其他方法也可以实现,但我认为这种方法简单,并允许您在道路上拥有平缓的曲线。

另一种方法是基于瓷砖的,所以你只需要看看你前面的瓷砖,并为道路方向变化设置不同的瓷砖,这样你就知道如何转向汽车以保持在瓷砖上。

这种方法可能不太平滑,但也很容易实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接