モーションアクセラレータについて
1、モーションアクセラレータとは
概要
モーションアクセラレータ(以下では「MA」と略します)とは、簡単に言うと、モーションの自動遷移機能のことです。
( アクセラレータという名前ですが、これは、MS Visual Studioのキーイベントをリソース化する機能の名前を真似たもので、
モーションが、速くなるというわけではありません。 )
MAを使う利点は、大きく3つあります。
@、モーション遷移(変更)の設定を、RokDeBone2で、ビジュアルで行える。
A、イベント番号(変更のトリガーとなるもの)を指定して関数を呼ぶだけで、モーションの遷移(変更)が、行える。[Easy3D]
(モーションの途中から、途中への遷移も可能です。)
B、モーションの遷移(変更)時に、モーションとモーションの間の補間が、自動的に行われる。[Easy3D]
イベント番号について
Aで、イベント番号という言葉を使いましたが、これについて、少し、説明します。
ゲーム中で、モーションを切り替えるタイミングというのは、
プレイヤーが、キーボードを押したり、自分の打った弾が敵に当たったときなど、いろいろあると思います。
これらのモーション変更のトリガー(きっかけ)となるものを、イベントと呼ぶことにします。
イベント番号とは、複数のイベントをそれぞれ、区別するために使う番号のことです。
イベント番号は、複数のイベントを組み合わせて指定できるように、2の乗数の値を使います。
具体的な手順は、
@あらかじめ、走るモーションはイベント1、転ぶモーションはイベント2、ジャンプはイベント4、、、のように、
RokDeBone2で、それぞれのモーションに、イベント番号を設定します。
A*.moaというファイルで保存します。
BEasy3Dで、moaファイルを読み込みます。
CEasy3Dの関数に、イベント番号を渡すことで、自動的に補間モーションを挟んで、モーションの遷移が行われます。
というようになります。
2、RokDeBone2での設定方法
MAの設定は、ツールバーの「モ」ボタンを押して行います。
RokDeBone2で設定した内容は、*.moaという拡張子のファイルに保存します。
RokDeBone2のFileから、読み込み、書き出しが出来ます(下図)
上の図は、RokDeBone2で、*moaファイルを読み込み、ツールバーの「モ」ボタンを押したときの画面です。
ツリービューの形式で、モーションの変更設定が表示されます。
親子階層は、2段までです。(親と子供の2段。子供の子供は無し)
「モ」ボタンを押すと、現在、読み込んでいるモーションが、親項目として、ツリービューに羅列されます。
初期状態では、子供は、ありません。
親項目は、読み込んだモーションを表し、
子供項目は、親項目から分岐する(イベントトリガーで変化する)モーションを表します。
例えば、上図では、「アイドル左」というモーション再生中に、
4種類のイベント番号をトリガーとして、「アイドル右」、「へぼ踊り左」、「小躍り左」、「大踊り左」の4種類のモーションに
変化するための設定がされていることになります。
MAの設定は、ツリービューの項目を、マウスで右クリックすることで、行います。
上の図は、親項目を右クリックしたときのメニューです。
「分岐を追加」と、「プロパティ」の2種類の操作をすることが出来ます。
MAの設定で、一番最初にするべきことは、
親項目のモーションに、名前をつけることです。
名前をつける際には、全てに異なる名前をつけることが必要です。
(同じ名前があると、moa保存時に、エラーが出ます。)
上図は、親項目を右クリックし、「プロパティ」を選択したときの図です。
モーション名のエディットボックスに、重複しない名前を記述して、OKボタンを押してください。
2番目にするべきことは、アイドリングモーションを1つだけ選ぶことです。
アイドリングモーションとは、イベントが無いとき(イベント番号に0を指定したとき)や、
再生中のモーションが終了したときに、再生されるモーションのことです。
親項目を右クリックし、「プロパティ」を選択し、「アイドリングモーションにする」にチェックを入れてください。
1個も、アイドリングモーションが設定されていない場合や、
2個以上設定されている場合は、moa書き出し時に、エラーになります。
モーション名の設定と、アイドリングモーションの指定が終わったら、
いよいよ、モーションの分岐の設定をします。
上の図は、親項目を右クリックし、「分岐の追加」を選択したときの画面です。
まず、「分岐先モーション名」のコンボボックスの矢印をクリックし、
親モーションから、どのモーションに分岐するかを指定します。
まず、「イベント番号設定」のチェックボックスで、チェックをつけて、
どのイベント番号で、モーションの分岐が起こるかを指定します。
イベント番号には、複数のイベント番号を組み合わせて指定できます。
例えば、イベント1といべんと4にチェックを入れた場合は、
イベント1とイベント4が、両方オンになっているとき(例えば、5など)のときに、分岐が起こります。
「分岐元フレーム番号」は、「いつでも分岐する」と、「指定フレームより前で分岐する」の2種類から選択します。
「いつでも分岐する」を選んだ場合は、
親モーション再生中に、「イベント番号設定」で設定したイベント番号が生じたときに、
「分岐先モーション名」で指定したモーションへ、直ちに(補間モーションを挟みますが)、分岐します。
「指定フレームより前で分岐する」を選んだ場合は、
エディットボックスに、フレーム番号を指定します。
「イベント番号設定」で指定したイベントが、指定したフレームより小さいフレーム番号で生じた場合に、
モーションが分岐します。
「分岐先フレーム番号」には、「分岐先モーション名」で指定したモーションの、
どのフレーム番号にジャンプするかを指定します。
通常は、モーションの先頭に分岐するので、0を指定します。
親項目をミグクリックし、「分岐の追加」を選択し、
モーションと、イベント番号を指定する作業を繰り返し、
どのように、モーションを分岐させるかを、設定します。
上の図は、子供項目を右クリックした場合のメニューの画面です。
「分岐を削除」、「プロパティ」の2種類、実行できます。
「分岐を削除」を選ぶと、右クリックした子供項目を削除できます。
「プロパティ」を選択すると、「分岐の追加」時と同じダイアログが出て、
設定を修正することが出来ます。
子供項目の表示順と優先順位
「分岐を追加」を複数回、実行すると、子供項目の表示順番は、実行した順番と異なる場合があります。
これは、分岐時の優先順位が高いほうから表示する仕組みになっているからです。
分岐時には、子供項目のうち、上に表示されているものから、順番に、条件に合うかどうかを判定し、
条件に合うものが見つかった時点で、判定を終了し、モーションの分岐を行います。
優先順位のつけ方について、簡単に説明します。
イベント番号は、複数チェックできますが、チェックした個数が多いほうが、優先順位が高くなります。
(イベント番号の合計ではなくて、イベントの個数の合計が、多いほうが優先されます。)
イベントの個数が同じもの同士の優先順位は、
「分岐元フレーム番号」によります。
分岐元フレーム番号に、小さい値が設定されているものほど、優先順位が高くなります。
「いつでも分岐」を指定している場合は、一番、優先順位が低くなります。
共通分岐イベント番号
親項目のプロパティ(分岐元のプロパティ)ダイアログには、共通分岐イベント番号と、共通分岐禁止イベント番号の設定部分があります。
共通分岐イベント番号は、全ての親項目に分岐を設定したいときに使用します。
例えば、「アイドル右」というモーションに共通分岐イベント番号1を設定したとします。
そうすると、全ての親項目に「アイドル右」の分岐を作り、「アイドル右」にイベント番号1を設定したのと同じ効果があります。
つまり、共通分岐イベント番号を使うと、何度も同じ分岐を設定しなくても済むということなのです。
共通分岐イベント番号を設定したモーションは、他の分岐モーションよりも優先順位が高く設定されます。
共通分岐禁止イベント番号は、共通分岐イベントの中で分岐させたくないモーションがあるときに設定します。
例えば、モーション1に共通分岐イベント1を、モーション2に共通分岐イベント2を設定していたとします。
モーション3の親項目では、モーション1の分岐を有効にしたいが、モーション2の分岐は無効にしたいとします。
そういうときに、モーション3の共通分岐禁止イベント番号に2を設定します。
イベント番号0でアイドリングに戻す
親項目のプロパティ(分岐元のプロパティ)ダイアログには、「イベント番号0でアイドリングに戻す」という設定項目があります。
これは、ループモーションをアイドリングに戻す際などに有効です。
例えば、「歩く」などのループモーションを、ボタンを押している間だけ再生したい場合、
歩くモーションに、「イベント番号0でアイドリングに戻す」を設定しておきます。
キーを離しイベント番号が0になると、アイドリングに戻るようになるので、便利です。
補間モーションを挟まずに分岐する
分岐先のプロパティダイアログには、「補間モーションを挟まずに分岐する」という設定項目があります。
イベントが生じたときに、ただちにポーズを変えたいときなどに使用します。
ファイルの保存
MAの設定が終わったら、fileメニューの「モーションアクセラレータ(moa)書き出し」メニューで、
moaという拡張子のファイルを保存します。
この際、MAで設定したモーションファイル(qua)も全て、保存されます。
mao保存時には、保存フォルダを指定するようになっています。
指定したフォルダの中に、moaと全てのquaが保存されます。
moa読み込み時には、moaと同じフォルダに、参照しているquaが全て存在する必要があります。
3、ファイルフォーマット (version 2.0)
以下に、moaファイルの一例を、貼り付けます。
//////////////////// 次の行からから、moaのはじまり ////////////////////////////
Motion Accelerator File ver2.0 type01
#TRUNK {
"アイドル正面", "アイドル正面.qua", "Idling0", 0, 0, 0
"アイドル左", "アイドル左.qua", "Normal0", 0, 0, 0
(中略)
"へぼ踊り右", "へぼ踊り右.qua", "Normal0", 0, 0, 0
"長い踊り", "長い踊り.qua", "Normal0", 0, 0, 0
}
#BRANCH "アイドル正面" {
"アイドル右", 1, -1, 0, 0
"アイドル左", 2, -1, 0, 0
"へぼ踊り正面", 4, -1, 0, 0
"小躍り正面", 8, -1, 0, 0
"大踊り正面", 16, -1, 0, 0
"koke2", 32, -1, 0, 0
"zukkoke", 64, -1, 0, 0
}
#BRANCH "アイドル左" {
"アイドル右", 1, -1, 0, 0
"へぼ踊り左", 2, -1, 0, 0
"小躍り左", 4, -1, 0, 0
"大踊り左", 8, -1, 0, 0
}
#BRANCH "アイドル右" {
"アイドル左", 1, -1, 0, 0
"へぼ踊り右", 2, -1, 0, 0
"小躍り右", 4, -1, 0, 0
"大踊り右", 8, -1, 0, 0
}
#BRANCH "小躍り正面" {
"小躍り終", 1, 10, 0, 0
"へぼ踊り左", 2, -1, 0, 0
"小躍り左", 4, -1, 0, 0
"大踊り右", 8, -1, 0, 0
}
(中略)
#BRANCH "長い踊り" {
"へぼ踊り右", 1, -1, 0, 0
"小躍り正面", 2, -1, 0, 0
}
}
///////////////////////////// moaファイルの終わり ///////////////////////////
上の例は、Easy3D For HSP3 のMediaフォルダの中のmyというフォルダの中に入っている my.moa の一部です。
RokDeBone2で、ビジュアルで編集し、出力することを想定していますが、
テキストフォーマットなので、手で、編集することも可能です。
moaファイルは、大きく分けて、3つのパートから成ります。
1、ヘッダー
2、TRUNKチャンク
3、BRANCHチャンク
の3つです。
一行目の
Motion Accelerator File ver1.0 type01
は、ヘッダーです。
これは、一字一句間違わずに、半角で、記述し、最後に、エンターキー(\r\n)を記述する必要があります。
TRUNKチャンクは、
#TRUNK {
}
で囲まれた部分です。
「 { 」、「 } 」の直後には、改行(\r\n)が無ければなりません。
TRUNKチャンクは、RokDeBone2でのMA設定の親項目を記述する部分です。
内容は、
"モーション名1", "モーション名1.qua", "Idling0", ev0idle, commonid, forbidcommonid
"モーション名2", "モーション名2.qua", "Normal0", ev0idle, commonid, forbidcommonid
というような形式になります。
モーション名、quaファイル名、モーションの種類 の3つを、半角の「 , 」で区切った形式です。
最後のモーションの種類には、
アイドリングモーションのときは、"Idling0"、それ以外のモーションのときは、"Normal0"と記述します。
アイドリングモーションは、1つだけ指定することを想定しています。
ev0idleの項目には、「イベント番号0でアイドリングに戻す」を設定しているときに1、それ以外は0が記述されます。
commonid, forbidcommonidには、それぞれ、共通分岐イベント番号、共通分岐禁止イベント番号が記述されます。
BRANCHチャンクは、
#BRANCH "小躍り正面" {
}
で囲まれた部分です。
BRANCHチャンクは、親項目の数分、存在します。
(分岐の無い親項目については、記述されません)
まず、#BRANCHの直後に書いてある名前が、親項目のモーション名です。
記述してある親項目の分岐情報が、{ } の中に記述されます。
内容は、
"分岐先モーション名", イベント番号, 分岐元フレーム番号, 分岐先フレーム番号, 補間無しフラグ
のようになります。
分岐元フレーム番号は、「いつでも分岐する」を指定した場合は、-1が記述されます。
補間無しの項目には、「補間モーションを挟まないで分岐する」を設定したときに1が、それ以外は0が記述されます。
(紫色の部分が、ver2.0で加わった部分です。)
4、Easy3Dでの使用方法
Easy3DでのMAの使用方法は、簡単です。
まずは、サンプルの、e3dhsp3_MotionAccelerator.hsp をご覧ください。
1から7キーを押すことで、モーションが変化します。
連打したり、すばやく押したりすると、モーションが変化したりします(moaの設定どおり)
このサンプルでは、分岐先モーションに、ループモーションが混ざっているため、
キーが効かなくなったように感じる部分があるかもしれませんが、
moaの設定どおりになっていますので、ご確認ください。
さて、スクリプトの書き方ですが、
まず、E3DSigLoadで、sigファイルを読み込みます。
次に、E3DLoadMOAFile で、moaファイルを読み込みます。
この際、3番目の引数に、補間モーションのフレーム数を指定します。
30FPSのゲームの場合は、5フレームくらいがちょうどいいかもしれません。
補間モーションのフレーム数が、再生するモーションのフレーム長より長いと、
望んだ効果は得られませんので、ご注意ください。
ここまで出来たら、後は、
必要に応じて、イベント番号をセットし、
E3DSetNewPoseByMOA
を呼び出せばOKです。
E3DSetNewPoseByMOAは、毎フレーム呼び出す必要があります。
モーションの変更をしたくない場合は、イベント番号に0をセットしてください。