游戏中的地形和碰撞

时间:2011-04-15 03:09:50

标签: java android game-physics terrain

我正在尝试创建一个新的游戏,其中车辆沿着地面行驶,但也有能力使用推进器暂时空降。

我对游戏编程比较陌生,但我擅长编写Java,C,C ++等编码,所以我不认为这应该是一个问题(认为游戏的第一次迭代是用Java编写的)。我的问题是,我从头开始,并没有想到地形成为障碍的方式,因此车辆不会直接通过它。我怎么能让他们受到坠落伤害?

过去人们已经把我带到了Replica Island的源头,因为它已经有了它,我看到了整个碰撞系统,但到目前为止我还没有理解它,我希望有人会愿意伸出援助之手。

谢谢

-Roflha

2 个答案:

答案 0 :(得分:5)

你用什么来开发游戏?引擎或图形库?基本上有三个级别(我喜欢考虑它们):图形库,图形引擎和游戏引擎。

  • 图形库几乎就是这样 你可以获得低级别:OpenGL或 的DirectX。什么时候想抽出来 你的地形,你将绘制为 一个三角形网格,并定义 这些三角形的顶点等

  • 图形引擎位于顶层 那个。那些例子(对于C ++ 至少)是Ogre3D,Horde3D和 Irrlicht的。他们会照顾一个 很多低级命令,和 让你专注于更多的图形 更高层次的立场。

  • 游戏引擎非常需要 关心任何图形相关的。 这些(再次是C ++)的例子是 Unity和UDK。他们一般都可以 很多游戏编程 您。你可能会画你的 建模程序中的地形 (3dsmax等),将其导出到某些 格式,然后引擎会啜饮它 了解如何处理它。

我玩过这三个,找到最有趣的图形库。然而,他们可能花费最长的时间来制作游戏。它们还涉及更多的数学(线性代数)。

对于地形的碰撞检测。您必须了解构成该地形的三角形。如果您正在使用游戏引擎,您应该能够在某种“场景节点”中存储地形的网格和角色的网格,并且它将自动处理碰撞检测。但是,如果您自己处理所有事情,有许多流行的算法可以做到这一点:

  • 包围盒:即使你的角色形状像人(或动物等),你也可以将它们视为一个盒子,并检查该盒子与构成你地形的网格的三角形相交。
  • Bounding Sphere:将角色视为一个球体,因为如果它们碰撞,球体更容易被看到。您只需使用“从球体中心到另一个网格的距离”检查“球体半径”。然后,如果该球体发生碰撞,则将其分解为更准确地表示角色的较小球体。你可以从那里进行3到4次迭代,或者准确地表示你的角色。但请记住,游戏中的所有内容都需要快速快速,因此这就是限制递归的原因。

An excellent article on bounding sphere collision detection

我编写了一个示例OpenGL程序,它基本上让一个由边界框表示的角色绕地形走动,这需要碰撞检测。如果您对它的工作原理更感兴趣,请告诉我。

您可以通过以下几种方式处理坠落伤害:

  1. 如果角色没有飞行,您可以使用简单的状态机。一旦他们进入空中,将状态更改为“IN AIR”,并且在游戏外观运行时,设置计时器并跟踪他们在空中的时间。如果它们在空中时间过长,则根据它们的存在时间计算不同的伤害量。
  2. 更准确的方法是跟踪角色的y速度。这对现实生活是准确的。如果你慢慢地坠落,那么坠落伤害是没有意义的。如果你快速下降,你会越快受伤。因此,想出一些将fall_speed与损伤联系起来的方程式。然后,一旦它们到达地面,将状态机改回“ON_GROUND”并检查fall_speed(可能是y_velocity)。

答案 1 :(得分:2)

你可能还想尝试Nvidia PhysX,除了它的名字所暗示的(你想要模仿汽车物理学是让我想到它的原因),某些实用程序也暴露了许多功能,例如碰撞检测,四元数学等。

我正在使用Ogre,一个开源图形引擎(到目前为止; - )......在OpenGL-DirectX和Linux-Microsoft之间切换相对容易),这也有很多内容。

既然你已经知道如何编写代码,我会建议上面的内容是可行的,而不是替代方案,而是开放源代码;所以你只需重新发明你想要的轮子部分。