3DS文件在菠菜网站开发OpenGL的读入和显示

学习菠菜网站开发 dsluntan.com VX:17061863513了Blender之后,很想将自己设计的模型载入自己编写的程序中,因此考虑了比较常见的3DS文件格式。这回尝试着将3DS文件载入自己写的OpenGL程序并且显示出来。

首先查找了许多现成载入3DS格式的例子,发现只有一个程序是可以运行的,于是就拿这个程序的源代码进行研究。同时查看了一些国外的格式说明文档,结合Blender中Outliner中数据的组织,我开始了解3DS格式的组织方式。

3DS文件是二进制的,并且是Autodesk私有格式,很多兼容软件都是根据已知破解的内容来进行读取的,因此不同软件对于它读取的效果会不同,高手们建议只将网格模型导出至3DS,因为光源和摄像机无法保存。

3DS文件的内部有种被称作“块(chunk)”的结构,用来阐述三维场景中各种各样的对象。其实这里所说的“块”和wav文件里面的块差不多,都包含了头(header)和内容(content)。3DS中的块的头包含了ID(占两字节)和长度(占四字节),其中长度则是块的整个长度。而块的内容长度为块的整个长度减去6字节。

举一个例子,主块的ID是0x4D4D,我们可以这样做:读取块ID两个字节,随后读取四字节块的长度(设为length),这样我们知道之后最多还需要读取(length- 6)个字节。

3DS中数据组织结构是树状的,而树中每一个节点也就是块结构,由于树中各个层次有着相似性,根据数据结构中遍历树的知识,我们可以编写深度优先搜索算法,并且使用递归的思想来完成。

3DS树中的叶子节点通常有着特定的解析方法。比如说读到了顶点(ID是0x4110),要求我们先读取两个字节的顶点个数n,再循环n遍读取各个顶点的xyz坐标。

3DS文件内的坐标系与OpenGL和Direct3D的都不同,XY轴确定了水平面,Z轴则是垂直的。在解析的初期我也曾经将它的所有顶点的XYZ值通过交换和去反来对坐标轴进行替换,但是后面需要解析一个模型矩阵,如果仅仅对坐标轴替换而不对模型矩阵进行替换的话,那么解析后形成的模型会出现错位的现象。这会变得非常麻烦。即使可以通过修改模型矩阵的前3×3部分而达到目的,我还是觉得建模的时候通过将模型的坐标系转换成Direct3D的左手坐标系或者OpenGL的右手坐标系会更好一些,同时也会免去一些不必要的转换工作。

解析完3DS文件之后就需要显示它了,很遗憾,目前我使用的Blender导出的3DS不含灯光和摄像机,因此效果没有Blender软件中编辑得那么好。此外,3DS中默认的图元是三角形,也就是说多边形图元在导出的时候会被细分成一个个三角形来保存。因此在OpenGL中直接指定glBegin(GL_TRIANGLES );就好了。

原文地址:http://blog.51cto.com/13921265/2159080

时间: 2024-12-11 22:08:49

3DS文件在菠菜网站开发OpenGL的读入和显示的相关文章

js的arguments菠菜网站开发搭建到底是什么

arguments的属性接下来我们来看看arguments对象里面到底有些什么东西,是骡子是马拉出来溜溜. function showargs() {console.log( arguments );} showargs(1,2,3,4,5);下面我们用console.log的方式,将arguments对象输出到控制台,这里不得不说一句,chrome的console工具好用得不得了(我不是来打广告的). arguments 这里我们可以看到arguments对象将我传入的五个参数以数组的形式保存

手机网站开发-viewport-按照手机尺寸显示页面

