自前のボーン(スキニング)アニメーション
ディズニー研究所? の論文
Binh Huy Le, Jessica K.Hodgins. Real-time Skeletal Skinning with Optimized Centers of Rotation. Disney Research.
を見つけて、試したくなりUnityで組んでみた。
一般的なソフトウェアで使われるLBS(Linear Blend Skinning)はボーンの変換行列にウェイトを掛けて頂点の位置を決定する手法。数学的にも簡単でハードウェア上に回路として実現できるので高速に実行できる。欠点は関節付近の変形が著しいのと、ウェイトを付ける作業がとんでもなく大変だということ。怠るとモデルの肩がぶっ壊れたりする。ただ骨格を上手く作ったり職人レベルのウェイト付けで回避はできる。
論文の主法は、Optimized Centers of Rotationを事前計算することで、LBSと同程度の計算量で破綻の少ない変形を可能にするというもの。ウェイトに「近さ」を導入して、その「近さ」で重み付けられたLBSとのズレが最小になるように変形する。……と書いても良く分からないと思うので詳しくは論文を見てね。
で、Unityでの実装なんだけど、LBSはそれなりにできた(と思う)。しかしUnity上での行列やクォータニオンの扱い方がいまいちよく分からないのと、Unityが行列演算に滅法弱いということが判明したので、OCoRの方は正直ちゃんと出来ているのかすら良く分からない。
紫色の四角形がボーン。二番目と三番目の角度がパラメータで、上から(0, 0)(初期状態), (45, 0), (45, 45), (90, 45), (90, 90)(度)となっている。白丸がLBSによる頂点、青丸がOCoRによる頂点。
頂点が少ないからか、やり方が間違っているのか、OCoRでの位置がLBSと殆ど変わらない。わずかにゆとりがある程度だろうか。うーむ、やはりちゃんとしたモデルでテストするべきなのかもしれない。
ところで、新しいゲームエンジンXenkoが4月にリリースされるみたい。Unityと同じくC#で開発できる。APIマニュアル見る限り、行列演算が充実してて便利そう。ちゃんと組むならこっちでやりたいかも。
それまでにクォータニオンも勉強しなきゃだなぁ。