Skeleton motion mapping

From Valve Developer Community
< Ja
Jump to navigation Jump to search
English (en)日本語 (ja)Translate (Translate)

モーションマッパー


基本的な使い方

モーションマッパーは元となる.SMDスケルトンから目標となる.SMDスケルトンに、モーションを再マッピングするためにデザインされたコマンドラインツールです。ターゲットとなるスケルトンのボーン長さや位置は元のものと違っているとします。デフォルト状態で使用すると、モーションマッパーは元のアニメーションの感じをできるだけ保つように努力しながら、手足の先端位置などを位置解決しようとします。(つまり、足は地面に、手は武器を持ったままという状態です)


motionmapper.exe sourceAnimation.smd targetSkeleton.smd mappedMotion.smd

上のようにコマンドラインで実行すると、"sourceAnimation.smd"のアニメーションを"targetSkeleton.smd"の最初のフレームで定義されたスケルトンに再マップを行い、結果を"mappedMotion.smd"ファイルに出力します.

使用する.SMDファイルについての注意:

  • モーションマッパーは元のスケルトンとターゲットのスケルトンを比較してどのようにマッピングを行うかを決めます。.SMDファイルには初期ポーズがないため、モーションマッパーは元ファイルとと目標となる.SMDファイルでのアニメーションの最初のフレームを使います。そのため:
    • 元となるファイルもターゲットとなるファイルも両方最低1フレームのアニメーションを持つ必要があります。
    • ターゲットは1フレーム以上のアニメーションを持つ必要はありません、というのも結局上書きされることになるからです。
  • モーションマッパーは元スケルトンもターゲットスケルトンもどちらもまったく同じ階層構造を持っていて、ボーン長さと位置関係だけが違っていると仮定します。そのため:
    • 元スケルトンもターゲットスケルトンもどちらもボーン数が同じでしかも同じ階層構造の順番を持つ必要があります。
    • 階層構造における位置が同じであれば、ボーン名が元スケルトンとターゲットスケルトンで異なっていても構いません。
    • テンプレートファイルオプションを使用する場合、そこでのボーン名は元の.SMDファイルで使われている名前を常に指します。
  • モーションマッパーはスケルトンがValveの標準の座標軸の枠組みに当てはまり以下の基準を満たして構築されたと仮定します:
    • ルートに関しては、Z軸は上下方向である。
    • ルートのみが平行移動と回転移動両方のアニメーションを持ち、すべての他のボーンは回転移動のみである。
    • ボーンの長さ方向は基本的にX軸方向であり、そうでない場合は、Z軸にそって回転するようにユニバーサルジョイントで繋がっている。



SDKのサンプル

モーションマップの使い方を示すためにサンプルスケルトンがSDKに含まれています。テストを行うには:

  • このコマンドをコマンドラインで実行してください (ブラウザ表示で複数行になっていますが、これら全てをコピーしたコマンドプロンプトに貼り付けることができます。).
"%sourcesdk%\bin\MotionMapper.exe" "%sourcesdk%\..\sourcesdk_content\hl2mp\modelsrc\combine_soldier_xsi\reload_standing.smd" "%sourcesdk%\..\sourcesdk_content\generic\modelsrc\heavy_walk.smd" "%sourcesdk%\..\sourcesdk_content\generic\modelsrc\MOTIONMAPPED_reload_standing.smd"
このコマンドラインは長いので、分割してみます。ここには3つのパラメータがあります。:
  1. "%sourcesdk%\..\sourcesdk_content\hl2mp\modelsrc\combine_soldier_xsi\reload_standing.smd" - これは元となるアニメーションを指しています。これはHL2MPで使われているリロードアニメーションです。マッピングした結果のアニメーションもこれと同じように見えるはずですが、スケルトンは2つ目のパラメータの体格にあわせたものになっているでしょう。
  2. "%sourcesdk%\..\sourcesdk_content\generic\modelsrc\heavy_walk.smd" - これは通常のHL2MPキャラクタと体格が違っているスケルトンを持った1フレームのアニメーションファイルを指しています。
  3. "%sourcesdk%\..\sourcesdk_content\generic\modelsrc\MOTIONMAPPED_reload_standing.smd" - これはモーションマッパーに結果のアニメーションファイル(最初のパラメータのSMDファイルの全てのフレームを2つ目のパラメータのSMDのスケルトンにマッピングしたもの)をどこに保存すべきか指定します。
  • これでアニメーションファイル(MOTIONMAPPED_reload_standing.smd)が作成され、これをHL2MPキャラクタに適用できますが体格は変になっているはずです。以下の行をsourcesdk_content\hl2mp\modelsrc\player\player_anims.qciファイルの最後に追加してみてください:
