3ds Max 和 Away3D工作流程

作者:Jens Chr Brynildsen

      隨着Away3d 4.0的發佈,我們準備了一系列關於工作流程的教程。這個教程將會演示如何從3ds Max中導出帶骨骼動畫的模型,並且在Away3d中加入互動元素。

使用方向鍵,E鍵,Shift鍵個空格鍵控制角色,點擊此處打開更高分辨率的版本

教程環境需求

1.Windows電腦

2.Autodesk3ds Max 2012 (download trial here)

3.最新版本的Away3D 4

4.AWD Max插件


       確保你已經安裝3dsMax,並從官網的下載中心或者GitHub下載最新版本的Away3D,另外你需要一個Flash開發工具,譬如FlashBuilder。


載入AWD plugin

       AWD格式由Away3D團隊制定,用來解決其他文件不適合網絡應用的問題。目標是創建一種緊湊,可擴展的三維格式,可以自主選擇是否加載材質,動畫及其他資源。支撐多個模型,甚至可以導出整個場景。


       這是一種標準的,免費的格式,提供開源的C++和Python SDK以便得到更好的編譯,這些優點使之成爲一個很有吸引力的格式。


       AWD團隊計劃爲Blender, Maya 和 3ds Max這次流行的3D軟件創建插件。其中3ds Max插件可以在下載部分得到。在教程發佈時,Maya和Blender依然在代碼階段,很快就會發布。下載合適的插件,並且按照安裝示例正確安裝後,打開3ds Max就可以在導出對話框中AWD選項。如下圖。


lo00_awd.png

3ds Max中準備模型。

      這次使用的模型和代碼是的作者是法國設計師Thillet Laurent,它是有一個模型爲基礎,並在Character Studio和Biped中創建了骨骼和角色動畫。

你可以在這裏下載包含3ds Max 工程,材質,Biped打包文件,以及包含src文件的ActionScript源代碼文件和以後將會用到的一個”sequence”文件。

    當你打開onkba.max文件時,軟件或許會彈出一些提示,忽視他們。你可以使用磨砂滑塊觀察包括靜止,行走以及奔跑的三個動畫,如果你打開Graph Editors -> Motion Mixer,可以觀察到骨骼動畫。同時,你可以在時間線加快或減慢動畫速率,以及各個動作的次序。

lo01c.png

        打開管理圖層面板,觀察骨骼動畫。隱藏骨骼層和打開蒙皮層。這些骨骼將會在之後被導出到AWD文件中,你也可以用actionScript控制它們。而僅僅導出標記爲可渲染圖層的設置也將在不久之後實現。

lo01b.png

   當你導出AWD文件時,你應該清楚,AWD現在只支持幾何體,多邊形(包含instancing),包含容器和父子關係的動畫,包含基本顏色和貼圖的材質,骨骼和骨骼動畫。除此之外其他任何東西都會被忽略。

Max中導出

當模型工作完成後,我們需要決定哪些部分需要導出,同時建立一個導出文件夾。並在這個文件夾中建立一個叫做”sequence.txt”的文件。文件將記錄我們導出動畫的名字和幀的範圍,並在之後的代碼中用到。到這個Wiki page中瞭解更多。

在這個實例中,我們將寫入以下內容。


  1. Breathe 0 60

  2. Walk 70 130

  3. Run 140 157

複製代碼



        它僅僅在導出AWD文件時做標記用途,爲了獲得其他的導出效果你可以修改這個文件。同時導出插件自帶的預覽器將會預覽第一個動畫。點擊主菜單下的導出命令,選擇合適的文件夾,在下拉菜單中選擇AWD文件。AWD導出設置提供豐富的參數,當然默認的就足夠好了。在最後導出之前,請再次確保設置文本文件沒有問題。

在導出之後,導出插件會默認預覽文件。如果你想在本地預覽的話,請選擇"Export for local preview"

也可以選擇"Exportfor deployment"在線分享給其他人。因爲Flash Player安全沙箱的問題,但這種設置導出後不會有預覽。

插件會導出整個場景,現在和不能單獨導出骨骼。在這個例子中,我們選擇在本地預覽,確認導出會,會得到以下結果。

Screen_shot_2012-07-04_at_3.40.34_PM.png

在導出文件中看到骨骼也無妨,我們可以在Flash中設置它。

如果預覽是一片空白的話,那可能是"sequences.txt"文件的設置有問題,確認下文件名和內容是否和你的項目匹配,真不行的話可以參考Wiki頁面

