?本文源自: http://dev.gameres.com/Program/Visual/3D/OpenGLTutorial/OpenGL_7.htm
OpenGL中的物体是用面边界模型来描述的。我们将物体表面分割成许多个平面,记录面的形状、颜色、纹理,OpenGL根据这些参数再把这些个面绘制出来,我们就能在场景中看到立体的实体了。
物体模型最基本的参数是它的形状,形状可以用表面来记录。而记录面的边缘就能描述面的形状。描述边缘的方法是记录边上所有线段的端点。所以用面边界模型描述物体形状的核心就是记录物体表面所有的顶点。这些顶点按所在边的顺序排列起来就能描述一个平面,许多的平面就能表示一个物体的表面,显然平面越多形状越逼真。
OpenGL中描述一个顶点的方法是指定其坐标和属性,命令是:
glVertex*(Coordination);
该命令以参数指定的坐标和当前颜色、纹理坐标、法向等属性定义一个顶点。
OpenGL中描述一个面的方法是glBegin/glEnd命令组:
glBegin(形状);
glVertex(顶点1);
glVertex(顶点2);
??
glEnd();
OpenGL支持点(GL_POINTS)、线段(GL_LINES)、三角形(GL_TRIANGLES)、四边形(GL_QUADS)、多边形(GL_POLYGON)。可以在一个begin/end对中定义多个同一类型的平面,如在glBegin(GL_TRIANGLES);与glEnd();之间输入11个顶点,则会形成3个三角形,最后两个顶点则被舍弃。
OpenGL还支持平面带(STRIP)和平面扇(FAN)。
扇:在glBegin(GL_TRIANGLE_FAN);/glEnd();间输入若干顶点,则第一个顶点做为共同的顶点,第二、三个做为底边定义一个三角形,此后的每个顶点与前一个顶点做为底边定义一个三角形,所以11个顶点就会定义9个共顶点的三角形,这些三角形将形成一个扇形。
带:输入顶点编号为123456789??;定义的三角形为132 243 354 465 567??,相邻三角形共用一条边,形成一条带状;依此类推,定义的四边形为1243 3465 5687??。
实际使用中,可用3ds max/softimage/maya之类的工具以直观的方式建立物体模型保存成文件,然后再用专门的解码工具将模型转换成一系列的顶点。解码工具有三类:插件、工具软件、程序库。目前已经有许多的代码库可以解析多种格式的三维场景,如果还没有合适的还也可以自己编写。
3ds max带有一个简单的.asc导出器,但功能很弱,而3dxexp则强大得多,要是不满意还可以自己写,这就得学习学习MAX SDK了。
使用3ds2c之类的工具将模型转换为C代码是非常简便的一种方法,但从效率方面考虑,并不是最好的,特别是象PolyTrans之类的软件会为每个面生成一个Begin/End,象下面的这个模型,.3ds文件只有978K,而转换得到的.C文件却有6.8M之巨。稍好一点的办法是充分利用STRIP或使用VertexPointer技术,或者利用wc2pov之类的工具将转换后的多边形数据保存在文件中,使用时再调入;还有一种办法就是view3ds所用的将场景转化为编译后的glList保存起来,在使用时装入系统直接调用,速度非常快。
T_FIGHTER(Hight detail)
根本的解决办法还是针对自己的应用设计优化的文件格式,并制作配套的编码、解码库。
处理各种格式三维文件的程序库非常多,到网上随便搜搜就能找到一大把。目前俺最喜欢的是GLScene (类示意图1 2 3),它内建树形场景支持,可解析.3ds文件和.md2文件,可扩展性极好,可惜只有delphi版本。