$makereload TEST_reload_shotgun "..\..\..\generic\modelsrc\motionmapped_reload_standing" ACT_HL2MP_GESTURE_RELOAD_SHOTGUN 1
  • HL2MPのプレイヤーアニメーションを再コンパイルします:
"%sourcesdk%\bin\studiomdl" -game "%sourcesdk%\..\half-life 2 deathmatch\hl2mp" "%sourcesdk%\..\sourcesdk_content\hl2mp\modelsrc\player\player_male_anims.qc"
  • それではSource SDKウィンドウからModel Viewerを実行します(ゲームリストからHalf-Life 2: Deathmatchを選択していることを確かめてください)。男性モデルをどれでもいいので選んでください。(先ほどのステップでは男性モデルアニメーションのみを再コンパイルしました。女性のアニメーションを再コンパイルするなら最後のパラメータをplayer_female_anims.qcに変えてください) 例えばHumans\Group02\male_04を選択します。それからTEST_reload_shotgunシークエンスを選択し、キャラクタの体格の変更を見てください。
  • 注意: 今作ったHalf-Life 2 Deathmatch\hl2mp\models\player\male_anims.mdlを削除しないと、ゲーム内でこの変なモーションマップされたアニメーションが使われて表示されることになるかもしれません。


テンプレートファイルの使用

モーションマッパーが-templateFile引数なしで使用された場合、元スケルトンからターゲットスケルトンまでデフォルトのマッピングを行おうとします。様々なマッピングのパラメータを変更することで様々なモーションエフェクトを起こすこともできます。そうしたパラメータはテキストファイルに保存して、-templateFile引数で指定する必要があります。

汎用テンプレートファイル モーションマッパーにはほとんどの要求を満たせるような汎用テンプレートファイルセットが付属しています:

walk.mmt
歩行/走行サイクルと、両手使いではない武器モーションのための基本テンプレート
twoHandedWeapon.mmt
肩に担いで発射するわけでばない両手持ち武器モーションのための基本テンプレート。左手は右手との相対関係をそのまま保ちつつ、右手は新しいスケルトンにモーションマッピングされます
twoHandedShoulderWeapon.mmt
肩に担いで発射する両手持ち武器モーションの基本テンプレート。左手は右手への相対関係を保ち、右手は肩(Spine2)との相対関係を保ちます。どちらの両手持ち武器の"twoHandedWeapon"テンプレートは、"relativeLock"を使っていることに注意してください。これはマッピングされた関節と"relativeLock"(相対距離固定)の距離がターゲットのスケルトンでも変わっていないことを仮定しています。もしその距離が変更してるのなら、コマンド末尾のscalar引数の値を帰ることで"locked"(ロックされた)ジョイントをスケーリングすることも可能です。
rootLock.mmt
このテンプレートはキャラクタが環境にあるオブジェクトをインタラクションを行うモーションのためのものです。足と手の位置について実際の「マッピング」は行われません。しかし、新しい関節距離は計算されます。手と足の位置は元アニメーションでのROOTからの相対位置を保とうとします。もしボーンの長さがかなり短くなっているとこれは不可能で不自然な結果になるかもしれません。

代替テンプレートファイル

注意してください: テンプレートファイルを使用するとき、モーションマッパーは内部の初期設定を全て放棄し、全体的にテンプレートに依存してマッピングをおこないます。そのため:

  • テンプレートファイルを使うときは、望むマッピング方法をその中で全て指定する必要があります

これを簡単にするために、テンプレートファイルを作成するいくつかの方法が用意されてます。まず1つめはモーションマッパーに同梱されている6,7のテンプレートファイルを使うことです:

  • default.mmt
  • template1.mmt
  • template2.mmt
  • template3.mmt
  • template4.mmt
  • template5.mmt
  • template6.mmt
  • template7.mmt

"default.mmt"ファイルを除き、それぞれのテンプレートには様々なモーションマッピングの方法とその機能に関するコメントが含まれています。 別の方法としては、モーションマッパーの-printTemplate引数を使って出力をパイプをつかってファイルに保存するというのがあります:

motionmapper.exe -printTemplate > myTemplate.txt

これでモーションマッパーのデフォルト設定と同じファイルを出力し、そこから編集を開始できます。このデフォルト設定ファイルはコメントが少なく、多くの説明はありません。以下にデフォルトテンプレート設定とそのバリエーションの説明があります。

テンプレート設定

