ActionScript 3.0 學習(十八) away3D學習3 away3d骨骼動畫相關筆記
呼叫Mesh的subMeshes,但前提是你的Mesh裡有SubMesh...
mesh.subMeshes[index].material = new TextureMaterial(new BitmapTexture(bitmapData));
2.怎麼才知道Mesh中是否有SubMesh?
trace(mesh.subMeshes.length);
結果非0則說明有SubMesh
3.3DS檔案無法成功載入怎麼辦?
1.先用3dsMAX之類的軟體開啟你的3DS檔案,刪掉camera,儲存,
2.清除專案編輯器快取(如Flash Builder的快取),再次載入並測試
4.3D物件上的Mouse事件為什麼無效?
需先允許Mouse事件,然後偵聽MouseEvent3D
mesh.mouseEnabled = true;
mesh.addEventListener(MouseEvent3D.CLICK, mesh_clickHandler);
3.跟隨人物的血條與名字怎麼做?
可使用Sprite3D類,當然,你也可以參照它自己實現一個類來解決
4.怎麼才能讓一個模型看上去像玻璃或是水晶?
將Material設定為半透明,然後呼叫addMethod方法新增EnvMapMethod
5.有沒有簡單的辦法可以畫路徑動畫的路線?
可以使用舊版的preFab(最新支援away3d4的preFab3D目前還沒有此功能),先將就用吧
6.怎樣才能讓貼圖的某部分變透明?
使用png圖片,然後...
textureMaterial.alphaBlending = true;
textureMaterial.blendMode = BlendMode.LAYER;
7.有沒有辦法顯示MovieClip?
目前官方暫時沒有提供現成的辦法,但....
可以繼承BitmapTexture,自己實現一個
在繼承的類中新增一個Sprite,並不需要新增到stage上
然後偵聽它的Event.ENTER_FRAME事件
在每次事件觸發時,draw一個新的BitmapData出來
8.怎麼為一個Cube每個面貼上不同的貼圖?
1.自己用6個PlaneGeometry+6個Mesh來實現一個新的Cube類,以達到每個面不同的貼圖
2.用SkyBox實現
(推薦使用第一種方法,靈活度更高)
9.怎樣才能讓模型變的更平滑?
Weld.apply(mesh);
10.怎樣計算2點之間的距離?
var v1:Vector3D = new Vector3D(0,100,0)
var v2:Vector3D = new Vector3D(100,0,0);
trace(v1.subtract(v2).length);
4.1版本對骨骼動畫做了一些修改,記錄一下:
//動作相關屬性獲取
var animator:SkeletonAnimator; animator.updatePosition = false; //這個可以防止骨骼動作引起的位移 var animatorSet:SkeletonAnimationSet = animator.animationSet as SkeletonAnimationSet; //獲取動作集 var animationNode:AnimationNodeBase = animatorSet.getAnimation("stateName"); //獲取動作節點 var animationState:AnimationStateBase = animator.getAnimationState(animationNode); //獲取動作狀態
//播放動作
var stateTransition:CrossfadeTransition = new CrossfadeTransition(0.5); animator.play("stateName", stateTransition, 0); //注意這裡要設定第三個引數, 動作的初始偏移值,如果沒有直接就跳到動作的最後一幀了,特別是對非迴圈動作就沒有動作了
動畫模組核心存放在away3d.animators包裡;
Away3D支援下面幾種動畫格式:
- VertexAnimator:頂點動畫
- SkeletonAnimator:骨骼動畫
- UVAnimator:UV動畫
- SpriteSheetAnimator:二維切換動畫
- ParticleAnimator:粒子動畫
- PathAnimator:路徑動畫
這幾種動畫都有各自的特點及應用場景,一般而在3D遊戲中應用得最廣泛的是骨骼動畫,因為骨骼動畫是人物動畫的核心,我們下半段會專門詳解這個動畫;
動畫簡介
核心類
IAnimator
提供控制動畫播放的介面,具體的動畫型別對應具體的實現類,如骨骼動畫使用SkeletonAnimator類;
將該物件賦值到對應的Mesh的animator屬性既可以控制該Mesh物件播放動畫;
對於播放的所有動畫都應該存放到IAnimationSet物件中;
IAnimationSet
提供管理多個動畫的容器,多個動畫如奔跑或攻擊都需要新增到對應的Set容器後才能進行播放;
data包
動畫所需的資料物件元變化(幀)資訊;
nodes包
一串變化組成的一個獨立動畫節點;
states包
動畫當前狀態,從Nodes提取以供當前顯示的動畫元(幀)資訊;
渲染流程
Away3D中的動畫渲染是雙線更新渲染的,一個更新位於AnimatorBase類的方法update中,負責更新動畫資料,一個更新位於MaterialBase類的renderPass方法中,負責渲染繪製;
具體的更新都是更具當前時間來更新對應的State物件,更新具體流程可以具體的打斷點檢視,這裡就不深入解讀了。
骨骼動畫
骨骼動畫在網路上有大量的資料,大家可以去網上搜搜看,這裡主要說一下Away3D中是如何處理骨骼動畫的資料的;
SkeletonJoint
由於多個關節之間是可以相互連結的(父關節變化時會影響到子關節),該物件用來儲存關節的連結資訊;
Skeleton
骨骼物件包含了所有關節的連結資訊(SkeletonJoint);
JointPose
儲存一個關節的資訊,包括3個數據:名稱、四元數(用於旋轉)和轉換資訊;
SkeletonPose
記錄一個關鍵幀下所有的關節的資訊(每個關節的位置及旋轉資料),包含所有的關節物件(JointPose)列表;
SkeletonClipNode
包含了一個骨骼動畫的所有關鍵幀資料(SkeletonPose列表),同時還可以為每個關鍵幀指定一定的間隔;
SkeletonClipState
更新特定時間點的骨骼資料,骨骼動畫的插值運算;
SkeletonAnimationSet
存放多個骨骼動畫(SkeletonClipNode)的容器,使骨骼動畫(SkeletonClipNode)和其name屬性關聯起來,配合SkeletonAnimator的play方法可以指定播放哪個骨骼動畫(SkeletonClipNode);
SkeletonAnimator
骨骼動畫的播放類,可以設定到指定Mesh上,需要指定一個骨骼容器(SkeletonAnimationSet)和對應的骨骼物件(Skeleton);