Flash中使用模型

       這個教程並不會注重於基本的場景搭建,你可以在官網的教程部分找到基本的攝像機,燈光,材質以及的模型的幫助。這個教程將會向你展示加載AWD文件和控制動畫部分的操作。

在這個部分中,我們將使用Adobe推出的FlashBuilder編寫代碼,你也可以選擇其他IDE,這裏有如何在AdobeFlashFlash Builder 以及免費開源的Flashdevelop中開發的教程,以及如何在這些工具中使用Actionscript項目

首先建立一個叫做"MaxAWDWorkflow"的ActionScript項目。

Screen_shot_fdsfsfdsfds.png

把下載的示例文件解壓到項目文件夾中,並覆蓋原來空的"MaxAWDWorkflow.as"。在設置Away3D源文件路徑之後,我們將會用到這些文件。

   前面已經提到過,你可以從Github下載ZIP格式的源文件,並將它解壓的合適的文件夾中。之後到屬性面板的"Actionscript Build Path"菜單中設置源文件路徑。

Away_adding_away.png

你的項目窗口中應該有如下圖所示的一些文件。

Screen_shot_2012-07-08_at_4.56.19_PM.png

點擊綠色的運行之後,你可以看到一個紅色的圓球。如果在運行時出現"Error #2044",那麼需要在HTML template中加入其它一些參數。下面一節將會處理這個問題。如果你一切順利,請跳過下一章。

Stage3D 標記

    很遺憾,剛剛導出的文件不能在stage3D中運行,通常會得到一個錯誤提示:"Error #2044: Unhandled ErrorEvent:.text=Error #3702: Context3D not available."其中Context3D是Stage3D的一個核心類,我們可以通過添加一下代碼到HTML中解決這個問題。

params.wmode="direct";

點擊放大此圖,查看添加的具體位置。

awd_max_html_wrapper.png

如果你使用adobeair 可能還要添加一下內容到application.xml。

<renderMode>direct</renderMode>

如果還有問題,並且是正在使用老版本的SDK開發,可能還要添加下面的編譯參數。強制使用Flash Player 11.x

-swf-version=13

運行實例文件。

運行AWDViewerLoth.as作爲運行文件,檢驗我們導出的.awd文件。在不同的IDE中,有不同的方法,在FlashBuilder中,我們可以右擊"AWDViewerLoth.as"選擇"Set as Default application"。同時打開"AWDViewerLoth.as",他將在後面被用到。點擊運行按鈕後,你將看到我們導出的動畫角色,使用WASD控制,使用Shift奔跑。

如果提示"SecurityError:Error #2148",並不能運行,你需要添加編譯器參數-use-network=false到項目中,詳情請看read this entry on Stack Overflow

我會在下面的代碼中解釋模型是如何工作的,在構造函數中有initEngine, initText 和 initLights三個方法,它們建立了這個場景的基礎:視口,攝像機以及其他。initLoading是最後一個方法,負責使用AssetLibrary類加載各種資源。

AssetLibrary

     它是一個Away3D 4新添加的一個加載類,可以加載多邊形,幾何體,位圖貼圖等各種資源

首先要告訴格式解析器你要導入的格式,應該是Away3D支持的OBJAC3DDAE3DSMD2MD5以及AWD1AWD2中的一種。如果嫌麻煩,也可以這麼做加載所有解析器:


  1. Parsers.enableAllBundled();

複製代碼




當然導入更多的解析器意味着更大的swf體積,在這個項目中,我們只導入AWD2解析器,這樣可以省下82kb的體積。


  1. AssetLibrary.enableParser( AWD2Parser );

複製代碼



通過Flash中的事件機制,我們可以偵聽AssetLibrary加載過程中的的各種事件。


  1. AssetLibrary.addEventListener(AssetEvent.ASSET_COMPLETE, onAssetComplete );AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE, onResourceComplete );AssetLibrary.addEventListener(LoaderEvent.LOAD_ERROR, onLoadError );

複製代碼



下面是我們經常偵聽的3種事件:


  1. AssetEvent.ASSET_COMPLETE

複製代碼



很多情況下,導入Away3D的模型不僅僅包含多邊形,在我們這個案例中,我們的模型包含一個帶有各種動作的骨骼動畫,以及嵌入的材質。模型自身包含多邊形以及幾何體。使用這個事件我們可以檢查模型加載情況,並且使用它們。

