顯示具有 2D Skeleton Animation 標籤的文章。 顯示所有文章
顯示具有 2D Skeleton Animation 標籤的文章。 顯示所有文章

2014年12月31日 星期三

[Flash] Elec­tric Dog Flash Ani­ma­tion Power Tools for Animator

在Flash中製作2D動畫(在此指的是紙片人式2D動畫,類似骨骼動畫之形式)是相當麻煩的,原因之一是操作太過原始、瑣碎,浪費相當多的時間,而Elec­tric Dog Flash Ani­ma­tion Power Tools(以下簡稱EDAPT)這個工具,透過commands及metadata使的操作變得更加簡單快速,並且具有階層性骨架結構的操作功能。這個工具的好處是輕量能簡易上手,功能不龐大,適合單純使用Flash的使用者,唯使用此工具可能會需要一段時間做Setup,因此實際上是否能帶來更有效的製作流程得看製作需求與個人習慣而定。官方網站如下:
Flash Power Tool - Elec­tric Dog Flash Ani­ma­tion Power Tools
要注意這個工具是從強化Flash的操作之角度所設計,而其提供的一些功能(commands)其實都可以手動完成,EDAPT只是幫你做了自動化處理,當然也有手動無法替代的功能,這就是他最重要的部份。

此工具主要的功能是:
  1. Magnet Target
    透過預先設置在元件內的Magnet Target(一個作為定位用的元件),別的元件即可吸附到這個位置上(執行指令後,會去尋找最近的有效Magnet Target並將所選元件對齊該位置)。
    ※可以把Magnet Target想成是骨頭的結束點,而起始點就是元件的註冊點。
  2. Hierarchy Rig
    能夠定義骨架階層,建立一個骨架結構,再把場景上的元件綁定到骨架結構上,如此就可以達到具有骨架階層關係的操作系統,例如可以自動選擇所有子元件。
EDAPT原本提供的Set Magnet Target command並不是很人性化,因此我修改了一個版本,將該command的運作方式改為:
  1. 先選擇場景上想要成為Parent的元件
  2. 再選擇要成為Child的元件
  3. 執行Command
  4. 即可在父元件內的正確位置上產生Magnet Target
日後再將此command share出來。

2014年12月15日 星期一

[DragonBones]讓物件隱藏顯示又保有骨架繼承

由於DragonBones的骨架結構是具有繼承效果的(會繼承父骨頭的位置、傾斜),因此當父骨頭(圖層)沒有內容物(空白關鍵影格),而子骨頭又還有內容物時,就會造成子骨頭的位移繼承錯誤,跑出奇怪的動態結果,而這個問題的解決方法就是用隱藏內容物來替代刪除內容物。

隱藏內容物只是將影格中的元件不顯示,元件仍然存在在影格之中,如此可讓內容物不被看到但又不會丟失骨架繼承,但這個技巧只能作用在影片片段元件上,可以透過屬性面板中的顯示頁籤的『可見』參數設定該元件會不會被顯示出來,而DragonBones會把這個參數寫入匯出的資料中,在xml檔案內參數名稱是hide。

可見參數可以控制元件的顯示狀態
可見參數會被DragonBones輸出為hide參數

參考:

2014年12月13日 星期六

[Spine] Spine匯入Unity,使Spine中的Root motion在Unity中實現

