Houdini系列 之 导出模型

来源:互联网 发布:淘宝联盟经常登陆不了 编辑:程序博客网 时间:2024/06/13 10:35

 Houdini是SideEffects的三维制作工具包,它在电影工业中使用较多,可能会用的人不是特别多。但是它的流水线非常完整而且清晰,学习起来并不难,odorce有一个系列视频教程蛮不错的,可以从这里获得:odforce tutorial。注意,这个视频应该是针对Houdini 6.x的,如果打算看就个视频学习的话,不要下载目前(2007-8)Houdini最新版本9Beta,新界面相对8.x及更早的版本有很大的变化。 8.x的界面与6.x相差不是特别大,但材质贴图流程相对6也有大变化。

最重要的是,相对Maya PSE对MEL的限制而言,Houdini Apprentice对学习者来说要友好得多,除了不能用于商业用途之外,几乎没有任何限制,这个协议同样适用于其SDK(HDK)。这一点特鹬匾? 可以心安理得的用它来学习、做点东西玩,不过万一哪天你需要将做出来的东西变成钱,Houdini的价格可能是个负担,目前(2007-8)一个单点授权 Houdini Escape报$1799,Houdini Master报$7995,不过可以用1/3的价钱租用一个月。

我曾经特别喜欢Maya,也曾经特别仰慕SGI,可惜SGI衰落了,Maya卖给了曾经出过3DStudio及3DSMax的Autodesk,很不幸后两个软件包我也都学过却怎么也学不会,可能是思维方式对不上。

对于有Maya基础的使用者来说,Houdini建模的过程非常类似,可以近似的理解成Houdini还编辑的历史记录成操作网络(OP Network),并且你可以直接在这个网络上修改任意一步或增册操作。

Houdini导出模型的方法非常简单,在OP Network里找到适当的节点,通常会是建模的最终节点,击右键,Save Geometry即可。Houdini会根据提供的文件扩展名找到适当的导出器将三维物体的数据写到文件里。要新增一种导出器也非常简单,用HDK写一个小程序,真的非常小,跟标准的console c++应用差不多,注册到filter table里即可。

Houdini自带有多种导出器,其中就有Lightwave .obj格式。这个文件格式非常简单并且是公开(obj spec, mtl spec)的。对于仅仅是导出个别物体来说,这个文件格式非常实用,能够记录有复杂纹理材质的物体,不过不支持多重纹理贴图。而为之写一个解析器也非常简单。在 sourceforge上甚至有一个obj 查看器,不过那家伙把事情搞大了,用c++ boost里的spirit库写了一个正而八经的文法分析器,而对material的支持却又非常有限,不妨拿来学习学习,用嘛还是自己重写一个比较爽。老实说flex/bison比boost spirit看着舒服多了,当然最爽的还是san-stone的Visual Parser ++不过这个是商业软件要收很多钱的。唔,扯远了。另外Nates Robins早在98年就写过一个obj读取显示的例子。

OBJ文件的格式大体如下图所示:
wavefront obj file format
这个结构有几点跟GLES不匹配的地方:
1、Facet可能是多边形。每个facet由一个'f'行表示,一行可能会有多个顶点表示是一个多边形。这个可以在导出模型时预先三角化,也可以取读模型时即时三角化。将多边形分解成对应的一组三角形有两个思路,一个是取任一顶点与其它顶点形成三角扇(TRIANGLE_FAN),另一个是按 TRIANGLE_STRIP顺序分解。
2、独立索引。'f'行每个顶点由三个索引组成,分别索引vertex/texCoord/normal。这种索引的好处是大大减少了texCoord的数量,另外对于多个面的共享顶点也能方便的记录其在每个面上的uv及n。但是,GLES的DrawElements对每个顶点只接受一个索引,并用这个索引来查看所有的Array。这需要一个转换,将Mat的所有顶点及相关数据复制成GLES所需要的Array。
3、光照模型。Mat里记录有光照模型,其中模型2跟GLES的硬件光照模型基本一致,其它模型需要软件模拟,有几个涉及光线追踪的会非常麻烦。
4、多种贴图。DiffuseMap可以直接用一般的贴图来实现,BumpMap可以用MultiTexture+ dot3RGB combine实现,其它的也都可以模拟但较麻烦。

上面已经提到,通常模型上会有一些四边形(QUAD)或多边形,而OpenGL ES不支持这种图元,所以得要先转换一下,另外建模时做的模型可能精度太高,需要缩减,这两都可以通过PolyReduce SOP完成,如果按默认的reduce成100%则仅转换成三角面,就我的经验这个PolyReduce在完成的复杂物体上消减面效果非常差,还是直接修改网络节点更有效可控,或者在某些中间环节上插入可能也会比较实用。

顺便提一下,Houdini也能够读入.obj格式的模型,用一个File SOP指定一下文件名就可以了。

Houdini 9.5里,可以直接用File SOP设成write mode来导出文件了。下面是在Houdini 9.5里制作一个简单模型并导的示意图:
Houdini extrude poly flyship and export as obj

唔,Houdini自带的.obj导出程序只能导出顶点和面,不包含材质性息,另外生成文件的格式也不太规范,有大量的"g"记录。这样的话,用处就非常有限了。还是Right Themisphere的Deep Exploration转得比较好,Okino的PolyTrans也不错。不过既然要自己转的话,转成.obj再分析使用实在是有够曲折的,不如直接转成可直接被GLES加载的格式更爽。这样,可能得耍耍HDK了。9.5里通过Python访问HOM还是比较简单的。