我所遭遇過的中間件--3D MAX SDK

     搞圖形的人都知道3D MAX,而3D MAX SDK就是在該軟件基礎上的一套軟件開發包.至於該不應將3D MAX SDK概括爲中間件,不要在乎這細節了,反正我以爲SDK和中間件就差很少是一個東西.實際上我看網上有些文章將中間件與插件混爲一談.在我看來,中間件是用於作軟件開發的,插件則是已經開發好的軟件產品.對於插件我們常常聽到的是瀏覽器插件,OCX插件.遊戲外掛也屬於插件的一種.插件嵌入到另外的執行程序中,或擴展其功能,或篡改其功能,或進行惡意破壞.通常狀況下,插件並很差寫,它須要其宿主程序提供一套接口支持.例如我寫的軟件:WhyEngine遊戲合集就有點插件的思想.html

     扯了些插件,貌似有點跑題了.其實我使用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文件中.動畫

最後寫點對你們有用的東西:spa

(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的返回切線副法線數據的接口是錯的,以後的版本就行了.htm

(3)
      MAX骨骼動做建模.從MAX中拖BIP角色其骨骼的父子關係有幾根是錯的.若是動做文件中不記錄每一幀的骨骼位移數據,則會出現錯誤.好比兩個肩膀的父骨骼應該是胸,而MAX卻給的是脖子.腰部的父子關係也不對,這個不容易發現.這個問題的解決辦法是寫一個簡單的MAX腳本,重設這幾根骨骼的父子關係.固然也能夠在導出插件中用程序寫死.中間件

(4)

      MAX中爲Z軸向上的右手座標系,而一般遊戲中使用Y軸向上的左手座標系,因此在導出文件要作座標系變換.
      MAX的導出的骨骼其本地座標系是左手仍是右手?這個讓我以爲很混亂,由於我發現導出的骨骼有左手座標系的,也有右手座標系的.由於這個問題不影響其對蒙皮的渲染,所以我也沒去深究.

(5)
      從IGame接口得到一個MESH頂點的法線,切線,副法線.這三個是正交的嗎?不是,個人測試發現,只有切線,副法線是正交的.一直以爲能夠將頂點數據的副法線刪去,但始終沒辦法刪除.

(6)
      骨骼動做幀的導出,調用MAX的接口,是作採樣,一般每秒採樣30幀.遊戲中對採樣出的動做一般作線性插值處理,而在MAX中動做的變換爲非線性的,全部總有人說遊戲中的動做沒有MAX的有力度,反正我是看不出來.這是個很難搞的問題,曾經糾結過好久,最後也不了了之.

相關文章
相關標籤/搜索