一种基于pc平台的三维游戏中大型地形生成方法

文档序号:6561412阅读:193来源:国知局
专利名称:一种基于pc平台的三维游戏中大型地形生成方法
技术领域
本发明涉及一种三维游戏的地形开发方法,具体来说,涉及了一种运行于PC平台上的三维游戏中的中大型地形的生成方法。
背景技术
游戏朝三维方向发展是一个大趋势,三维游戏中,尤其在三维网络游戏中,大量的人物同时在一个场景中互动,这就要求有高效率的人物生成算法和场景生成算法。一个高效的大型地形的动态生成算法是一个三维游戏界面好坏的至关重要的因素之一。目前在大型地形的绘制算法中,大多数都是应用于地理信息系统,虚拟现实系统等,应用于游戏的实用算法比较少。本发明正是针对在三维游戏中如何高效的实现大型地形的绘制这个问题,提出了一个基于层次细节(LOD)思想的大型地形生成算法的模型,通过对传统地形生成算法进行优化和改变,使得算法的效率得到了很大的提高,适用于大部分游戏的要求。
现有的地形生成的算法可分成小地形的生成和大地的形生成,小地形的生成比较简单,一般直接绘制地形数据就可以了,而大型地形的生成需要使用各种策略去简化地形数据来实现地形的绘制。该发明研究的范围是在三维游戏中如何高效的实现大型地形的绘制。
目前大型地形的渲染技术主要有两种Voxel和LOD。
Voxel是Volumetric Pixel的合写,又称体素,VOXEL技术出现得比较早。它是用的一种线性插值的办法来形成自然连续的起伏地形。Voxel的优点是渲染的时候它和场景的大小没有关系,绝对不会渲染多余的东西。可以在不使用硬件加速的情况下达到比较理想的速度,生成的图像比较的细腻。缺点是不够的灵活。
LOD是层次细节(Level of Detail)的简称,它是一种使用多边形的,真正的三维渲染技术。它根据一定的规则来简化物体的细节,我们可以根据需要来选择不同细节程度的物体表达方式。它的优点是可以足够自由的去控制我们的场景渲染,更加方便的使用显卡的硬件加速功能。很容易的在场景中组合其他的物体。如树木,太阳以及粒子系统等,它可以方便的让观察者以任意的角度去观察场景,只要让摄影机旋转一定的角度就可以了。缺点是对场景的处理比较复杂。
典型的LOD模型生成算法主要有(1)近平面合并法这类算法检测出共面或近似共面的三角面片,将这些三角面片合并为大的多边形,然后用较少数目的三角形将这个多边形重新三角化。该算法的误差评估准确性较差。它不能保证一定误差限制。
(2)几何元素(顶点/边/面)删除法几何元素删除法由局部几何优化机制驱动,要计算每次删除产生的近似误差。典型的有Schroeder的顶点删除算法,Hoppe渐进网格算法(3)重新划分算法Turk的重新划分算法先将一定数量的点分布到原有网格上,然后新点与老顶点生成一个中间网格,最后删除中间网格中的老顶点,并对产生的多边形区域进行局部三角化,形成以新点为顶点的三角形网格.这种方法对那些较光滑的模型是很有效的,但对于那些不光滑的模型,效果较差;由于根据排斥力重新分布新点,涉及到平面旋转或投影,计算量和误差都较大。
(4)聚类算法Rossignac等的顶点聚类算法通过检测并合并相邻顶点的聚类来简化网格。该算法实现简单、速度快,但是没有考虑到保持原始网格的拓扑和几何结构,有可能生成非常粗糙的近似网格。
(5)小波分解算法Eck等的基于小波变换的多分辨率模型使用了带有修正项的基本网格,修正项称为小波系数,用来表示模型在不同分辨率情况下的细节特征。此算法可以处理任意拓扑结构的网格,而且可以提供有界误差、紧凑的多分辨率表示和多分辨率尺度下的网格编辑。
现有的许多优秀地形生成算法都是比较复杂的。这些算法需要进行简化才能应用于游戏的。本发明提出的算法是一种静态LOD算法,它在传统的地形生成算法的基础上进行优化和简化,提高算法的效率,使得算法可以适用于大多数的三维游戏的要求。

发明内容
针对三维游戏的特点,本发明要达到的技术目的是要提供一种适用于三维游戏的中大型地形生成的方法,通过这个方法既能加强游戏场景地形的变化性、又能提高地形生成的速度,从而减轻游戏中的延迟现象,提高游戏娱乐性能。
在现有的各种优秀的大型地形的生成算法中,几乎所有的算法都是以网格来表示地形的,主流的地形网格形状一般由以下几种形状组成不规则三角形,规则三角形,也就是等腰直角三角形,矩形,正方形。在本发明的算法中采用的是以正方形来分割地形,也就是说地形将会按某种策略分成大小不等的各种正方形,然后采用数组来存放这些正方形。
一种基于PC平台的三维游戏中大型地形生成方法主要步骤包括1)预处理过程。导入数据,并使用一些复合数组结构来存储数据,这种数据结构更简洁,存储数据量也更少。
2)节点评价过程。通过计算地形的每个地方和观察者的距离来决定地形每个地方的细节程度,用越多的正方形去表示这个地形,这个地形的细节度就越高。
3)实时处理过程。当用户视角的位置改变时,实时处理过程会根据节点评价过程算出的地形中的各个部分的细节度来实时渲染各个地形块径。
所述步骤1)预处理过程中的数据存储采用复合数组结构,数据之间的空间关系可以用数组之间的相对关系来描述;地形网格的表示采用正方形,如果不是正方形的地形可以经过处理,变成多个正方形;地形的细节度采用地形块细节度,而且地形块细节度是预储存;第一层的细分,只记录9个点,并用一个二维数组保存这些点,地形块的细分数据中第n层保存的点数为(2n+1-2n+1)2,这些数据用二维动态数组来储存。
所述步骤2)节点评价过程中视点的三维坐标和地形块的三维坐标都垂直投影到xoz平面;所有地形块的必须有一样数量的层次细节数据,MinD+n×PerD=MaxD,其中n为地形块的细节数据的层数,MinD为最小距离值,MaxD为最大距离值,PerD为细节度改变步长。
所述步骤3)实时处理过程包括地形块的显示选择过程和裂缝处理过程,其中使用透视的投影的方式来显示图形对象以减少必须绘制的地形块;在处理地形块之间出现的裂缝时采用的是补救的方法,也就是修补裂缝。
整个算法的过程如下首先从硬盘上读取地形数据,然后经过预处理过程处理,把地形数据取样转化为以另外一种数据格式存放的数据,然后在地形渲染时,实时处理过程会根据节点评价过程对地形节点的细节度的评价去实时渲染地形,最后还会对地形渲染时产生的裂缝进行修补。


