マルチレイヤーモーションとは?


マルチレイヤーモーションとは、ボーンごとに異なるモーションを再生させる仕組みのことです。
どういうときに便利かというと、例えば、下半身は走りながら上半身は銃を打つモーションをするとか
上半身は拾ったものを持った状態のまま下半身は歩くモーションをするとかいう場合に便利です。

Easy3Dのマルチレイヤーモーションには、モーションアクセラレータ(以下略してMOA)対応版とMOA非対応版の命令があります。

どちらの場合もボーンごとに条件を設定可能にするために、listとnotlistという2つの配列を引数にとります。
まずは、これらlist, notlistの使い方を説明します。

list, notlistはボーンの番号をセットした配列です。
listには処理を行いたいボーンの内、一番親の番号を記述します。
listに指定した番号とその子供全部に対して再帰的に処理を行います。
notlistには除外したいボーンの内、一番親の番号を記述します。
notlistに記述した番号は、listに記述した番号よりも優先されます。
list, notlistには複数の番号を指定できるが、一番最後の要素には0をセットしなければなりません。
listの先頭要素に限り-1を指定できます。
-1指定はすべてのボーンに対する処理を表します。

list, notlistへの値のセットの仕方の例を示します。

左肩のボーン番号を2、左ひじの番号を3、左手の番号を4、
右肩のボーン番号を12、右ひじの番号を13、右手の番号を14、
手に持っている武器のボーン番号を22として
武器を除く手の部分にモーションを設定したい場合は、

list(0) = 2
list(1) = 12
list(2) = 0

notlist(0) = 22
notlist(1) = 0

(Win32版では()は[ ] に直してください。)

のようにlist, notlistの配列に値をセットして命令を呼び出します。
2を指定すれば2の子供全部に処理が行われるので3,4を指定する必要はありません。
同様に12を指定すれば12の子供全部に処理が行われるので13,14を指定する必要はありません。
リストの最後には必ず0を指定します。

list, notlistの使い方がお分かりいただけたと思います。
これらを使いこなせば、望んだボーンにだけ任意の命令を処理させることができます。
ではそろそろ具体的な命令を見てみましょう。


MOA非対応版のマルチレイヤーモーション
MOA非対応版のサンプルはe3dhsp3_MultiLayerMotion.hspにありますので、まずはそれをごらんください。
listとnotlistの使い方が分かっていれば簡単です。
E3DSetMotionKindMLという命令で、listとnotlistで指定したボーンにだけ任意のモーションを設定させます。
そして、E3DSetNewPoseの代わりにマルチレイヤーモーションでは、E3DSetNewPoseMLを呼び出します。
これだけでOKです。

MOA対応版のマルチレイヤーモーション
MOA対応版のサンプルはe3dhsp3_MultiLayerMotion_MOA.hspにありますのでご覧ください。
MOA対応版を使うことにより、モーションとモーションのつなぎ目で自動的に補間モーションが再生されるようにすることが可能です。
通常のMOAではE3DSetNewPoseByMOAを呼び出していましたが、マルチレイヤーモーションでは、
設定したいボーンごとにE3DSetMOAEventNoMLを呼び出し、
すべてのE3DSetMOAEventNoMLが終わったらE3DSetNewPoseMLを一回呼び出します。

こつは複数回のE3DSetMOAEventNoML呼び出しで、すべてのボーンについて取りこぼしなくイベント番号を指定することです。
またイベントが無い場合はイベント番号に0を指定して呼び出すことを忘れないことです。
イベント番号0を渡すことによりモーションが終了したときにアイドリングモーションへ移行できます。

モーションの変更はボーンごとに任意のタイミングで行われますが、アイドリングだけは全ボーンが同期するように変更されます。
例えば、上半身と下半身とに分けて制御している場合、
ある時点で上半身がアイドリングになり、5フレーム後に下半身がアイドリングになったとします。
このとき、上半身と下半身とでアイドリングに移るタイミングは異なりますが、上半身と下半身がアイドリングモーションになっているときは
アイドリングモーションの同じフレーム番号を再生します。
つまり5フレームのずれは、自動的に吸収されて同期して再生されるということです。


マルチレイヤーモーション使用時の注意点
マルチレイヤーモーションではボーンごとに異なるモーションを再生するために
ある時点での姿勢情報は、その時になってみないと計算できません。
そのため、モーションIDとフレーム番号を渡して情報を取得するような命令は使えなくなります。

例えば疑似親子を実装している場合、
E3DGetBonePosとE3DGetBoneQを使用していると思います。
これらE3DGetBonePosとE3DGetBoneQは上記の理由で、マルチレイヤーモーションでは使用できないので
代わりにE3DGetCurrentBonePosとE3DGetCurrentBoneQを使用する必要があります。
これらの命令はE3DSetNewPoseMLで確定した姿勢情報を元に情報を返すので、マルチレイヤーでも使用可能なのです。


トップページに戻る