學習本課之前,先來看一下筆者用 Adobe 公司旗下Mixamo網站的免費3D人物與動作,做出來的側滾翻動作,是不是感覺很真實呢?

3D人物動作.gif

這個動作背後的原理跟上一課的動畫(Animation)類似,本質上,Animation 不過就是物件屬性(位置、旋轉、縮放、透明…等等)對於時間的變化,動作也是。看起來比較真實的原因,是因為這些動作並非程式計算的,而是從真人身上「捕捉」而來,將捕捉來的動作數據儲存起來,再套用到任何3D虛擬人物身上。

本課要學習的 SCNAction 未必能一下子做出上面的效果,但可以讓我們了解複雜的動作是如何構成的,為什麼動作可以捕捉及儲存。

6-3a 節拍器

從程式的角度來看,SCNAction 就是組合過的動畫,從簡單的旋轉、移動、縮放等動畫,建構出連貫的動作。在下面範例中,我們用兩個簡單的動畫「左擺」與「右擺」,組合成節拍器的來回擺動:

let 右擺 = SCNAction.rotateBy(x: 0, y: 0, z: .pi / 2, duration: 60.0 / 節拍速度)
let 左擺 = 右擺.reversed()
let 來回擺動 = SCNAction.sequence([右擺, 左擺])
搖桿節點.runAction(.repeatForever(來回擺動))

基本的位移、旋轉、縮放等動畫,都可以用 SCNAction 的「類型方法」(還記得什麼是 “Type method” 嗎?)做出來。SCNAction 包含以下20種類型方法(只有 reversed() 不是類型方法):

  1. SCNAction.move() 位移
  2. SCNAction.moveBy() 位移
  3. SCNAction.rotate() 旋轉
  4. SCNAction.rotateBy() 旋轉
  5. SCNAction.scale() 縮放
  6. SCNAction.fadeIn() 漸入(從無到有)