IKのためのボーン基礎知識

 http://www.mars.dti.ne.jp/~ogamio/ by 拝御 礼

このテキストでは、まずブラッシュアップの6章を読んでいただいたことを前提に説明します…というか、それの補足ですね。

 あの6章を試していただいた方はもご存じかと思いますが、あのボーン構成ではIKが上手く働きません。FKではボーン構成をしっかり頭にたたき込んでいれば問題ないはずですが、いちいち制御が難しくなってしまいます。そこで6章の理念を維持しつつ、IKを利用する方法を模索していましたが、とりあえずその目安みたいなもの(実際は自分ではこれを実践したモデルを作成していますが)ができましたので、こちらでとりあえず発表しておきたいと思います。

 なお、毎度のことながら私独りではこういった問題を解決できませんで、冨士さんに色々とご教授・ヒントをいただきました。どうもありがとうございました。

1.ジンバルロックについて

 さて、C4DでIKを使用する上で、どうしても頭に入れておかなければならないことがあります。それはジンバルロックです。

 今更…の感じもありますが、あえて再度ジンバルロックについて頭にたたき込んでおきましょう。

1.1.ジンバルロックとは何か?

 さんざんっぱら3DCGソフトで問題になっているジンバルロックとは何か。

 とりあえずサンプルとして右のアニメーションを見てください。親子関係を結んだボーン(両方ともIKタグでB軸が回転しないように固定してあります)が先端にあるIKゴールの移動に伴って屈伸を行いますが、子の方が90度に曲がった際くるりと回転しているのがわかると思います。

 これはP軸回転し、90度曲がった場合、Y軸とZ軸が同じ方向に向いてしまい、どの軸がどの方向に向いているのか見失ってしまい、制御が効かなくなる現象です。

 …説明が合っていないような気がする(^^;)。詳しくは専門書をご覧ください(^^;)ぉぃ。

 ともあれ、そんな感じなので固定してあるハズのB軸が回転してしまい、座標軸がくるりと回転しているでしょ?もしこれが肘の関節だった場合、肘が90度以上曲がった瞬間、前腕部が勝手にヘンな方向に回転してしまうわけです。これは非常にマズい。

1.2.IKでジンバルロックを考えなければならない理由

 IKを設定する際、C4DにはIKタグといった制限ツールがあるので、H軸だのP軸だの、90度以上曲がらないようにすれば、あるいは特定軸の可動範囲を0度にして混乱を防げば良いし、なによりIKゴールターゲットを操っている時点でジンバルロックを起こしそうな箇所を90度曲げなければ、曲がらないように動かせばいいじゃないか…という意見もあるでしょう。

 しかし残念ながらさにあらず。前者はとりあえずその通りだとしても、後者はそうはいきません。IKはいわばシミュレーションツールなのです。IKを組んでいるオブジェクトの中でゴールオブジェクトを動かせば、当然リアルタイムIKならそのゴールの移動に基づいて計算を行います。

 この際、実はC4Dは様々な計算を行い、ゴールを動かした以上に曲がった状態のオブジェクトの計算を行う場合があります。見た目、ゴールを動かしても関節が90度以上曲がらないように見えても、IKでは90度以上曲がることも計算しているわけです。

 そうするとジンバルロックが起こる可能性がある関節が介在している場合、実際の曲がりではそうではなくても、IK計算中にジンバルロックを起こし、正常な計算が行えなくなってしまう場合があります。単純なIK構造なのにゴールを動かすとボーンがカクカク震える変な挙動をすることがあると思いますが、それは大抵こういったケースに当てはまります。

 では、ジンバルロックを起こらない用にIKタグで制限してしまえば良い…という先ほどの「前者」の話になるわけですけれども、これでは制限が大きくなってしまいます。「肘」すらまともに作れなくなってしまいます。また、ジンバルロックだと、結局「どの軸」というのがわからなくなってしまうので、軸の可動制限をしていたとしても、それが意味を成さなくなってしまいます。先ほどのアニメーションでB軸を固定していたのにもかかわらず、回転してしまっているわけですから。

2.ジンバルロックの回避方法