图1为本方法的处理过程关系图;图2为本方法的地形块数据结构图;图3为本方法的第一次细分数据结构图;图4为本方法的视点到地形块距离计算示意图;图5为本方法的视域所覆盖的地形块图;图6为本方法的平截头体投影到xoz平面上的等腰梯形图;图7为本方法的地形块显示时有可能出现的裂缝图;图8为本方法的地形块之间的修补多边形图;图9为本方法的实施例1的地形线框图;图10为本方法的实施例1的地形图。
具体实施例方式
下面结合附图对本方法进行进一步阐述。
本发明的三维游戏地形生成方法主要步骤包括预处理过程、节点评价过程和实时处理过程。如图1所示,整个算法的过程如下首先从硬盘上读取地形数据,然后经过预处理过程处理,把地形数据取样转化为以另外一种数据格式存放的数据,然后在地形渲染时,实时处理过程会根据节点评价过程对地形节点的细节度的评价去实时渲染地形,最后还会对地形渲染时产生的裂缝进行修补。
下面对各个步骤进行详细的介绍1、预处理过程作用是导入数据,并把数据转换成另外的一种表现形式。在现有的优秀算法中,大多数经过处理后的数据都会用树型结构来存储,这种存储方式会带来一些效率的问题,在本发明会使用一些复合数组结构,这些结构比树型结构有更高的效率,由于在一些数组的复合结构中,数据之间的空间关系可以用数组之间的相对关系来描述,所以使用这种数据结构会比使用树型结构更简洁,因此要储存的数据量也会大量的减少。
1.1地形块数据预处理过程主要作用是把地形数据读入内存,然后把数据过滤和抽样,形成一个由数组组成的,有层次性的,可高速判断出地形块间相对位置的数据块。这里假设地形的俯视图都是一个正方形,如果不是正方形的地形可以经过处理,变成多个正方形。
未经处理的地形数据一般都是一些连续的三维坐标点,这些地形数据数据量很大,是不可能实时显示的,只能对它进行采样形成地形网格,先对地形数据做第一次的划分,把它划分成规则的正方形组成的地形块二维数组,该数组一般记录了该地形块的四个顶点的x,y,z坐标,以及这个三个坐标的r,g,b颜色属性,指向地形块细分数据块的指针和用来计算地形块到视点距离的地形块中心点的Xc坐标和Zc坐标,如图2所示。
1.2地形块细分数据该算法模型是用于游戏的大型地形的生成,所以要求地形生成必须足够的快,如果按照现有的一些大型地形算法,它们是可以把地形无限的细分下去,这样对地形的显示效果是非常好的,但是却会影响效率。为了提高效率,本发明进行了如下的创新。
第一、在算法中,地形的细节度不再是根据每一个地形取样,如一个正方形,到视点的距离和他本身的细节来决定,这里是采用的是地形块细节度,也就是整个地形块的细节度是相同的,这样地形的显示效果的好坏就由地形块的划分来决定了,由于在游戏中要求的地形显示效果不是必须非常好,使用地形块级的细节度来描述是可以满足要求的。
第二、算法中的地形块细节度是预储存的,也就是在预处理过程中会把每个地形块需要的各个细节度计算出来并储存好,并把地形块本身的细节复杂度都计算在内,例如某个地形块本身是细节复杂的,就把这个地形块细分得比较深,也就是说对本身细节程度复杂的地形块做的细分要比较多,另一个地形块如果其本身就比较平滑,细节程度并不复杂,对这个地形块做的细分就会比较浅,无论是细节度高的地形块,还是细节度低的地形块,都会储存一定数量的不同的细节度的地形块细分数据。
以图形来表示被细分了三次的地形块的细节度表不是如何储存的,如图3所示对于一个地形块A的第一次细分,本应该储存四个正方形,P1,P2,P5,P4;P2,P3,P6,P5;P4,P5,P8,P9;P5,P6,P9,P8,这样就可以在程序中直接绘制了,但由于每个P点里面的数据都是需要保存x,y,z,r,g,b六个浮点数,在第一层的细分中就需要记录16个点的话,那么在第二层就需要记录64个点,是以4的倍数来增长的,如此下去要记录的点数就非常的可观了。因此,算法中选择了另外一种记录点的方法,对于第一层的细分,只记录如图3的9个点,由于地形块内部的连贯性,可以通过这9个点唯一决定4个正方形,这些P点是由一个二维数组去保存,其中的