Spine進Unity,是不會像FBX一樣可以把FBX中的Root motion直接當作Unity中Game object的Root motion,因此需要額外自己寫script實現,在Spine Forum中有一篇討論串有討論到這個問題:
Applying Root Motion
Mitch 提供了一個解決方案
Had to modify SkeletonAnimation and add a callback between Update and Apply because the Time and LastTime are set to be equivalent by the time UpdateBones is called.
修改了SkeletonAnimation.cs以及SkeletonRootMotion.cs兩個檔案,實現X軸的Root motion。但是我的需求是X及Y軸都需要實現,因此對SkeletonRootMotion.cs做了一些修改,修改後的結果post在Forum中,在這邊補充一下,我不是Programmer所以Code可能不盡完善、正確...
http://esotericsoftware.com/forum/viewtopic.php?f=7&t=1364&start=26
也可以在我的GitHub上查看,檔案內直接保留了Mitch原始的code,可以直接做比對:
https://github.com/januswow/TAG/blob/master/TouchActionGame/Assets/spine-unity/Assets/spine-unity/SkeletonRootMotion.cs
主要的重點是Spine的Frames Data是以[time, x, y, ... time, x, y]的格式寫入,因此在GetXYAtTime()時,frames變數(timeline.frames)的取用需要注意:
float lastFrameX = frames[frameIndex - 2];
float lastFrameY = frames[frameIndex - 1];
另外一個題外話,由於Spine輸出的資訊完全不同於FBX,因此尚無法搭配Mecanim系統,不過nicloay有寫一個Importer,使Spine能夠在Mecanim中運作,可惜的是無法支援全部的資訊,如FFD等...
http://esotericsoftware.com/forum/viewtopic.php?f=11&t=2012

動作流程控制參考:

2014年12月12日 星期五

[DragonBones]Texture Atlas Packing功能解說

DragonBones本身就具有Texture Atlas Packing的功能,可將所有使用到的圖片素材拼湊成一張貼圖,使用者不需要再使用額外的軟體製作Atlas,相當便利。在此將分享我對此功能的一些小心得…

首先我會建議所有的素材(點陣圖)一定都要先包成元件,原因是…
  • 元件才可以做顏色效果(Alpha、進階)
  • 元件做補間才不會意外生成額外的點陣圖資源
  • 影片片段元件可以使用隱藏顯示功能
Texture Atlas Packing規則,打包的對象須符合以下條件…
  • 元件
  • 不含動畫(timeline只有一個frame的長度)
  • 不含動作名稱label
  • (或者是未包成元件的點陣圖或形狀…)
對於符合打包對象條件的元件,需要注意的是
  • 打包的對象是元件,而非元件內的點陣圖
  • 只要元件的名稱不相同,就會被視為不同的對象並打包起來
    例如重製了一個元件,儘管重製的元件與原始元件內容物一模一樣,也會因為其元件名稱不同,而被各自打包一次
  • 會直接將該元件Pack到Atlas之中
    • 元件內的內容會直接被合併成一張圖
      符合打包條件的元件的內容會被直接合併成一張圖

      若要避免這種狀況發生,可以使用下面兩種方法…
      • 添加動作名稱label
      • 將timeline長度加長到2個frames以上
        (如此該元件會被視為一個獨立的skeleton(armature))
    • 不可對元件內的點陣圖做放大變形
      因為Pack的圖素會是放大後的尺寸,而非點陣圖的原始尺寸
匯出
  • 可以設定貼圖的尺寸比例
  • 可選擇匯出Atlas或者是各別的png檔案
    匯出面板(Design Panel 3.0)

其他需注意的事項
  • Flash CS6會無法匯入超過4096*2048的貼圖(Flash CC無此問題)
    會造成無效的BitmapData錯誤訊息

2014年12月11日 星期四

[DragonBones]變換顯示順序 Changeable Z-Order

在製作角色動畫時,時常會有要變換顯示順序的需求,例如原本在身後的武器要移動到身前來,而在Flash要達成這效果,自然就是新增一個同樣也是武器的圖層在想要的順序上,但此時需要注意的是DragonBones對於這點有提供一項功能:Changeable Z-Order,可將這些因變換顯示順序需求而新增的圖層與原始圖層視為同一個骨頭(圖層),利用這點可以有效減少DragonBones角色的骨頭總數,降低進入引擎後的效能消耗。

而要實現這個功能必須要符合規則:
  • 這些圖層的名稱需要完全一樣
  • 這些圖層的影格不可互相重疊
    變換顯示順序時圖層必須同名且影格互不重疊