在這個教程中,AssetLibrary類將會自己完成加載,而我們只會用它來糾錯。通過tarce()函數,檢查加載資源的名字和類型。你可以觀察的到。這些加載資源和"sequencences.txt"具有相同的名字,如果名字有重複的話,AssetLibrary會自己處理。但請在命名文件時注意。


你也可以通過偵聽Away3d類庫中的AssetLibraryBundle偵聽每個成員的加載。


  1. LoaderEvent.LOAD_ERROR

複製代碼



我們必須處理這個提示某些資源沒有被加載的事件。在這個教程中,我們只是在控制檯trace()錯誤,但是在更大的項目中,向用戶顯示這些錯誤信息會更好一點。

如果你不處理這個事件,那麼在屏幕上只是一片空白。除非是在程序員使用的調試版本的Flash Player中才會顯示錯誤:Error#2032: Stream Error。一定要偵聽並處理這些事件,否則你的用戶只會看到一個空白的屏幕。


  1. LoaderEvent.RESOURCE_COMPLETE

複製代碼




一旦加載完成,就會觸發這個時間。因爲我們的AWD不包含材質,所以我們需要兩個申請。


  1. AssetLibrary.load( new URLRequest(TEXTURE_URL ) );AssetLibrary.load( new URLRequest(MESH_URL ) );

複製代碼



AWD2也可以將材質嵌入到模型中,這在大文件中有很大的價值。

在網絡中,所有資源不太可能按照我們申請的順序加載完成,而onResourceComplete方法的工作就是在我們進行下面的工作之前確認所有資源都已經加載完成,一旦模型和材質加載完成,我們就可以在setupScene方法中顯示我們的模型。

渲染最終結果

在away3d中,只有加入到場景的對纔會被渲染。在initEngine方法中,地面以及其他一些對象已經被加入,setupScene方法中爲我們的hero角色加載了材質,並且將它縮放了合適的尺度。現在大部分三維軟件都在不統一的單位內工作,所以縮放是很必須的。


  1. hero.scale( 8 );

複製代碼



如果你明白攝像機的工作原理,那麼也可以通過攝像機設置來抵消這一種差別,兩種方式是相對的。在大項目中,應該設定一個全局標準,用來統一各個模型的設置。

當設置好模型之後,我們將它添加到場景中。


  1. scene.addChild( hero );

複製代碼



現在模型已經可以被渲染了,但他還在默認位置上,我們下一步爲它添加動作。我們使用一個動畫數據容器,並將之前ASSET_COMPLETE事件中的數據添加進去。


  1. animationSet = newSkeletonAnimationSet(3);animationSet.addState(breatheState.name,breatheState);animationSet.addState(walkState.name,walkState);animationSet.addState(runState.name,runState);

複製代碼



在我們得到了動畫設定之後,我們將在動畫數據和模型之間建立關聯,並創建控制機制。我們通過一個動畫對象聯繫我們從ASSET_COMPLETE事件中獲得的骨骼和新建立的動畫設定。我們何以禁用經常在骨骼動畫中使用的位置更新(position update),防止角色遠離攝像機。


  1. animator = newSkeletonAnimatior(animationSet, skeleton);animator.updateRootPosition = false;hero.animator = animator;

複製代碼



最後,爲我們的動畫定義一個狀態轉換器,它可以在我們幾個動畫間切換。現在我們將會使用默認的crossfade轉換對象


  1. crossfadeTransition = newCrossfadeStateTransition(XFade_TIME);

複製代碼



XFADE_TIME是定義在類文件上方的一個常量,它定義了兩個動畫之間的動畫過渡時間,如果設置爲0的話,就會瞬間切換。這樣看上去不太好,通常像我們這樣進行一些頂點混合會比較好。

我們可以通過animationSet.hasState測試每個動畫都被成功加載,避免一些不必要的錯誤,當然這不是必須的。這些都完成之後,可以開始渲染和添加用戶交互。

根據用戶的不同操作,updateMovement方法負責執行不同的動畫,如果沒有任何操作,那麼將會執行,goToPauseState方法。在這兩個方法中,我們設置動畫狀態名字並且激活他們。


  1. animator.play(currentAnim,crossfadeTransition);

複製代碼



總結

感謝AWD文件和AWD插件,我們可以輕鬆地從3ds Max導出帶有動畫和材質的模型到Away3D中。新的AssetLibrary類簡化了各種資源的加載。ActionScript可以輕鬆的創建網絡和移動平臺的交互應用。緊湊的AWD格式優化了網絡傳輸和加載



原文鏈接:http://away3d.com/example/3ds_Max_workflow


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章