关于ply, obj, 3ds 等三维模型文件的Loader

最近需要读入三维模型到自己的程序中,做了一些用visual studio读取ply, obj, 3ds 倒入到 OpenGL 的工作,简要谈下感悟吧。

  20100106144514531

Figure1: stanford bunny(ply)

20100106153734234 monster

   Figure2        a) foot(obj)                 b) monster(3ds)

1、我们要读取一个文件类型,首先要了解它是怎么存的,其header包含什么。比如说3ds是按照块(chunk)存的,并且是嵌套的,各个块都有自己的标识。 Ply的header先是类型、版本信息,之后是comment(可能没有),下来就是各种element及其property的声明。这些标识和声明,都为我们先提供了该文件的outline,比如有多少个vertex,多少个face,这样方便我们编写循环。

2、文件存在计算机中,是二进制,也就是说各种信息都是一个bit一个bit的0和1。所以要进行语法分析,parse(这个词编译原理中时候讲过)。你怎么知道你下一次要读入多少个字节的内容?你怎么把一串串的0和1进行解读(interprete)?在研究ply文件的时候,看了一篇外国文章讲得很不错:http://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/

文章虽然是关于big endian binary和little endian binary的(这两个都是ply文件的一个存储子类型),但是里面讲到很多基础和细节的,比如number和data的在概念上的区别(GIS课上讲过);还有就是读文件过程中指针的操作,很强大;float的格式的原理,怎么一串串0和1换算成一个浮点。

3、获得到了足够的信息,下一步就编写一个循环--不断进行判断、读取和存储这么一个过程。读取经常用到的一个是fread(buffer, size, count, fp), 第一个变量是存储缓冲区指针;第二个变量是读取块的大小,即占几个byte,对于float 格式可以填 sizeof(float), 或者直接给4;count是读几个块;fp是文件。

我以前认为.3ds文件存顶点索引无序的看法不太对,其实不管是什么文件,3ds也好,obj也好,ply也好,都存在规范化和非规范化这么一个概念。规范的网格面片(输出的时侯对存储是比较讲究的, 应该和诸如delaunay triangulation有关),三角形中,三个点的顺序是按一定时针转向和法向量对应的(也就是说按固定的序号叉乘cross product计算出的法向量是木问题的)。

就我们编写或者应用的Loader而言,我们所能处理的情形是相当有限的。我在Game-Dev求助ply loader的事情,热心的丹麦哥们这么回答的:

"…….(About the ply format) The problem is that the format is very broad, so you need a lot of code to correctly handle all possible files.
However, unless you really, really need to load PLY models I would suggest going for obj files instead. The format is less ambiguous, so it's easier to parse…."

很多文件都是不规则的存储(一会是四边形信息,一会是五边形,一会是面)。对于这些文件,法向量算不对是情理之中的,不可能任意模型随拿随用。对于我们自己编写的非专业的Loader,应该找适用于loader的模型,如果只想提高loader的tough性,会有很多码工要完成。老外的回答同样告诉我们,.obj各式的文件比较容易handling, 这也就是为什么应用广泛吧。

最后感慨一个就是,国内的代码下载,pudn, csdn, 大量的无意义和错误代码,很多都是把国外的抄过来,各种错也不管。相比之下,国外的更愿意也更懂得sharing。

大家要想用Loader, 推荐几个:

ply, Greg Turk的范例,此人是gatech的教授。

3ds, spaceship simulator tutorial 4, 这个代码比较好。有个小问题就是,不能一次操作读入多个object

obj的比较多了

Feel free to contact me

原文地址:https://www.cnblogs.com/antai/p/modelLoder.html