最近在写手机网页,总结两个方法 1. 网页宽度可固定为640px,然后使用viewport实现页面在不同手机页面显示 网页中插入script代码 <script type="text/javascript"> if(/Android (\d+\.\d+)/.test(navigator.userAgent)){ var version = parseFloat(RegExp.$1); if(version>2.3){ var phoneScale = parseInt

在access中如何创建数据库?你认为数据库在网站开发中所扮演的角色是什么?使用数据库和使用文件,两者的优缺点是是什么?

1.启动ACCESS建空数据库,给数据库取名"数据库名".2.建一个表,如果有excel数据可直接导入或在设计视图里面建表,如段名分别为:学号.姓名.性别.出生日期.家庭住址等.给表取名"表名".3.用数据表做数据源,建立需要的查询.一个简单的数据库就建成了.我认为数据库在网站开发中扮演者重要的角色,它掌管着大量的重要数据.它是网站开发的核心,也可以说它是一个默默无闻的工作者 数据库是用来存储数据的,其中分好多类,小型的有ACCESS,中型的有SQL SERVER,

js的arguments迪士尼彩乐园菠菜网站源码开发到底是什么?

arguments的一些妙用1.利用arguments实现方法的重载 下面我们利用arguments对象来实现一个参数相加的函数,不论传入多少参数都行,将传入的参数相加后返回. function add() {var len = arguments.length,sum = 0;for(;len--;){sum += arguments[len];}return sum;} console.log( add(1,2,3) ); //6console.log( add(1,3) ); //4con

curl网站开发指南

curl网站开发指南 作者: 阮一峰 日期: 2011年9月 4日 我一向以为,curl只是一个编程用的函数库. 最近才发现,这个命令本身,就是一个无比有用的网站开发工具,请看我整理的它的用法. =================================== 阮一峰 整理 curl是一种命令行工具,作用是发出网络请求,然后得到和提取数据,显示在"标准输出"(stdout)上面. 它支持多种协议,下面举例讲解如何将它用于网站开发. 一.查看网页源码 直接在curl命令后加上网址,

ASP.NET MVC5 网站开发实践(二) Member区域 - 添加文章

转自:http://www.cnblogs.com/mzwhj/p/3592895.html 上次把架构做好了,这次做添加文章.添加文章涉及附件的上传管理及富文本编辑器的使用,早添加文章时一并实现. 要点: 富文本编辑器采用KindEditor.功能很强大,国人开发,LGPL开源,自己人的好东西没有理由不支持. 附件的上传同样基于KindEditor实现,可以上传图片,flash,影音,文件等. 目录 ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一)

Asp.net网站开发

就现在来说网站开发大多数还是用的asp.net,其实网站开发也并不是很难,只要学好asp.net,再一步一步的分析网站的需求,就能写出来. 网站开发是制作一些专业性强的网站,比如说动态网页.ASP.PHP.JSP网页.而且网站开发一半是原创,网站制作可以用别人的模板.网站开发字面意思比制作有更深层次的进步,它不仅仅是网站美工和内容,它可能涉及到域名注册查询.网站的一些功能的开发.对于较大的组织和企业,网站开发团队可以由数以百计的人(web开发者).规模较小的企业可能只需要一个永久的或收缩的网站管

MVC5 网站开发实践 2.2、管理员身份验证

上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践  概述 MVC5 网站开发实践  1.建立项目 MVC5 网站开发实践  2.后台管理 MVC5 网站开发实践  2.1.管理员登陆 一.解决问题Home控制器错误提示 @泰德  在评论中说浏览器中打开存在以下错误.这是因为项目中存在多个Home控制器,但系统不清楚你要访问的是哪个控制器的内容,因此

简化网站开发:SiteMesh插件

在编写一个网站时,几乎所有的页面都会有相同的部分.比如顶部的导航栏,每个页面都是一样的,底部的版权声明,每个页面也都是一样的. 那么在编写顶部导航栏的时候,第一种方法就是直接复制导航栏的全部代码,这种方法初期开发很简单但是后期维护简直就是噩梦,要是导航栏要增加一个按钮,所有的页面都要修改,非常麻烦. 第二种方法是将顶部导航栏专门写到一个文件中,所有的页面include这个文件.这样每个页面都要写一个include语句.后期修改只要改一个文件就可以了.但是这种方法写出来的导航栏文件它不是一个完整的