1. 程式人生 > >Houdini系列 之 匯出模型

Houdini系列 之 匯出模型

 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還是比較簡單的。