,[1,0],[1,1],[1,2],[2,0],[2,1],[2,2]对应于P1,P2,P3,P4,P5,P6,P7,P8,P9。由P[x,y],P[x+1,y],P[x,y+1],P[x+1,Y+1]四点组成一个正方形,用程序很容易通过这个9个点画出4个对应的正方形,其它更深的层次也可以依照这个原理去减少要储存的点数,例如在第二层的划分,只需要保存25个点,第三层只需要保存81个点,那么在第n层我们要保存的点数为(2n+1-2n+1)2,n为1,2,3……,而保存每个层次的整个正方形需要保存的点数为22n+2,显然用这种方法储存地形块的细分数据可以大量减少要保存的数据量。
在地形块的细分数据中一般需要储存几个到几十个的层次细分数据,这些数据是以一个非等长二维数组,或叫二维动态数组来储存,使用这种数据结构能方便地查找各个层次的细节数据。
1.3地形块细分方法在上面描述过需要根据地形块本身的细节情况决定需要细分的程度,那么具体是如果决定的呢。一般情况下,会先对地形块做一定次数的划分,这个次数要根据地形块的大小和用户对精度的要求来决定。假设首先要对每个地形块做5次的细分,如果只是简单的对每个地形块记录它们的这五个细节度,那么就不能体现出本身细节比较复杂的地形块细节度就高,本身细节比较简单的地形块细节就低的这一LOD精神了,在初始细分后,要再进行一定的处理,首先要计算出各个顶点的法量NA→=AB→×AD→]]>NB→=BA→×BC→]]>NC→=CB→×CD→]]>ND→=DA→×DC→]]>cosα=(NA→/||NA→||)·(NC→/||NC→||)]]>cosβ=(NB→/||NB→||)·(NB→/||ND→||)]]>通过把对角线两端点法向量的单位向量进行点乘,得出α和β,设定一个阀值ε,当α≥ε或β≥ε时,把正方形进行再细分,然后再按照上面的方法去计算α和β,然后继续判断它们是否大于阀值,直到α和β都小于ε为止。用这种方法的几个意义是使用顶点法向量的夹角的大小来判断该正方形的细节复杂度,夹角越大,该正方形的复杂度就越大,夹角越小,复杂度就越小。
由于在算法中是采用以地形块为单位的统一细节度,对地形块里面的每一个正方形进行判断,只要在当前的细分正方形中有一个正方形符合再细分的要求,那么整个地形块就必须进行再细分。
在算法中每个地形块保存的细分数据的层数是一样的,但是不同的地形块本身的细节度有不同,所以细分的层数也不同,上面已经说了本身细节度越复杂的地形块细分的层数就越多,因此复杂细节度的地形块细分的层数会多于要保存的层数,那么究竟需要保存那些层数呢,在算法中采用的原则是优先保存细节复杂的层数。例如算法设定了每个地形块只能保存5层的细分数据,而某一个地形块细分出了10层的数据1,2,3,4,5,6,7,8,9,10,那么要保存的是6,7,8,9,10层的数据,这就可以保证本身细节越复杂的地形块在绘制时就越细致。
2、节点评价过程节点评价过程的作用是通过计算地形的每个地方和观察者的距离来决定地形每个地方的细节程度,用越多的正方形去表示这个地形,这个地形的细节度就越高。现有算法的评价系统是比较复杂的,要应用在游戏中会有点困难,因此本发明采用一种比较简单的策略去实现这个过程。
节点评价过程被实时处理过程调用。节点评价过程的主要工作是计算每一个地形块和视点的距离从而判断该地形块所使用的细节度,为了提高判断的效率,把判断从三维降到二维,也就是视点的三维坐标垂直投影到xoz平面上,同时把地形块的三维坐标垂直投影到xoz平面上,这样就可以在xoz平面上判断视点到地形块的距离了。在判断视点到地形块的距离是用视点到地形块中心的距离来代替的,由于视点的x,z坐标是给定的,而地形块中心的x,z坐标在预处理中已经计算出来了,虽然地形块中心的坐标在运行时不断的变化,但是只是在做简单的二维坐标变换,所以计算视点到地形块的距离是比较简单的,图4所示是视点到地形块距离计算的示意图。
在预处理过程中对每个地形块都记录了一定数量的不同层次的细节数据,而且都为这些细节度不同的数据编了号,按照顺序,号码小的细节度小,号码大的细节度大。结合这里的距离计算,距离小的使用较大细节度的数据,距离大的使用较小细节度的数据,为了完成节点评价的工作,该过程设定了几个值,分别是最小距离值MinD,最大距离值MaxD,细节度改变步长PerD,这个细节度改变步长是一个用来判断是否改变细节度的量,如果视点到地形块的距离每增加一个PerD,那么这个地形块就要降低一个细节度,如果减少一个PerD,那么这个地形块就要增加一个细节度。MinD,MaxD,PerD都是可以调整设定的,通过这三个量的设定,就可以得到地形显示的不同效果。
由于当Distance在MinD和MaxD之间时,是按照最小距离加上步长的倍数来决定所使用的细节度数据,而且MinD,MaxD和PerD是对所有地形块都适用的参数,所以必须做出以下的约束1)所有地形块的必须有一样数量的层次细节数据;2)MinD+n×PerD=MaxD;n为地形块的细节数据的层数。
当判断了Distance在MaxD和MinD之间的时候,可以使用下面公式来计算所使用的层数n=MaxD-int((Distance-MinD)÷PerD)int是取整函数,n是所采用的细节层数。
3、实时处理过程这是一个动态过程,不像预处理过程在算法中只被调用一次,实时处理过程在算法的全过程都会起作用。实时处理过程和节点评价过程是一起工作的,在算法中,当用户视角的位置改变时,实时处理过程会根据节点评价过程算出的地形中的各个部分的细节度来实时渲染各个地形块。
3.1地形块的显示选择在该算法中,地形数据已经被划分成一个个的地形块,在实时的地形绘制中,一般不是所有的地形块都必须绘制,由于视域的限制,常常只会绘制一部分的地形块,虽然在使用图形绘制链接库绘制图形时,图形库的算法会自动进行剪裁,但是如果把整个地形数据交给图形绘制链接库去进行剪裁会降低算法的效率,减慢绘制的速度,因此必须在绘制地形时选出那些地形块是在视域以外的,以便减少要绘制的地形块。实时处理过程的主要任务就是判断哪些地形块可显示,哪些地形块不可显示。
如图5所示,视域并不是覆盖了所有的地形块,其中1到11的地形块是不需要绘制的,必须使用某种策略把这11个地形块挑选出来。
和节点评价过程一样,把视点和地形块都正投影到xoz平面上来判断地形块的显示问题。在使用图形库(如OpenGL)绘制图形时,一般都会选择透视的投影方式来显示图形对象,因此需要用户设置一些参数来定义一个显示平截头体,只有在这个平截头体内的对象才会被投影出来,把这个平截头体正投影到xoz平面上,就能得到一个等腰梯形,如图所示,梯形BCDE就是平截头体在xoz平面上的正投影,现在只要判断地形块在xoz平面上的投影是否在BCDE中就可以了。因为地形块只要有一部分在这个梯形中,那么就要绘制整个地形块,所以首先判断地形块中心点是否在这个梯形中,如果是,那么这个地形块就必须被绘制;如果地形块的中心点不在这个梯形中,那么还要判断这个地形块的四个顶点是否在这个梯形中,只要有一个顶点在这个梯形中,这个地形块就必须被绘制,由于大部分的地形块都是在这个梯形中的,所以大部分的地形块只要判断他们的中心点是否在梯形中就可以完成判断了,只有小部分的地形块除了判断中心点外还要判断四个顶点,所以这个的判断方式效率是比较高的。
3.2裂缝处理在地形网格显示的时候还有一个问题,就是地形块之间可能会出现裂缝,要想办法解决这个裂缝问题。裂缝出现的原因是因为不同的地形块之间的细分程度不同,因此在地形块的边界上的某些点有可能在y轴上出现两个不同高度的点,如图7所示,裂缝的处理一般分为两种方式,一种是预防,就是在绘制地形块的时候通过某些约束条件来约束绘制的过程,使得裂缝不会出现;第二种方式是扑救,就是出现了裂缝之后,想办法来把裂缝消除。在本发明中采取的是补救的方法,也就是修补裂缝。
在地形块的数据结构中有一个CurrentDetail的项是用来记录地形块当前绘制的细节度的,在所有的地形块都绘制完成后,再遍历一次需要绘制的地形块,判断地形块之间的细节度是否相同,如果不相同则要进行修补。由于不同地形块之间的裂缝一般是一个多边形,只要遍历两个地形块之间的边上的点,绘制一个多边形就可以完成裂缝的修补了,如图8所示。
如图9和图10所示,游戏三维引擎是“用于控制所有游戏功能的主程序,从计算碰撞、物理系统和物体的相对位置,到接受玩家的输入,以及按照正确的音量输出声音等等”。一个三维引擎一般由以下几个部分组成图形子系统,就是用某种图形库来绘制图形的子系统,例如使用OpenGL,DirectX等。
1)输入子系统,负责处理所有输入(键盘,鼠标,游戏摇杆),并把它们统一起来进行抽象化。
2)声音子系统,负责加载和播放各种声音。
3)时间子系统,实时三维游戏引擎中绝大部分功能都需要基于时间来进行的,所以引擎必须有一个管理时间的子系统。
4)配置子系统,负责管理配置文件,使得开发人员或用户能方便的配置游戏中的各种参数,如分辨率,颜色深度,键盘设置,声音选项等。
5)控制台,通过控制台,开发人员能方便的改变引擎设置,或得到调试的输出信息。
6)支持子系统,它是支持系统运行的底层的东西,包括基础的数据结构,基础的算法,内存管理,文件加载,容器管理等等。
7)渲染引擎,这是一个非常重要的子系统,所有游戏特效都是有这个子系统负责,也就是说这个子系统包含有很多的特效算法,例如网格,光照,阴影,雾化,粒子系统,物理系统等。
8)游戏接口层,是一个把游戏逻辑和游戏引擎联系起来的一个接口,把引擎包围起来,向游戏逻辑提供各种操作,这样就可以最大限度地重用这个引擎。
权利要求
1.一种基于PC平台的三维游戏中大型地形生成方法,它的主要步骤包括1)预处理过程导入数据,并使用一些复合数组结构来存储数据,这种数据结构更简洁,存储数据量也更少;2)节点评价过程通过计算地形的每个地方和观察者的距离来决定地形每个地方的细节程度,用越多的正方形去表示这个地形,这个地形的细节度就越高;3)实时处理过程当用户视角的位置改变时,实时处理模块会根据节点评价模块算出的地形中的各个部分的细节度来实时渲染各个地形块径。
2.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤1)预处理过程中的数据存储采用复合数组结构,数据之间的空间关系可以用数组之间的相对关系来描述。
3.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤1)预处理过程地形网格的表示采用正方形,如果不是正方形的地形可以经过处理,变成多个正方形。
4.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤1)预处理过程中地形的细节度采用地形块细节度,而且地形块细节度是预储存。
5.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤1)预处理过程中,第一层的细分,只记录9个点,并用一个二维数组保存这些点,地形块的细分数据中第n层保存的点数为(2n+1-2n+1)2,这些数据用二维动态数组来储存。
6.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤2)节点评价过程中视点的三维坐标和地形块的三维坐标都垂直投影到xoz平面。
7.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤2)节点评价过程中所有地形块的必须有一样数量的层次细节数据,MinD+n×PerD=MaxD,其中n为地形块的细节数据的层数,MinD为视点到地形块的最小距离值,MaxD为为视点到地形块的最大距离值,PerD为细节度改变步长。
8.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤3)包括地形块的显示选择过程和裂缝处理过程。
9.根据权利要求1所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤3)实时处理过程中使用透视的投影的方式来显示图形对象以减少必须绘制的地形块。
10.根据权利要求8所述的基于PC平台的三维游戏中大型地形生成方法,其特征在于,所述步骤3)实时处理过程中,在处理地形块之间出现的裂缝时采用的是补救的方法,也就是修补裂缝。
全文摘要
本发明涉及一种运行于PC平台上的三维游戏中的中大型地形的生成方法。本方法主要包括三大过程预处理过程,节点评价过程,实时处理过程。首先从硬盘上读取地形数据,然后经过预处理处理,把地形数据取样转化为以另外一种数据格式存放的数据,然后在地形渲染时,实时处理过程会根据节点评价过程对地形节点的细节度的评价去实时渲染地形,最后还会对地形渲染时产生的裂缝进行修补。这个方法针对三维游戏中的地形生成的特点,对传统的地形算法进行了优化,提高了生成的效率,既能加强游戏场景地形的变化性、又能提高地形生成的速度,从而减轻游戏中的延迟现象,提高游戏娱乐性能。
文档编号G06F19/00GK1936962SQ20061012265
公开日2007年3月28日 申请日期2006年10月10日 优先权日2006年10月10日
发明者王建民, 由芳, 郑子斌, 赵宏坚, 罗笑南 申请人:中山大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1