如此DragonBones才能正確的將這些圖層視為同一個骨頭(圖層),如果在匯入DragonBones之後發現這些圖層被DragonBones自動加上後綴流水號即代表失敗了。另外也可以在Export後的skeleton檔案(在此舉例xml)中進行驗證,檢查frame的z值是否有正確變化。
skeleton.xml內的z值

[DragonBones]事件觸發

DragonBones可利用Flash中所設定的影格標籤來觸發事件,達成Hit frame等目的,而設定的標籤須符合「@事件名稱」的規則,如:@attack。
事件Label
另外標籤所在的圖層也會造成差異,有以下兩種案例:
  • label圖層
設定在label圖層中的事件,在API中是屬於AnimationEvent,此種事件只能獲取到骨架(armature
AnimationEvent

  • bone圖層(label圖層之外的圖層都是bone圖層)
設定在bone圖層中的事件,在API中是屬於FrameEvent,此種事件可獲取到所屬的骨頭(bone
因此將事件設定在bone圖層中時,可以順便獲取所屬影格中的元件位置來做定位,舉例,當事件發生時會呼叫一個分離特效並產生在角色的手上,那就可以把事件種在手的圖層中,或者是額外的定位圖層中。 
FrameEvent

2014年11月2日 星期日

[Spine] AnimationState Events

在Spine的Runtimes中,AnimationState有幾個Events可以使用。

  • Start
  • Complete
  • End
  • Event
這幾個事件的觸發時機是:
  • Start
    當一個動作開始播放時(在此推測應該是開始Mixing的時候,尚未驗證…)
  • Complete
    當動作(Animation)完成完整的播放時,若是Looping的Animation則會在每個Loop結束時觸發一次。
    • 每個循環結束時觸發
    • 當動作完整的播放完畢時
  • End
    當動作結束時,其他與Complete相同
    • 每個循環結束時觸發
    • 當動作完整的播放完畢時
    • 當動作結束時(例如在動作播放途中被切換成其他動作)
    • 動作被終止或者清除掉時
  • Event
    當Event Track有設置Event時(在此指Spine Editor中設置的Event)(尚未確認)
在使用End事件時需要注意,不可在End事件中做SetAnimation的動作,因為SetAnimation後動作被打斷又會再觸發End事件,造成無限迴圈的狀況。

Complete與End是Pharan在Spine Forum中所做的說明,來源如下

2014年10月29日 星期三

[Spine] 動作進入Runtimes時,發生動作互相干擾的問題

使用Spine應該都會遇到一個狀況,就是A動作結束之後進入B動作,卻發現B動作的某些骨頭的動態有問題,看起來是受到A動作干擾,這是因為Spine的設計是當該Track不帶有Keyframes時,就會延續上一個動作的資訊!所以解決方式就是在動作的起始幀對每一個Track上Key。

詳見官網文件:
http://esotericsoftware.com/spine-using-runtimes#Animation-changes
An animation only affects the bones and slots for which it has keyframes.
When animations are applied in sequence, a previous animation may have made changes to bones or slots that a subsequent animation does not have keyframes for.
This can be solved be keying everything at the start of the second animation that the first animation affects.
文件有提到對每個Track打上key是會造成額外的運算負擔,但若是增加的幅度很小,其實也可以無視了。
With many animations this quickly leads to everything being keyed at the start of every animation. This is suboptimal because each property that is keyed adds a small amount of overhead when the animation is applied each frame.
文件也提出第二種解決方式,就是歸回SetupPose,但造成的負面影響是動作可能會發生不順暢、無法crossfading的狀況。 
Another solution is to call setToSetupPose, setBonesToSetupPose, or setSlotsToSetupPose on the skeleton when the current animation is changed (or otherwise write code that changes the slots and bones as needed).
However, this will cause bones that aren't keyed in the second animation to be instantly set to the setup pose state. AnimationState won't be able to do crossfading for those bones.

[Spine] 熱鍵