テンプレートファイルにはアクションと属性が含まれ愛知ます。どちらも同じ行にある引数を読み込むことができます。アクションと属性の主な違いは、アクションは予定に追加され、属性はそうしたアクションのためのパラメータであるということにあります。これは少し混乱させるもので将来より一貫性のある形に変更されるかもしれません。default.mmtファイルに現れる順番でそれらについて説明します。

rootScaleJoint ValveBiped.Bip01_L_Foot
The rootScaleJointコマンドはルートモーションの拡大縮小を行う元となる2つの関節を持つリムを引数で指定します。これには通常足を指定します。というのも足の長さの変更がルートの拡大縮小を行う唯一の理由であることが多いからです。注意: "twoJointIKSolve" (以下参照)で指定されていないリムを使用すると滑ったような足の結果となってしまうでしょう。
rootScaleAmount 1.0
この属性の引数は小数ですが、この属性の唯一の目的はルートのスケーリングをオン・オフすることです。これについてたは"代替マッピング"セクションで扱われるでしょう。
toeFloorZ 2.7777
この属性はZ軸のどこに床があるかを指定します。この属性はルートスケーリングと"oneJointPlaneConstraint" (以下参照)の両方に影響します。
twoJointIKSolve ValveBiped.Bip01_L_Foot
このアクションは実際のところ1つのテンプレートファイルの中で(望ましくは)異なる関節に対して何回も呼び出されて予定にいれることができます。このコマンドの目的と様々な属性は元スケルトンの関節間と親の親の位置の相対関係を、ターゲットで再現しようとするためにあります。様々な属性はその関係を変更する特定の方法を指定します。default.mmtテンプレートでは4つのtwoJointIKSolveが予定にはいっています:
  • ValveBiped.Bip01_L_Foot
  • ValveBiped.Bip01_R_Foot
  • ValveBiped.Bip01_L_Hand
  • ValveBiped.Bip01_R_Hand
reverseSolve 0.0
この属性はIKソルバー(逆運動学による位置解決)に関節が曲がる方向を指示します。テンプレートファイルをみると、肘は膝と逆方向に曲がっていることがわかるでしょう。
extremityScale 1.0
この属性は位置解決した先端のモーションを新しいリム長さに適用するか、元のアニメーションと同じ比率を保つかを決定します。注意: この属性を足に適用するときはrootScaleAmountと密接に関係しているので、両者を同じ値にする必要があります。
limbRootOffsetScale 1.0 1.0 0.0
この属性はどの軸にそってどのくらいリムのルートや関節を動かして親の親の位置解決による変更を模倣するかを指定します。このことを言い換えます、もし腰がより広く変更されたとしたら、足も同じだけ広げてほしいとおもいますか?同じことは肩にもいえます。肩幅が広くなったら手もより広くひろげたいですか?3軸の引数を取る理由は以下です:もし新しいスケルトンの腰の位置が下がっていたとしても、足も同じだけ下げて床より押し下げたいとはおもいません。この反対も腕についていえるかもしれません。もし肩幅が広く、背中が短く、アニメーションは武器を持つものだったら、手を空間内で垂直に移動させ頭より上にならないようにして、武器を持つために両手の位置は広げたいとはおもわないでしょう。
relativeLock ValveBiped.Bip01_R_Hand 1.0
この属性は武器を持つといった場合に手をもう片方の手との絶対位置関係を保ちます。この属性は通常片方の手のみに設定し、ロック先の手はロックされた手より先に位置解決が行われる必要があります。この属性の最後の値は拡大縮小をあらわし、ロックされている手の位置を、ロック先の手の空間を元にスケーリングし、これで相対位置を(小さい、大きい武器にあわせて)伸ばしたり縮めたりできます。
oneJointPlaneConstraint ValveBiped.Bip01_L_Toe0
これは単純な1つの関節の平面コンストレイントで、上の"toeFloorZ"属性で定義された"床平面"を指定したボーンが貫通しないように親関節を調節します。これはtwoJointIKSolveがつま先"Toe0"を押し出したとしても、つま先を地面より上に保つためにあります。注意: この位置解決は足"foot"ノードが地面より上にあるときのみうまくいきます。合理的なマッピングを実行するときは常にそういう状態にあるべきです。

テンプレートの特殊コマンド

テンプレート内で使用できるスケルトン変更に関連した特殊コマンドがいくつかあります。これらはもともとテスト用でしたが、スケルトン変更のために使用することができます。{| class=standard-table | jointScale ValveBiped.Bip01_L_Foot 1.5 |- | ターゲットのスケルトンの左足ボーンを1.5倍に拡大します |- | skeletonScale 1.5 |- | ターゲットのスケルトンの全てのボーンを1.5倍に拡大します。 |}