モーションアクセラレータについて


1、モーションアクセラレータとは


概要
モーションアクセラレータ(以下では「MOA」と略します)とは、簡単に言うと、モーションの自動遷移機能のことです。
( アクセラレータという名前ですが、これはMS Visual Studioのキーイベントをリソース化する機能の名前を真似たもので、
モーションが、速くなるというわけではありません。 )

MOAを使う利点は、大きく3つあります。
@、モーション遷移(変更)の設定を、RokDeBone2で、ビジュアルで行える。
A、イベント番号(変更のトリガーとなるもの)を指定して関数を呼ぶだけで、モーションの遷移(変更)が行える。[Easy3D]
  (モーションの途中から、途中への遷移も可能です。)
B、モーションの遷移(変更)時に、モーションとモーションの間の補間が自動的に行われる。[Easy3D]



イベント番号について
Aでイベント番号という言葉を使いましたが、これについて少し説明します。
ゲーム中でモーションを切り替えるタイミングというのは、
プレイヤーがキーボードを押したり、自分の打った弾が敵に当たったときなどいろいろあると思います。
これらのモーション変更のトリガー(きっかけ)となるものをイベントと呼ぶことにします。
イベント番号とは複数のイベントをそれぞれ区別するために使う番号のことです。
イベント番号は、複数のイベントを組み合わせて指定できるように、2の乗数の値を使います。
現バージョンではイベント番号は2の乗数に縛られず、自由に設定して大丈夫です。

具体的な手順は、
@あらかじめ走るモーションはイベント1、転ぶモーションはイベント2、ジャンプはイベント4、、、のように、
 RokDeBone2でそれぞれのモーションにイベント番号を設定します。
A*.moaというファイルで保存します。
BEasy3Dでmoaファイルを読み込みます。
CEasy3Dの関数にイベント番号を渡すことで、自動的に補間モーションを挟んでモーションの遷移が行われます。
というようになります。




2、RokDeBone2での設定方法

MOAの設定は、ツールバーの「モ」ボタンを押して行います。

RokDeBone2で設定した内容は、*.moaという拡張子のファイルに保存します。
RokDeBone2のFileから、読み込み、書き出しが出来ます(下図)







上の図はRokDeBone2で*.moaファイルを読み込み、ツールバーの「モ」ボタンを押したときの画面です。
ツリービューの形式でモーションの変更設定が表示されます。
親子階層は2段までです。(親と子供の2段。子供の子供は無し)

「モ」ボタンを押すと現在読み込んでいるモーションが親項目としてツリービューに羅列されます。
初期状態では子供はありません。

親項目は読み込んだモーションを表し、
子供項目は親項目から分岐する(イベントトリガーで変化する)モーションを表します。

例えば、上図では「アイドル左」というモーション再生中に
4種類のイベント番号をトリガーとして、「アイドル右」、「へぼ踊り左」、「小躍り左」、「大踊り左」の4種類のモーションに
変化するための設定がされていることになります。




MOAの設定はツリービューの項目をマウスで右クリックすることで行います。
上の図は親項目を右クリックしたときのメニューです。
「分岐を追加」と「プロパティ」の2種類の操作をすることが出来ます。

MAの設定で一番最初にするべきことは、
親項目のモーションに名前をつけることです。
名前をつける際には全てに異なる名前をつけることが必要です。
(同じ名前があると、moa保存時にエラーが出ます。)




上図は、親項目を右クリックし、「プロパティ」を選択したときの図です。
モーション名のエディットボックスに、重複しない名前を記述して、OKボタンを押してください。


2番目にするべきことは、アイドリングモーションを1つだけ選ぶことです。
アイドリングモーションとは、イベントが無いとき(イベント番号に0を指定したとき)や、
再生中のモーションが終了したときに、再生されるモーションのことです。

親項目を右クリックし、「プロパティ」を選択し、「アイドリングモーションにする」にチェックを入れてください。
1個も、アイドリングモーションが設定されていない場合や、
2個以上設定されている場合は、moa書き出し時に、エラーになります。




モーション名の設定と、アイドリングモーションの指定が終わったら、
いよいよモーションの分岐の設定をします。

上の図は、親項目を右クリックし「分岐の追加」を選択したときの画面です。
まず「分岐先モーション名」のコンボボックスの矢印をクリックし、
親モーションからどのモーションに分岐するかを指定します。

まず、「イベント番号設定」のところに0より大きい整数を入力して
どのイベント番号でモーションの分岐が起こるかを指定します。


「分岐元フレーム番号」は、「いつでも分岐する」と「指定フレームより前で分岐する」の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 3.0

以下に、moaファイルの一例を、貼り付けます。

//////////////////// 次の行からから、moaのはじまり ////////////////////////////
Motion Accelerator File ver6.0 type01

#TRUNK {
"アイドル正面", "アイドル正面.qua", "Idling0", 0, 0, 0, 0
"アイドル左", "アイドル左.qua", "Normal0", 0, 0, 0, 0
(中略)
"へぼ踊り右", "へぼ踊り右.qua", "Normal0", 0, 0, 0, 0
"長い踊り", "長い踊り.qua", "Normal0", 0, 0, 0, 0
}

