搞圖形的人都知道3D MAX,而3D MAX SDK就是在該軟件基礎上的一套軟件開發包.至於該不該將3D MAX SDK歸納為中間件,不要在意這細節了,反正我覺得SDK和中間件就差不多是一個東西.實際上我看網上有些文章將中間件與插件混為一談.在我看來,中間件是用於做軟件開發的,插件則是已經開發好的軟件產品.對於插件我們經常聽到的是瀏覽器插件,OCX插件.游戲外掛也屬於插件的一種.插件嵌入到另外的執行程序中,或擴展其功能,或篡改其功能,或進行惡意破壞.一般情況下,插件並不好寫,它需要其宿主程序提供一套接口支持.例如我寫的軟件:WhyEngine游戲合集就有點插件的思想.
扯了些插件,貌似有點跑題了.其實我使用3D MAX SDK所做的事件就是寫MAX導出插件.MAX導出插件只是其插件的一種類型,有導出也就會有導入插件.我感覺很多MAX自身的功能也是用插件寫的.3D MAX SDK是一套博大精深的開發包.我雖然搞過很長時間的MAX導出插件,但卻不敢說自己熟悉MAX SDK,甚至不敢說了解.只要看過MAXSDK的文檔就會發現,這東西是個碩大的坑.我之所以將MAX SDK放到"我所遭遇過的中間件"這個系列文章的最后,又之所以遲遲沒有寫它,就是因為這個原因.
使用中間件是件苦逼的事情,寫插件也是件苦逼的事情,那么最苦逼的事情莫過於使用MAX SDK寫MAX插件了.你想:使用中間件是軟件開發的底層一頭被堵住了,插件是軟件運行的一頭被堵住了,那么使用MAX SDK寫MAX插件絕對是件兩頭堵的事情.寫的時侯總是處處受限,有數不盡的潛規則要注意,有數不盡的坑要去躲避,總會有莫名其妙又難以調試的BUG出現.有沒有比寫MAX插件更苦逼的事情?有,是維護一套已經開發好的,架構十分混亂的MAX插件.這就是我剛入行時干的事情.
話說這套MAX導出插件的歷史可以追溯到十年前,期間有若干個人接手.給我的感覺是每當來了新人之后,就將它轉交給新人去打理,當新人上手后,就迫不急待地交給更新的人去打理.而我運氣不太好,前前后后維護了它兩年多.這套代碼給我的感覺就是,維護性極差,每次要修改功能,添加功能什么的,都非常費事.就連查找一個具體功能的代碼都要找很久.在我維護的期間經歷了無數次的BUG修改,無數次的功能添加,無數次與美術的扯皮.期間也無數次的想將其完全重構一遍,但始終沒能實現.2012年的時候,重寫引擎特效模塊,於是也順代着新寫了一個特效導出的MAX插件,也算是給自己一個交待.這個特效導出的MAX插件是個很全面的東西,包括MESH模型導出,骨骼動畫,材質動畫,BILBOARD,刀光,拖尾,帖地.
與MAX SDK相應的還有一套MAX腳本系統.給我的感覺是MAX SDK能做的事情,MAX腳本全能做.同樣可以使用MAX腳本寫MAX導出插件.有些事情使用MAX腳本更合適,比如寫一套文件批量導出的邏輯,還有MAX腳本的屬性是可以保存到.max文件中的.當模型后在導出時需要設置一些選項,在沒有使用MAX腳本之前,美術人員每次導出時都需要設置一遍導出配置,而使用了MAX腳本便可以將這些配置保存到max文件中.
最后寫點對大家有用的東西:
(1)
MAX插件的界面不能使用: #include <afxwin.h> 而是使用: #include <atlwin.h> 也就是對話框對象的類定義為: class CDlgColorSet : public CDialogImpl<CDlgColorSet>而不是: class CDlgColorSet : public CDialog. 至於為什么,我也不知道,我寫的MFC的程序也不多,總之就當它是龜腚吧.
(2)
MAX中的數據組成為NODE的樹形結構,遍歷其數據元素時,從根結點開始,寫個遞歸一層層的處理.而MAX提供給用戶兩套訪問其數據的接口,一套是早期的,另一套是以IGame開頭的.我印象中兩套接口返回的數據可能會有不同,具體什么情況記不清了.我記得MAX8版本中IGame的返回切線副法線數據的接口是錯的,之后的版本就好了.
(3)
MAX骨骼動作建模.從MAX中拖BIP角色其骨骼的父子關系有幾根是錯的.如果動作文件中不記錄每一幀的骨骼位移數據,則會出現錯誤.比如兩個肩膀的父骨骼應該是胸,而MAX卻給的是脖子.腰部的父子關系也不對,這個不容易發現.這個問題的解決辦法是寫一個簡單的MAX腳本,重設這幾根骨骼的父子關系.當然也可以在導出插件中用程序寫死.
(4)
MAX中為Z軸向上的右手坐標系,而通常游戲中使用Y軸向上的左手坐標系,所以在導出文件要做坐標系變換.
MAX的導出的骨骼其本地坐標系是左手還是右手?這個讓我覺得很混亂,因為我發現導出的骨骼有左手坐標系的,也有右手坐標系的.因為這個問題不影響其對蒙皮的渲染,所以我也沒去深究.
(5)
從IGame接口獲得一個MESH頂點的法線,切線,副法線.這三個是正交的嗎?不是,我的測試發現,只有切線,副法線是正交的.一直覺得可以將頂點數據的副法線刪去,但始終沒辦法刪除.
(6)
骨骼動作幀的導出,調用MAX的接口,是做采樣,通常每秒采樣30幀.游戲中對采樣出的動作通常做線性插值處理,而在MAX中動作的變換為非線性的,所有總有人說游戲中的動作沒有MAX的有力度,反正我是看不出來.這是個很難搞的問題,曾經糾結過很久,最后也不了了之.