轩辕剑在线这个游戏的MODEL有很多以PLY作为扩展名的文件,这个文件为三维模型文件,该文件进行了lzo算法的压缩(swdol很多文件都是这样干的),解压后从这个文件中可读取到模型的顶点数、每个顶点的坐标、三角形面的个数、以及三角形面的三个点使用的是那几个顶点的坐标、然后是三角形面对应的纹理贴图文件的编号,以及在播放动画时(见软件中的Q键效果),这些顶点是怎么变化的。
贴图文件位于和MODEL同级的TEX目录,以ALL加上5位数的变化命名,以TEX结尾。例如:ALL00002.TEX
这种TEX文件经过lzo解压后,得到的就是位图格式的图片文件。
早先得到一个 "回梦"的一份代码,编译出来的结果和下面这个二进制版本接近。
http://download.csdn.net/detail/q3020025470/6795453"回梦"这个QT版本的浏览器,其核心代码基本来自于"谁伴我一生闯荡"的VC6.0的代码工程。
这两个版本,都存在贴图错误和显示控制的问题。
测试了几个模型都使用了2个贴图文件,修改代码,要不然就使用第一个贴图文件的内容,要不就是第二个。
仔细看了下通过三角形面索引找贴图索引的逻辑存在问题。这个是对ply文件数据结构的理解不正确导致。
再有就是代码中paintGL函数,先调用glBegin(GL_TRIANGLES); 再调用的glBindTexture,这个调用顺序有问题,会导致bind的纹理不生效。
原始版本中对模型显示的控制方法非常别扭,见下图的基本操作,也进行了修改。
原始版本:
修正后版本
代码放在:
https://git.oschina.net/swdol/plyViewer
编译好的工具从这里下载:
https://git.oschina.net/swdol/plyViewer/attach_files
http://download.csdn.net/detail/jerryutscn/9577437
在翻阅资料时,找到下面这个链接,从浅入深,讲的比较详细
OpenGL入门学习
http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html
使用GL_TRIANGLES绘制一个三角形面,然后贴纹理:
glBegin(GL_TRIANGLES);
glTexCoord2f(pp[face[i].index1].U,pp[face[i].index1].V );
glVertex3f(pp[face[i].index1].x/scaled,pp[face[i].index1].y/scaled,pp[face[i].index1].z/scaled);//上顶点坐标
glTexCoord2f(pp[face[i].index2].U,pp[face[i].index2].V );
glVertex3f(pp[face[i].index2].x/scaled,pp[face[i].index2].y/scaled,pp[face[i].index2].z/scaled);//左下角坐标
glTexCoord2f(pp[face[i].index3].U,pp[face[i].index3].V );
glVertex3f(pp[face[i].index3].x/scaled,pp[face[i].index3].y/scaled,pp[face[i].index3].z/scaled);//右下角坐标
glEnd();
glTexCoord2f函数用来从当前纹理,利用U.V这两个浮点型的x,y坐标,完成贴图动作。
glVertex3f是绘制三角形面。
下面这个例子观察起来比较直观:
上图是正确的情况,下图故意将一个三角形的面的纹理弄错: