上文书说到,assimp可以用来读取相当多种模型格式,用它来做格式转换工具非常合适。然而,遇到坑是不可避免的。本篇就来讲讲我这些天遇到的坑,以及如何越过它们。
坑大:多边形
很多模型格式,比如obj,是可以支持各种多边形类型的。而实际使用中,需要把它们转成三角形。这个过程称为三角化。
刚遇到这个问题的时候,我还打算在引入一个三角化库,后来看了一眼assimp的代码,原来它自带了三角化的功能,只要启用就可以了。使用方法也很简单,只要把aiImportFile改成aiImportFileExWithProperties,并带上aiProcess_Triangulate的参数即可。三角化效果还不错,obj里常见的四边形五边形六边形,都能很好地用它转换成三角形。
这个树的模型,有不少四边形和五边形。经过转换就能顺利使用了。
坑二:面方向
由于模型创建工具往往是双面显示,所以艺术家在建模的时候并不是十分在乎正反面。而实时渲染里面,基本都会只渲染正面,比如KlayGE里只渲染顺时针的面。这么一来,有的模型就会出现大量镂空,光照结果也不正确。
Assimp提供了另一个选项,叫aiProcess_FixInfacingNormals,就是为了修正这点。它可以把错误朝向的三角形反过来。
再加上这个选项之前,上面车模型要么车身对,要么轮子对。现在终于都对了。
坑三:坐标系
大部分建模软件都是右手坐标系,而KlayGE和很多游戏引擎一样,用的左手坐标系。Assimp的导入选项aiProcess_ConvertToLeftHanded可以把坐标系翻转、纹理坐标翻转、三角形顶点顺序翻转。不再需要自己搞这些事情。但很可能需要在自己程序里加上把z取反和yz对调的事情。
在调整坐标系之前,模型要么立着,要么某个轴是颠倒的。但需要实验几种组合才能得到正确结果。
结果展示
这几个大坑跳过之后,转换大部分模型已经不成问题了。
小池塘:
U.S.S Defiant, a tough little ship:
甚至达到一座城市的规模: