轩辕剑在线(swdol)3D模型浏览器

轩辕剑在线这个游戏的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是绘制三角形面。


下面这个例子观察起来比较直观:

上图是正确的情况,下图故意将一个三角形的面的纹理弄错:




评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值