模拟沿轨道移动的汽车

时间:2009-04-15 20:48:56

标签: opengl simulation motion

对于操作系统类,我将编写一个名为“Jurrasic Park”的调度模拟器。

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

虽然我可以轻松编码,而不必在视觉上显示任何内容,但我不太清楚实现沿固定轨道移动的汽车的最佳方法。

首先,我将简单地使用OpenGL将我的汽车画成矩形,但我仍然对如何更新汽车的位置以及确保它沿着模拟主题的设定路径移动感到困惑公园。

我是否应该在列表中存储轨道的顶点,并且每次调用update()都会使汽车向下一个顶点移动一步?

4 个答案:

答案 0 :(得分:2)

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

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

在前一种情况下,您可以为开始/停止位置或兴趣点设置特殊标记的端点。在后者中,只需在路径上使用不同颜色的像素即可获得特殊节点。在任何一种情况下,你显示的内容可能不是底层的路径数据,而是一些漂亮的代表你的“公园”。

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

答案 1 :(得分:0)

我会保持简单:

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

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

我想听听更好的方法:)

答案 2 :(得分:0)

你可以使用你描述的路径,使用固定点路径或样条曲线。然后在此路径上以固定的“速度”移动。如果汽车在直道上以同样的转弯行驶,那么这可能看起来很僵硬。

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

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

答案 3 :(得分:0)

如果只有前进和后退,并且你知道你想要前进,你可以只看看你周围的细胞,找到那些是道路颜色的那些并且移动所以你留在中心这条路。

如果你认为你不会有突然的曲线,那么你可以假设道路就在你面前,只是向左和向右扫描,看看道路是否有点弯曲,留在中心,减少处理。

还有其他方法可行,但这个方法很简单,IMO,并允许你在你的道路上有柔和的曲线。

另一种方法是将它设置为基于图块的,所以你只需看一下你之前的瓷砖,并为路面方向的变化设置不同的瓷砖,这样你就知道如何让汽车停留在瓷砖上。 / p>

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