>   >  COYOTE流テクニカルTIPS:TIPS 02:【Maya】Quaternionを使ったRoll成分の分解
TIPS 02:【Maya】Quaternionを使ったRoll成分の分解

TIPS 02:【Maya】Quaternionを使ったRoll成分の分解

クリーク・アンド・リバー社の社内CGスタジオであり、ゲームの3DCGグラフィックス制作を中心に手がけているCOYOTE 3DCG STUDIO。本連載では、同社のTAチームによる制作に役立つ技術TIPSを紹介していく。

TEXT_山本智人 / Tomohito Yamamoto(COYOTE 3DCG STUDIO)
EDIT_小村仁美 / Hitomi Komura(CGWORLD)

はじめに

おはこんばんちわ。COYOTE 3DCG STUDIO テクニカルアーティスト(以下、TA)の山本です。

全3回に渡って紹介するテクニカルTIPS「ノードの回転制御」、今回はその第2回です。

・ベクトルを使ったノードのBend制御(前回
・Quaternionを使ったRoll成分の分解(イマココ!)
・ベクトルの活用(内積・外積・三角関数)

前回はベクトルを駆使してノードの回転成分を分解し、Bend=「曲げ」成分を抽出して「捻り防止」のノードの作成方法を紹介しました。今回はRoll=「捻り」成分をQuaternion計算を使って抽出していきたいと思います。

Result:結果を先に

前回と同じ手法を用いてノードのBend成分を抽出し、元の回転成分から打ち消すことによって、Roll成分のみを抽出します。

さて、Bend成分の抽出は前回取り上げましたが、ここからどうやってBend成分を回転成分から打ち消すのでしょうか。そもそもなぜ打ち消すとRoll成分を抽出できることになるのでしょうか。ひとつずつ考えていきましょう。

Step 01:「手首」の捻りを参考に、Roll制御について考えてみる

キャラクターの例では主に腕や足を捻った際、モデルの破綻を回避するために補助骨を徐々に捻らせる手法はポピュラーな例だと思います。二の腕や太もも・肘、膝などは、腕や脚における1軸の回転を考えれば良いので楽です。

オイラーでも簡単に実装できますね。しかし、手首の場合はどうでしょうか。先ほどの例と同じようにオイラー角の1軸で制御してみます。メインの軸をX軸として骨の軸方向を考えると、手首の捻りはX軸の回転を見れば良さそうです。

補助骨に手首のX軸回転の半分が入るようにノードをつなげて......

回してみると。

おっ。いい感じ?
しかし、手首を曲げて回してみるとどうでしょうか。

ちがう。そうじゃない。
本当はこんな風に動くのが理想ではないでしょうか。

なぜ上手く制御ができなかったのでしょうか。
手首の場合は腕や脚の場合と違って、手首自身の回転状態によっては「捻り」として認識したい軸が変わりますね。

この場合はX軸ですが、

この場合はY軸になるように見えます。

このような制御を実現するには、一体どうすれば良いのでしょうか。

Step 02:回転成分からBend成分を打ち消す

「捻り」単体で考えると難しそうですが、前回の記事で「Bend = 曲げ」の制御は成功しています。

このように、左の手首のBend成分を抜き出して右側の手首に代入することで、現在の「曲げ成分」だけでノードを回転させることができています。ならば、回転成分からこのBend成分を打ち消すことによって、捻り=Roll成分を抽出することはできないでしょうか。

オイラー回転で試してみましょう。現在の手首回転とBend回転をplusMinusAverageノードにつなぎ、手首の回転からBendの回転を引き算させます。

結果は......

お! できたかも!?
思った通り、回転成分からBend成分を打ち消せばRoll成分を取り出すことができそうです。

次ページ:
Step 03:Quaternionについて考える

その他の連載