我们都玩过3D游戏,里面仿真的程度很高。 这涉及到两个方面的内存一个是场景的设计显示,另外是游戏中内存逻辑的处理。游戏中显示的不只是一幅画面,实际上都是有骨头的这些骨头通常来说都是比较方便计算的几何形体,这些几何形体在逻辑坐标系下面都是有一定的位置的。当然如果只是有几何形体,那么看起来就很丑,游戏中使用了一种贴图的映射方式,你想往骨头上贴什么就贴什么。然后通过键盘的操作就可以进行图形的移动了。人在行走的时候,采用的是移动当前点在逻辑坐标中的位置,这里面变换的实际上是逻辑坐标系在屏幕坐标系的位置。 但是有一条那就是保证当前点是屏幕的中心点 。这么说有点抽象,简单的来说,我们现在站在了屏幕的中央,这就是当前点。现在要在东北方向100单位的位置上画一个球,我们首先要做的是把东北方向100个单位的点移动到屏幕中心。然后开始画这个球。画完以后再把这个球移动到原来的位置。我们在地图中显示的时候使用了相同的方法。我们在地图中向前走,核心是相对运动。就是我们相对地图向前走了,反过来。地图相对我们向后走。现在我们知道了什么是不变得了。 屏幕坐标系是不变的,我们游戏的主角是不变的。逻辑坐标是不断的平移的。
我们继续来看旋转的实现: 游戏的主角在地图中要转弯,这时候他的视觉是围绕着以他为圆心的进行旋转的场景。我们怎么来模拟这个效果呢,我们应该旋转逻辑坐标系。首先需要平移,但是这里的平移和前面的平移不相同。前面的平移是绑定有图形的逻辑坐标系统相对屏幕的平移。也就说形体的逻辑坐标不发生变化。 但是现在的平移是形体在逻辑坐标系中的平移。形体的坐标发生了变化。既然是平移变换,可以用一个向量来表示。记住这个向量,因为我们旋转之后还要进行反平移。我们把当前点作为新逻辑坐标系的原点,然后开始旋转逻辑坐标系。旋转成功后再把逻辑坐标系进行反平移。我们要始终保证场景的逻辑坐标不能变化。 因为逻辑的处理都是以这些坐标为基础的。
再来看看cad中的坐标变换:cad中的逻辑坐标也是不能随便变换的。如果变化了就不是以前的图纸了。显示一张图纸我们需要图形的放大显示。 我们可以这么来是先保证映射方式不发生变换但是映射的单位长度发生变化,这时候被绑定的图形的尺度就也跟着放到缩小了。但是没有这么简单,我们通常是希望,在鼠标的位置处,滚动中间伦,图形是可以放大缩小。也就是说 我们需要一鼠标位置为原点进行放到缩小。首先我们把逻辑坐标相对图形进行移动。逻辑坐标的原点相对图形移动到但钱鼠标所在的位置。记住这个平移矢量,然后做放大变化(逻辑单位长度发生变化),最后在吧逻辑坐标系的原点相对几何形体移动到来来的位置上去 。当然现在的逻辑左边原点和老原点不再相同。
cad中还有空间的旋转的变化: 通常要选择一个局部的坐标系,这个局部坐标系的原点就是形体的几何中心。没有旋转之前的逻辑坐标系的方向和大罗西坐标系的方向是相同的。我们来选钻局部坐标系。是不会发生变化的。图纸中只要有局部坐标旋转的数据就可以了。
游戏系统中的坐标系统:首先来看逻辑空间。游戏的角色要在逻辑空间中做逻辑运算,一个最基本的要求是角色要有基本的建模坐标。但是要在逻辑坐标系中描述当前的角色又显得很麻烦。游戏之中的角色比较多,另外数据的描述也不直观。我们可以引入模型的局部坐标。这个局部坐标系的中心就是模型的几何中心。然后角色的方向就看成是局部坐标的需转方向。在实际逻辑判断中根据需要把局部坐标换成逻辑坐标。这样做思路上比较明确。
游戏中的角色的构建: 我们可以使用点云,然后把点云的三角网结构得到。然后图形用纹理映射映射到三角形上。 现在游戏的角色可以产生了。
分析一下卡丁车游戏的实现,主要是要有个地图,地图上有各种东西。把东西放到逻辑坐标下就可以了,地图是相对不变的。然后是一些细节上的东西。首先是使用物理规律对虚拟的游戏空间进行模拟,包括车的加速,减速,碰撞。这可以用简单的运动学规律来模拟,碰撞的模拟可以使用空间中的动量守恒来处理。然后是车的一些属性的设定。因为车的属性决定了车的性能。
音乐只要调用相关的声音文件使用opengl中的播放函数。
一个游戏中最关键的问题就是上面提到的问题。剩下的问题是附加的。比如好友,留言,小屋,礼品。
以上的游戏在单机版的情况。如果要把游戏编程网络版的考虑的问题会多些。