2.1.関節可動範囲を180度未満まで持っていく

 そこで、勘のいいユーザーならもう大体察しが付いていると思いますが、例えば肘の場合、その通り、90度以上曲げさせなければいいようにしてしまえばよいわけです。

 「は?」と思われる方はもうちょっと想像力を働かせていただきたい。「90度以上曲げられない」とは書きましたが、-89度とかには曲げていけないとは書いてはいません。

 そう、約89.9度〜約-89.9度の可動範囲をして大抵の人間の関節をカバーする180度程度は動くようにしてしまおうと。そのためにダミーボーンを挟み込んでみます。

 とりあえず肘のあたりのボーン構成として右を見てください。上向きに肘を曲げる構造ですね。Bone00は大元のボーンと言うことで、とりあえず無視してください(^^;)。

 ミソはBone02で、これをダミーボーンにして前腕部を制御するBone03の座標軸をリセットし、上腕から見て大体0度から170度くらいの可動角度を確保しています。

 ちなみにここでいうダミーボーンとは影響度0%の、ポリゴンオブジェクトに影響を与えないボーンを言います。座標軸をリセットするだけなのでNullでも良さそうですが、ボーン階層に親子関係のためのNullを挟み込むとデフォーマとしての役割を果たさなくなってしまうので、必ずダミーボーンを設定してください。

2.2.マルチターゲットを使う方法

 ダミーボーンを使えばかなりの自由度が増しますが、180度制限は付いてまわりますし、何よりボーン構造がややこしくなります(ダミーボーンが増える分)。

 そこで別の方法としてマルチターゲットというプラグインを使用する方法があります。これはオブジェクトのZ軸の向きがIKゴールに向くようにするのに、Z軸だけでなくY軸についてもゴールオブジェクトを設定できるようにするプラグインです。

 こういった、Z軸とY軸にIKゴールを設定するプラグインは実は他にもあったりします。機会があったら探してみてください。とりあえずここではマルチターゲットを例に説明します。

 何故にY軸までゴールを設けようかと言えば、ジンバルロックが起こる際、回転軸の混乱によりZ軸があらぬ回転をしてY軸方向がおかしくなるわけですが、そこで「Y軸はこっち」と指定してやることにより、ジンバルロック状態でも「こっちの向きに向く」と立体的に指定できるようになり、ジンバルロックが起こりようがない…というか、起こってはいるが、強制的に矯正されてしまうわけです。

 これを利用してIKを組めば、ジンバルロック云々の問題なく、関節等が設定できるようになります。

 例えば右のように前腕部のボーンに二つずつゴールを設定します。さすがに二つゴールがあるというのも面倒なので、それらゴールをTargetという名のNullにまとめ、Bone03と同じ座標に起きます。

 そしてそのTargetを回転させれば、その回転についてBone03は自由な角度を向くことが出来ます。先の180度制限もありません。

 問題点としては、ボーンが増えないかわりにゴールオブジェクトが増えてしまうという…(^^;)。また、構成としてあまりIKらしくない構造になってしまうと言うことでしょうか。

 左記の例ではBone03が自由に角度を変えられますが、Bone01にはなんら影響を与えません。別途Bone01のターゲットとしてTargetを指定してやったりする必要も出てきます。なおさらゴールオブジェクトの構造が複雑になるかもしれません(^^;)。  

以上のようにいくつかの方法でスムーズなIKを設定することが出来ます。

 右の例は私の販売データをサンプルにしたもので、出来合のもので申し訳ないが、Bone01が上腕にあたり、Bone03が前腕にあたるように設定しています。

  Bone03はマルチターゲットを設定し、Bone01のゴールも肘にあたる場所に配置したゴールオブジェクトを向くように設定してあります(Bone03のゴールオブジェクトはBone01のゴールオブジェクトの子にしてあります)。

 ちなみに、Bone04などにあるハンドルのようなタグは、Driven Actionというプラグインで、Nullオブジェクトの回転角度などを参照するように設定してあります…が、まぁ今回のIKには関係ないので気にしないでください(^^;)。

 6章では「肘の形状を維持したい」といったコンセプトがあったので、肩から肘の間にボーンを2本仕込んでいましたが、今回の構成では肩から肘までは1本のボーンになっています。ただ、肘から前腕に向かうボーンの他に、肩に戻るボーンが設定してあります(Bone04)。これにより、肘の動きと連動するボーンで肘の回転を肘近くの上腕部分を伴おうというハラです。

 で、こちらは角度によってはB軸くるり回転を行うので、ダミーボーンを介在させ(Bone04Fix)、角度のリセットを行っています。

 こういった感じでボーン構成を行い、IK設定を行うと、6章サンプルをIKにしたものよりスムーズな動作を行えるようになります。

 まぁさすがにこの説明だけとなるとオブジェクトの宣伝にも思えるので(^^:)、腕部だけになりますが、サンプルを掲載しておきますので参考にしてみてください。

 サンプルはダミーボーンとマルチターゲットを併用する形にしてありますが、どちらか一方だけにしても構いません。また、上腕にマルチターゲットを設定し、Bone01のY軸向きを設定すれば、腕を肩よりも上に上げたときに形状がおかしくなるのを防ぐ制御も出来るようになるかもしれません。

 色々工夫してみてください。