株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • ICE Kinematics でオリジナルIK(前編) - アップベクターと制限角度の仕込み -

ICE Kinematics でオリジナルIK(前編) - アップベクターと制限角度の仕込み -

2011/3/28

Tag: ,,,

お初にお目にかかります。Softimage の TD をさせてもらっている 上原達也 と申します。

初投稿となる今回は Softimage の ICE Kinematics を題材にして書きたいと思います。

まずは、ICE Kinematics について。
シンプルに説明すると、
「ノードをつないで計算式を構築でき、その結果を3Dオブジェクトの位置や回転などにあてはめることができる機構」です。
この説明がわかりやすいのか(というか正しいのか)ちょっと不安ですが、
要はエクスプレッションやコンストレインを使わなくても、テクニカルな仕組みが構築できてしまう優れものということです。
しかし、いろんな事が出来てしまう反面、習得するにはかなりの根気が必要でもあります・・。

今回紹介するのは、私が以前 ICE Kinematics の勉強用に作った「角度制限機能付きIK」です。


こんなものは通常の Softimage の IK なら出来てしまうのですが、 ICE Kinematics で実現しようとすると
参考にするものがなく、どう作ればいいのかわかりませんでした。
これはあくまで一つの作例にすぎませんが、皆さんの参考になれば幸いです。

※サンプルデータは一番下のリンクからダウンロードできます。

「角度制限 IK なんて地味すぎるw、もっとなんかあっただろー」なんて言わないでくださいねw
それはまた今度ということで。

ではさっそくいきましょう!
「 ICE Kinematics でオリジナルIK(前編) - アップベクターと制限角度の仕込み -」

※ちなみに、ここで扱う内容は入門編というわけではありません。
多少 ICE 、 ICE Kinematics の知識がある前提です。また、数学的な部分も出てきますが、
そこに関しては「そういうもんだ」と思って読み進めていただいて構わないと思います。

1.アップベクター(方向コンストレイン)

まず、今回作った IK は大きく2つに分解して考えることができます。

画像のように、アップベクター部分と IK 部分に分かれています。
これによってどんな利点があるかといいますと、
IK を2次元 ( x , y ) で独立して考えることができます。
それに、最終的に回転を合成すればいいだけなのでシンプルです。

アップベクターを求めるのに必要な要素は以下の位置情報です。
・Root の位置
・Target の位置
・upv の位置

それでは試しにノードを構築してみましょう。
・Root ( ヌルオブジェクト )
・Target ( ヌルオブジェクト )
・upv ( ヌルオブジェクト )
・cube (適当なポリゴンメッシュ )
・ICERIG ( ポイントクラウド ) ※ICETree を作成する場所

※スケールに <-1,-1,-1> の 3D ベクターが刺さっているのは見た目を反転するためだけです。それ以外に意味はありません。
※IF ノードは、オンオフを切り替えることでアップベクターの向きを反転させるものです。

・・・大丈夫ですかね。
これで、 「方向コンストレインとアップベクター」 ができました。

2.角度制限

骨の角度に制限を設けるということは、
「ある角度を超えたら(もしくは、下回ったら)その角度で固定する」という解釈で間違いありませんよね。
では下の画像を見てください。
例えば、制限角度を 50 度に設定したとします。
すると、骨2に関しては、50度を超えたら 50 度で固定しちゃえばいいです。
しかし、そのときの骨1の角度はどうでしょうか?
何かしらの数値で固定しないと、どんどん回転してしまっておかしなことになるんです。

というわけで、骨2が50度で固定されたときの骨1の角度を計算しなくてはなりません・・。

これを求めるにはベクトルを使います。

流れは以下のとおりです。
1.骨1と骨2の長さをもつベクトルを作ります。

2.骨2の長さをもつベクトルを制限角度分回転させます。

3.骨1の長さをもつベクトル(赤)から骨2の長さをもつベクトル(青)を引き算すると緑の部分のベクトルを求めることができます。
※これはベクトルの引き算の特徴です。ベクトルの演算を覚えておくと役立つこと間違いなし!

※↑見た目で分かりやすいように全体を回転しました。

4.骨1の長さをもつベクトル(赤)と緑のベクトルから骨1の角度を求める。
都合よく「Get Angle Between」というノードがあるのでこれを使います。

このようにして、骨1の角度を求めることができました。
これを、最小角と最大角の2パターン準備すればOKです。

今日はここまでー。

今回の内容は、配布サンプルシーンに含まれる 「 Limit 2Bone IK 」 コンパウンド の
「Step1」部分、「アップベクターと、角度制限の仕込み」となります↓

次回投稿の際は後編をお送りします!(たぶん)

「 ICE Kinematics でオリジナルIK(後編) -余弦定理&回転の合成 -」

お楽しみに!!

■サンプルシーンのダウンロードはこちら■
DF_LimitAngleIK_v1.0_SI2011.5.zip

※注意※ このサンプルシーンを使用したことによって引き起こるいかなる損害も

