Animation

Animation


Introduction

不管在電腦圖學還是遊戲設計,動畫都是很重要的一塊,有了動畫才能讓腳色或物件有較多的變化,而實作動畫的方法也有很多種,主要分成三個種類

  • Rigid Body
  • Articulated Body
  • Deformable Body

Rigid Body

剛體運動,定義上為不會產生形變的物體,基本上是整體的一起運動

  • 變化較少
  • 程式較好寫

Impletation

可以先將軌跡運算出來,在計算每個時間點(frame)應該是動畫的哪一個畫面

Cubic Spline

Cubic 運用三次式做内插,逼近預期軌跡
Spline 簡單來說為多段分開內插的函數,能比一般的內插函數更近似複雜的圖形

Bezier Curve

是一種參數化的曲線可以使用 r(t) 求出當前的位置與方向

圖上的位置代表物體的位置,而切線方向則代表物體的面向

Cubic Bezier Curve


而且他擁有三個性質

  • r(0) = P0, r(1) = P3
  • 節點將會形成將函數包起來的凸包
  • P0P1 平行 P2P3

但 Bezier Curve 有個問題在於 r(t) 的單位變化並不是等距的,這會造成我們動畫在配合 frame 的時候有速度不一致的問題,因此我們需要用 Arc Length 來解決

Arc Length

Arc Length 就是將曲線的距離重新定義計算出來,讓每段的距離是相同的

有了 Arc Length 之後要做甚麼呢?

我們可以製作出 t 與 s 的對應表

這樣我們就可以運用 t 丟進去 r(t) 轉成 r(s) 這樣我們的動畫的表現就會等距了!


Articulated Body

有很多部件分開來的物體,基本上由 joint 把各個 rigid body 相連起來

  • 變化很多
  • 程式難度中等

Impletation

  • Control Structure

基本上就是用 LCS (Local Coordinate System) 將每個 joint 建一個坐標系來操控

  • Parameter Vector

因為每個 joint 都會需要 theta 的旋轉角度資訊,我們在實作的時候可以把所有部位包成一個 vector 傳進去,然後讓各個 joint 去存取需要的資訊

  • Forward Kinematics

將每個 joint 的角度傳進各自的坐標系在換算成目標的姿態

  • Inverse Kinematics

先知道目標姿態再將中間每個時間點(frame)的角度變化換算出來

  • Skinning Method

在 joint 外面再包上一層 skin 的 mesh 而 LCS 的原點一樣定在 joint 上,在控制 joint 的時候可以讓外層的 mesh 同時改變,讓觀察的效果更好

但在旋轉角度較大的關節可能會出現一些 skin 重疊或是斷裂的問題,這時可能會在關節部分在多加一層的 skin 讓彎曲時不會有斷裂的現象

在現在的實作上其實會做兩三層以上的 skin 讓操縱起來更加的順暢,例如:

  • Layer 0: skeleton
  • Layer 1: muscle
  • Layer 2: surface

Deformable Body

受外力會產生形變的物體,實作方式可以使用 joint 建在物體外,讓這些 joint 取改變物體的形狀

  • 變化最多
  • 我還不知道怎麼寫QQ