イベント
[CEDEC 2011]次世代キャラクターアニメーションの基本? フルボディIKエンジンで自然なモーションを実現する
IKとはInverse Kinematics(逆運動学)の略で,CGの世界では手足の末端などの位置からキャラクターの自然なアニメーションを作り出すことをいう。始点になる姿勢と終点になる姿勢の間を補間するようなものを想像してもらうと分かりやすいだろう。それをキャラクターモデル全体に広げたものがフルボディIKである。今回紹介されているのは,さらに進んで,自動でバランスを取ったり,破綻のない挙動に補正されるような高度なものとなっている。
このようなフルボディIKを使うと,任意の姿勢からのリアルなアニメーションを容易に作成できるとか,ゲーム内のインタラクティブなアニメーションをリアルにするなどに有用であり,ゲームにとっては重要な技術だといえる。セッションの内容はIKの基本理論が中心だったので,少し人を選ぶ内容なのだが,デモ動画は誰にでも楽しんでいただけると思うのでざっくり目を通してみていただきたい。
フルボディIKとはなにか?
本セッションを担当したのは,コーエーテクモゲームスの津田順平氏だ。津田氏は昨年と今年の「ゲーム開発マニアックス〜物理編」にパネリストとしても参加するなど,日本のゲーム物理では第一人者の一人といっていいだろう。
セッションの内容はフルボディIKの基本がメイン,そして実装時に現れる異常動作の原因と対策についてだった。そもそも,フルボディIKというのはどういうもので,なにが必要になるのかが分かっていないとセッションの内容も理解できないと思うので,まずは津田氏が自社で手がけているというフルボディIKエンジンのデモを見ていただきたい。
手足を動かすとキャラクターの全体が自然に動いているということが,デモを見れば分かると思う。また,例えば手を引っ張ると逆の足を挙げてバランスを取ろうとするなど,実際の人間を動かしたときのような動きの反応を見せてくれたりもする。このような自動アニメーションを生成するエンジンに必要なものはなんだろうか。
運動学とかロボット動力学では,関節を動かす量や速度,手足の位置や速度といったパラメータから運動を解析している。そして,関節を動かす量や速度から手足の位置や速度を求めるのが“順運動学”(Forward Kinematics)だ。
これが先の動画のようなシステムでは,逆になることは容易に想像できるだろう。つまり,手の位置をここまで移動させるために各関節をどれくらい曲げなければならないかなどを求める必要がある。これが逆運動学(Inverse Kinematics:IK)というわけだ。
スライドは運動学の基本になる式をシンプルに表したもので,Jはヤコビ行列(ヤコビアン)である。偏微分の記号なんかが出てきて難しそうだが,要するにヤコビアンは関節の速度(角速度だったり移動速度だったり)と手足の先端(エフェクタなどという)の速度の関係を求める係数だよ,ということだ。そして逆運動学では,ヤコビアンの逆行列を使って各関節の速度を求めればいいというのが下の式である。
「求めればいい」といっても簡単でないことは想像できるだろう。例えば,手の先をある位置に動かすとき,肘などの関節の動かし方は1通りではない。つまり,逆運動学の解は無数にある。最適なものはどれかを求めることが重要になるのだが,それは一旦脇に置いておこう。
というわけで,次のスライドがIKの基本的なアルゴリズムになる。Step1は簡単で,エフェクタを動かしたい位置と現在の位置の差分を時間で微分すればエフェクタの速度は出せる。続くヤコビアンの導出が結構ややこしいく,津田氏は時間を割いて説明していた。スライドから雰囲気だけでもつかみとっていただきたい。
スライドで示された例は3つの関節を持ち,それぞれの関節は1軸,つまり平面上での回転しかできないと考えてほしい。エフェクタの動きは,それぞれの関節を動かしたものの合成だから,そのベクトルからヤコビアンが導出できるということになる。
もちろん,人体の関節は1軸ではない。ほとんどの方向に動く3軸ボールジョイントであったり,2軸に動く関節だったり,場所によりいろいろだ。
さらにフルボディIKは全身で,人間であれば背骨に腕や足の関節がくっついているという簡易なモデルを使って拡張されることになる。アニメーションでは,そんな人間の肩や肘などが水平(など)に動くということもあるのだが,それについては「スライダージョイントで計算すればいい」と津田氏は説明していた。
というわけで,ヤコビアンが求まればあとは簡単と言いたいところだが,「ヤコビアンの逆行列は,普通は計算できない」(津田氏)のだ。言うまでもなく逆行列を持つのは正則行列だけ。ここまでの説明で分かると思うが,ヤコビアンの行は空間次元数,列はジョイントの軸に応じる。したがって,正則行列にはほぼなりえないということになる。
先の式からヤコビアンの逆写像を求めれればいいということにもなるが,もちろん逆写像は無数にある。先に述べたように,エフェクタの動きに対応する関節の動きは無数にあるということからも,それは自明だろう。
というわけで,ここでは「擬似逆行列」というものを使うそうだ。擬似逆行列というのは簡単にいうと行列に転置行列をスライドのように乗じたものである。
MよりNが大きいとき,擬似逆行列を使って求めた解は最小ノルム解……簡単に言うと,最も関節の移動量が小さい解になるそうだ。津田氏がいうように,これはIKにとっては非常に都合がいい解で,最も無駄が少ない動きに相当する。
一方,MがNより大きい場合……これは想像すると分かると思うが,空間次元より軸の自由度が小さいのだから常識的には解けないが,擬似逆行列を使って求めた解は最小二乗解になるという。これは「実際には無理だが,なんとか目的の方向にエフェクタを動かそうとする解」にあたる。これまたIK的には都合がいい解になるわけだ。
以上で最初に挙げたアルゴリズムのStep3までが満たされ,Step4以降は悩まずとも実現可能になるが,津田氏はさらに「参照姿勢」に追随する方法を紹介してくれた。参照姿勢というのは,例えば,人間なら背筋を伸ばしておきたいといった,ある程度拘束しておきたい姿勢があり,その姿勢に追随させるにはどうするかという話だ。
具体的には,参照姿勢から参照速度を出し,参照速度からの差分を加えるという形で,「バイアス付き最小ノルム解」を求めるという方法だったが,このあたりは枝葉末節……というと語弊があるが応用編になるので省略したい。
重心制御で倒れない姿勢を保つには
もう一つ,最初のアニメーションでは,キャラクターが倒れないようバランスを取っていたが,これはどうやるのだろうか。
二足歩行ロボットに詳しい方なら,二足歩行ロボットが倒れずに歩くために,重心を支持多角形……これは足の底面を結んだ多角形のことだが,その中に重心を収めるように制御することをご存じだろうと思う。フルボディIKでも,まったく同じ方法を使うそうだ。
さて,キャラクターの重心は人体各部の重心を合成したものだ。人体各部の動きから重心の動きも求まるわけだから,人体各部の動きを制御すればいいということになる。要は先の方法と「運動量ヤコビアン」を使って重心の位置が,支持多角形の中に収まるよう人体各部の運動量をコントロールするのである。
運動量ヤコビアンが求められれば,先の速度ベースのIKと同じ方法で,重心があるべき位置に収まるよう運動量を計算してやればいい。アルゴリズムは次のスライドのようになる。
このあたりは,もうロボット工学そのものだが,前節の逆運動学もロボット工学では盛んに使われるもので,フルボディIK自体がロボット工学のCG版という雰囲気が分かるのではないだろうか。
そのほか,津田氏はフルボディIKで無理な姿勢を取らせたときに見られる異常動作(オーバーシュート)をどう処理するかについても解説。重たい特異値分解を使わずに済むDamped Least Squiare(DLS)という手法を解説していたが,かなりややこしいうえに専門性も高いので,ここらあたりに興味がある方は,筆者があれこれと説明するよりCEDEC 2011の公開資料などを見ていただいたほうが得るものは多いだろう。
いずれにしても,フルボディIKエンジンは自然なアニメーションが作成でき,さらにデザイナーも使いやすいツールであることは確かだろう。モーションキャプチャだけではカバーできない部分でリアルな動きを表現する手段として今後ゲーム自体にも積極的に取り込まれていくかもしれない。
- この記事のURL:
キーワード