当方は一切責任を負いかねます。自己責任でご使用ください。

Pocket

コメント

こんにちは。いつも面白い記事をありがとうございます。

IKでの角度の制限は、余弦定理を使って Root と Target の距離の制限に置き換えてやると
シンプルかつ応用も効きやすくなると思います。

骨1と骨2の長さを a,b、RootとTarget の距離を c 、制限角度をαとすれば、
余弦定理では

c^2 = a^2+b^2-2abcosα

このように表せるので、 c の最大距離 cmaxは

cmax = √(a^2+b^2-2abcosα)

ということになります。この距離よりも c が短ければ本来の Target の位置を、
長ければ normalize(Target-Base)*c+Base の位置を新しい Target の位置として
使用すると角度制限ができます。

このメリットは、 IK 計算をする前のコントローラの段階で角度制限を仕込めるので、
より複雑なリグと組み合わせるのも簡単な点です。

ご参考までに。

chiyamaさん
鋭いツッコミありがとうございます!!

実をいうと余弦定理を使って角度制限部分を作ったサンプルもコンパウンドの中に入っていたりします。
(紹介しろって感じですね・・すみません)
でも今回使わなかったのは、あまりパフォーマンスが良くなかったからなんです。
組み方が悪かったのかわかりませんが、√(ルート)のせいじゃないかなあと思ったり・・。
あと、ヴィジュアルプログラミングゆえに、ノードが多くなって分かりにくいというw
というわけで、ベクトル使ってやってみたとこでしたー。

また何かありましたらぜひご教授くださいませ!!

ICE による骨構造を作製する際に大変参考になる情報、ありがとうございました。
自分もTDながらプログラマーではないので、ICEの関数とかはプログラマーさんに・・・・
公開できるICEものはSoftimageUsersNotesのアチコチに
コンパウンドが置いてあったりますので、ざひ参考にしてみてください。
お互いに ”こんなん出来ましたー!!” って見せっこできると良いですね。

Ritaroさん こんにちは!
UsersNotesの方ではないですか!こちらこそありがとうございます。UsersNotesばっちり見てますよ!すごく勉強になるので毎回楽しみにしてます。
見せっこしたいとこなのですが、いまだに後編すらポストできてないという・・・す、すみませんorz
さすがに前回の投稿から間隔開けすぎてしまったのでそろそろ記事書き始めなければ・・。
今後ともよろしくお願いします!

5 thoughts on “ICE Kinematics でオリジナルIK(前編) - アップベクターと制限角度の仕込み -”

  1. chiyama より:

    こんにちは。いつも面白い記事をありがとうございます。

    IKでの角度の制限は、余弦定理を使って Root と Target の距離の制限に置き換えてやると
    シンプルかつ応用も効きやすくなると思います。

    骨1と骨2の長さを a,b、RootとTarget の距離を c 、制限角度をαとすれば、
    余弦定理では

    c^2 = a^2+b^2-2abcosα

    このように表せるので、 c の最大距離 cmaxは

    cmax = √(a^2+b^2-2abcosα)

    ということになります。この距離よりも c が短ければ本来の Target の位置を、
    長ければ normalize(Target-Base)*c+Base の位置を新しい Target の位置として
    使用すると角度制限ができます。

    このメリットは、 IK 計算をする前のコントローラの段階で角度制限を仕込めるので、
    より複雑なリグと組み合わせるのも簡単な点です。

    ご参考までに。

  2. tatsuya より:

    chiyamaさん
    鋭いツッコミありがとうございます!!

    実をいうと余弦定理を使って角度制限部分を作ったサンプルもコンパウンドの中に入っていたりします。
    (紹介しろって感じですね・・すみません)
    でも今回使わなかったのは、あまりパフォーマンスが良くなかったからなんです。
    組み方が悪かったのかわかりませんが、√(ルート)のせいじゃないかなあと思ったり・・。
    あと、ヴィジュアルプログラミングゆえに、ノードが多くなって分かりにくいというw
    というわけで、ベクトル使ってやってみたとこでしたー。

    また何かありましたらぜひご教授くださいませ!!

  3. Ritaro より:

    ICE による骨構造を作製する際に大変参考になる情報、ありがとうございました。
    自分もTDながらプログラマーではないので、ICEの関数とかはプログラマーさんに・・・・
    公開できるICEものはSoftimageUsersNotesのアチコチに
    コンパウンドが置いてあったりますので、ざひ参考にしてみてください。
    お互いに ”こんなん出来ましたー!!” って見せっこできると良いですね。

  4. tatsuya より:

    Ritaroさん こんにちは!
    UsersNotesの方ではないですか!こちらこそありがとうございます。UsersNotesばっちり見てますよ!すごく勉強になるので毎回楽しみにしてます。
    見せっこしたいとこなのですが、いまだに後編すらポストできてないという・・・す、すみませんorz
    さすがに前回の投稿から間隔開けすぎてしまったのでそろそろ記事書き始めなければ・・。
    今後ともよろしくお願いします!

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*