Friday, July 30, 2010

做模型的有多少面子

相信有研究/製作 3D 模型的朋友一定會知道模型是由 點, 線 和 面 組成的, 遊戲模型比較少用到 線段, 我就不在此處詳述了.
提到 面組 的話就立即令人想到是連接各個 Vert點 而成為可見的實體模型了. 比較有經驗的朋友還會加上 "面組 還連接了貼圖用的 UV點". 其實 面組 還連接 Normal, Vertcolor...
一般人都會忽略這些東西, 是因為大多數的遊戲引擎都採用了共用 面組 資料的方式來建模型, 也就是共用相同數量的 Vert, UV, normal... 那樣只要讀取一次 面組 資料就可以了.

這種方式對反過來研究遊戲模型的我們卻不是件好事. 由於在同一個座標地點可能有多個相同的 vert點, 做成了鄰近的 面 也可能用上不同的 vert點. 模型容易變得不平滑, 也容易出現裂縫!
如果是用 3dsmax 的就更差了, 因為 3dsmax 不記錄 normal點 的, 而是用 smooth group! 那有方法解決這問題嗎!?

近日我就是主力研究解決這問題的方法! 一個比較簡單的方法是用上不同的 面組 記錄 Vert點 和 UV點. 再建立一個 Vert_UV_Lookup_Table 然很在讀取 Vert點 資料時對照一下這個位置是否已經記錄. 把索引記錄到 Vert_UV_Lookup_Table. 在讀取 面 資料時對照這個 Vert_UV_Lookup_Table 來 Vert_Face_Array 和 UV_Face_Array. 如事者還可以建立 Normal_Face_Array, VertColor_Face_Array...


讀到這裡可能有人會問, 為甚麼耍這樣子大費章節, 在把模型導入後 Weld 上 Vert點 就可以了. 這個當然可以, 但如果要考慮到遊戲模型的蒙皮資料呢!? 而且考慮到遊戲模型的再導出(比如做 mod 的), 蒙皮一定要是最後一項工作呢!?

No comments: