很早的时候一直有个执念:
我要从0开始,编程写一个obj模型的加载器。
在学习3dsmax的时候,发现这种格式被很多软件所支持,而且导出的文件只含模型和材质,体积很小很干净,建好模型之后通常保存为自身的.max文件后还要导出一份obj文件以备用。
以前用mod工具把游戏里面的3D模型以obj格式导入导出过,比如GTA,战国无双,甚至后来的王者农药等。比如网上下载一个路飞的obj模型导入到GTA中,然后就可以看到……
还有一些七七八八的MOD...我大一大二那会儿玩得不亦乐乎(= =#)。
另外,obj文件本身是ASCII格式,是可读的,所以就想研究研究。总之,OBJ模型有两个优点:文件格式被广泛支持;3D打印机只识别STL或OBJ格式。
然而,现在我都还没有完全实现这个加载器,可能是因为后来我知道了,世界上还有一种叫做“库”的东西存在~ 利用如VTK、Three.js等这些库,可以很轻易地实现obj模型的加载显示,因为作者已经写好了,用户直接调用接口就行了~不过理解OBJ模型文件内容还是有意义的。(此段划掉)(更新:加载器已有实现记录在下篇)
1 实体建模 vs. 表面建模
在说OBJ模型之前,先从大的写起,说说关于3D建模的分类。根据情况可以略过不看。
所有的3D cad软件从机制上来说其实可以分三类:实体建模(Solid Modeling),表面建模(Surface Modeling),和实体建模+表面建模。
即实际上建模方式只有两种:实体建模和表面建模。工程师用的软件偏向于实体建模,而艺术生用的软件偏向于表面建模。
实体建模:
实体建模的工具方式基本上有三种:扫掠,立体布尔运算和表面围成。
扫掠通常指的是将一个平面沿着一条指定曲线做扫掠操作,然后这个平面扫过的空间就成为了目标固体(所谓的平面拉伸,旋转,方样等都属于这个种类)。
布尔运算是对两个固体来求和,求差或者求交。这里指的固体运算其实是指空间的运算。通常计算机都用一种被称为边界限定法来描述一个空间,布尔运算的实质是对这个被限定住的空间做逻辑运算。求和,指的是不同立体空间相加后构成包含了两个空间的新空间。类似的,求差指的是用一段空间去剪切另外一段空间等。
表面围成就比较直接了,这种方法直接通过几个特殊的表面来生成固体,这些表面必须能够围住一个封闭的空间。
表面建模:
表面建模可以用一句话概括:添加或者修改点,让这些点能够