-IKで表示されたボーンをFKで表示する- |
-IKで表示されたボーンをFKで表示する- BrightObjectでは、IKで表示した場合もFKで表示した場合も データ的には同じボーンデータを扱っています。 FKで描画した場合でもIKで描画した場合でも、 初期姿勢状態のボーンに対して「回転軸」「回転角度」を与え、 「回転軸」の周りで「回転角度」分回転させるという点は同じです。 FK表示とIK表示で違う点は、 「回転軸の向き」 「各ボーンが持っている、初期姿勢状態から現在の状態になるための座標系変換行列と任意の回転行列」 です。 逆に考えれば、上記の2点さえ正しく計算できれば、IK表示のボーンをFK表示にすることは可能ということです。 ここでは、IK表示用ボーン、FK表示用ボーンを作成せず、 IK表示からFK表示になるように計算する方法を考えてみます。 初期姿勢は以下のようになっているとします。 シンプルに、2つのボーンで構成されたボーンを考えます。 IKで先端のジョイントを上に移動させたとします。 IKで計算された結果、以下のようになったとします。 この状態の時は、IKのアルゴリズムを使って各ボーンのローカル座標系へ変換する行列と、任意の回転行列を作成し、 初期姿勢状態を、ワールド座標系から各ボーンのローカル座標系に変換するための行列と任意の回転行列を使って ボーンを回転させた結果を表示しています。 FK表示に変換するときに、この姿勢を「仮の初期姿勢」という扱いとします。 「仮の初期姿勢」とは、IK表示からFK表示にした時にとっている姿勢という意味です。 仮の初期姿勢は"仮"とはいえ初期姿勢という扱いをしますので、 各ボーンが持つ行列は、「ワールド座標系から各ボーンのローカル座標系に変換するための行列」 だけを持つということです。(任意の回転行列は、回転角度が0度なので単位行列となる) この状態を「新たな初期姿勢」として、最初に用意された本来の初期姿勢を上書きしてもいいのですが、 BrightObjectの「すべてのジョイント回転を元に戻す」メニューを選択したときに、 本来の初期姿勢に戻れなくなってしまうため、 本来の初期姿勢を「仮の初期姿勢」の姿勢となるように回転行列を作成しています。 具体的には、本来の初期姿勢の各ボーンが、仮の初期姿勢となるように回転行列を作成し、 ワールド座標系から各ボーンのローカル座標系への変換行列に対して その回転行列を掛け合わせる、という処理と同様なことを行っています。 このように、あるモデルの初期姿勢を「仮の初期姿勢」になるように各ボーンを回転させれば、 IK表示専用ボーン、FK表示専用ボーンを用意しなくてもよいということになります。 IK表示専用ボーン、FK表示専用ボーンを用意したとしても、 IK表示の姿勢のままでFKのアルゴリズムでボーンを動かしたいことも多々あると思いますので、 考え方は違うとしても、こういった変換方法が使われているような気がしますね。 |