3

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

我的最终目标是让一系列汽车沿着固定的路径行驶,乘客在固定的位置排队等待这些汽车返回,这样他们就可以被接走并被带上游览。这将是一个简单的 2d、自上而下的轨道和沿轨道移动的汽车的视图。

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

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

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

4

4 回答 4

2

如果您想要曲线轨道,您可以使用样条曲线,它是由两个矢量端点指定的数学定义曲线。你扑通一声放下端点,然后求解它们之间的一条漂亮的曲线。搜索应该显示可以导出到源代码中的源代码或数学。这样做的好处是您可以准确地求解车辆的航向,并通过百分比计算获得路径上的下一个位置。困难的是,如果您不希望每组端点之间的步数相同,则必须进行曲线长度计算。

另一种方法是使用隐藏位图,其上绘制的路径为单像素宽曲线。您可以通过将当前位置周围的像素与行进方向矢量相匹配,然后在每一步使用 delta 函数更新矢量来找到路径中的下一个位置。我们将这种方法用于路径行驶原型,其中“车辆”正在使用操纵杆沿着各种路径“驱动”,并且在您遇到一些混淆矢量计算的交叉点之前它可以正常工作。但是,如果它是一个单向闭环,这将工作得很好,而且实现起来非常简单。您可以通过平均最后几个增量来平滑车辆的航向角。此外,每个像素都变成一个“步”,因此您的速度控制很容易。

在前一种情况下,您可以为开始/停止位置或兴趣点特别标记端点。在后者中,只需在路径上为特殊节点使用不同颜色的像素。在任何一种情况下,您显示的可能都不是基础路径数据,而是您的“公园”的一些美化表示。

只需选择最简单的方法,然后编写一个 tick() 函数,该函数将步进到下一个路径位置,并在汽车行驶时更新您的车辆方向。如果你真的很聪明,你可以做一些基于半径的碰撞处理,这样当赛道上前面的汽车停止时,汽车会自动停止。

于 2009-04-16T23:48:17.040 回答
0

我会保持简单:

运行一个计时器(每 100 毫秒),并在每个计时器上绘制新位置的每辆汽车。该位置是从一个文件中读取的,该文件包含汽车的 2D 坐标(每辆汽车?)。

如果您将道路设计得非常长(比如说,30 秒),写 30*10 点将是……很难。那么如何在文件中存储每一整秒的位置呢?然后在这 2 个间隔之间,您将有 9 个盲点,只需以恒定速度(x += dx/9,y+= dy/9)移动汽车。

我想听听更好的方法:)

于 2009-04-15T20:56:06.513 回答
0

好吧,您可以按照您的描述使用一些路径,以太固定点路径或样条曲线。然后在这条路径上以固定的“速度”移动。如果汽车在直道上的移动与转弯的花费相同,这可能看起来很僵硬。

所以你可以为每个路径部分设置速度,但你需要许多速度设定点,或者混合速度,否则你会得到不平稳的速度变化。

或者您可以进行全车模拟,并使用 A* 来构建最佳路径。这已经结束了,但非常酷

于 2009-04-15T20:58:42.997 回答
0

如果只有前进和后退,而你知道你想前进,你可以看看你周围的单元格,找到那些是道路颜色的单元格,然后移动,这样你就可以留在道路的中心.

如果您假设您不会有突然的弯道,那么您可以假设道路就在您的正前方,然后向左和向右扫描以查看道路是否有点弯曲,保持在中心,减少关于加工。

还有其他方法可以奏效,但这种方法很简单,IMO,可以让您在道路上拥有平缓的曲线。

另一种方法是让它基于图块,因此您只需查看您面前的图块,并根据道路方向的变化使用不同的图块,这样您就知道如何转动汽车以保持在图块上。

这不会那么顺利,但也很容易做到。

于 2009-04-15T20:59:36.753 回答