#BRANCH "アイドル正面" {
"アイドル右", 1, -1, 0, 0, 0
"アイドル左", 2, -1, 0, 0, 0
"へぼ踊り正面", 4, -1, 0, 0, 0
"小躍り正面", 8, -1, 0, 0, 0
"大踊り正面", 16, -1, 0, 0, 0
"koke2", 32, -1, 0, 0, 0
"zukkoke", 64, -1, 0, 0, 0
}

#BRANCH "アイドル左" {
"アイドル右", 1, -1, 0, 0, 0
"へぼ踊り左", 2, -1, 0, 0, 0
"小躍り左", 4, -1, 0, 0, 0
"大踊り左", 8, -1, 0, 0, 0
}

#BRANCH "アイドル右" {
"アイドル左", 1, -1, 0, 0, 0
"へぼ踊り右", 2, -1, 0, 0, 0
"小躍り右", 4, -1, 0, 0, 0
"大踊り右", 8, -1, 0, 0, 0
}

#BRANCH "小躍り正面" {
"小躍り終", 1, 10, 0, 0, 0
"へぼ踊り左", 2, -1, 0, 0, 0
"小躍り左", 4, -1, 0, 0, 0
"大踊り右", 8, -1, 0, 0, 0
}

(中略)

#BRANCH "長い踊り" {
"へぼ踊り右", 1, -1, 0, 0, 0
"小躍り正面", 2, -1, 0, 0, 0
}

}

///////////////////////////// moaファイルの終わり ///////////////////////////

moaファイルはRokDeBone2で、ビジュアルで編集し、出力することを想定していますが、
テキストフォーマットなので、手で編集することも可能です。

moaファイルは大きく分けて3つのパートから成ります。
1、ヘッダー
2、TRUNKチャンク
3、BRANCHチャンク
の3つです。

一行目の
Motion Accelerator File ver6.0 type01
は、ヘッダーです。
これは一字一句間違わずに半角で記述し、最後にエンターキー(\r\n)を記述する必要があります。

TRUNKチャンクは、
#TRUNK {
}
で囲まれた部分です。
「 { 」、「 } 」の直後には、改行(\r\n)が無ければなりません。
TRUNKチャンクは、RokDeBone2でのMA設定の親項目を記述する部分です。
内容は、
"モーション名1", "モーション名1.qua", "Idling0", ev0idle, commonid, forbidnum, fotbid1, fotbid2, forbid3, notfu
"モーション名2", "モーション名2.qua", "Normal0", ev0idle, commonid, forbidnum, forbid1, notfu
というような形式になります。
モーション名、quaファイル名、モーションの種類 の3つを、半角の「 , 」で区切った形式です。
最後のモーションの種類には、
アイドリングモーションのときは、"Idling0"、それ以外のモーションのときは、"Normal0"と記述します。
アイドリングモーションは、1つだけ指定することを想定しています。

ev0idleの項目には「イベント番号0でアイドリングに戻す」を設定しているときに1、それ以外は0が記述されます。
commonid,共通分岐イベント番号が記述されます
forbidnumには共通分岐禁止イベント番号の個数が記述され、それぞれの共通分岐イベント番号がforbid1, forbid2...のように個数分記述されます。
notfuには補間を挟まずにこのモーションに変更するかどうかを指定します。0のときは補間を挟み1のときは補間を挟みません。
TRUNKのnotfuは共通イベント用です。(BRANCHにもnotfuがあります。)

BRANCHチャンクは、
#BRANCH "小躍り正面" {
}
で囲まれた部分です。
BRANCHチャンクは親項目の数分存在します。
(分岐の無い親項目については記述されません)

まず、#BRANCHの直後に書いてある名前が親項目のモーション名です。
記述してある親項目の分岐情報が、{ } の中に記述されます。

内容は、
"分岐先モーション名", イベント番号, 分岐元フレーム番号, 分岐先フレーム番号, 補間無しフラグ, アイドリングに戻さないフラグ
のようになります。
分岐元フレーム番号は、「いつでも分岐する」を指定した場合は、-1が記述されます。
補間無しの項目には、「補間モーションを挟まないで分岐する」を設定したときに1が、それ以外は0が記述されます。

(紫色の部分が、ver4.0で変更した部分です。)
(水色の部分がver6.0で変更した部分です。)

4、Easy3Dでの使用方法

Easy3DでのMAの使用方法は、簡単です。
まずは、サンプルのe3dhsp3_MotionAccelerator.hsp をご覧ください。
1から7キーを押すことで、モーションが変化します。
連打したりすばやく押したりすると、モーションが変化したりします(moaの設定どおり)
このサンプルでは、分岐先モーションにループモーションが混ざっているため、
キーが効かなくなったように感じる部分があるかもしれませんが、
moaの設定どおりになっていますのでご確認ください。

さて、スクリプトの書き方ですが、
まず、E3DSigLoadでsigファイルを読み込みます。

次に、E3DLoadMOAFile でmoaファイルを読み込みます。
この際、3番目の引数に補間モーションのフレーム数を指定します。
30FPSのゲームの場合は5フレームくらいがちょうどいいかもしれません。
補間モーションのフレーム数が再生するモーションのフレーム長より長いと、
望んだ効果は得られませんのでご注意ください


ここまで出来たら後は、
必要に応じてイベント番号をセットし、
E3DSetNewPoseByMOA
を呼び出せばOKです。

E3DSetNewPoseByMOAは、毎フレーム呼び出す必要があります。
モーションの変更をしたくない場合はイベント番号に0をセットしてください。

トップページに戻る