1. 程式人生 > >ActionScript 3.0 學習(十八) away3D學習3 away3d骨骼動畫相關筆記

ActionScript 3.0 學習(十八) away3D學習3 away3d骨骼動畫相關筆記

            1.怎麼為一個Mesh設定各個不同部位的面板?
呼叫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);