前回はSkyrimとHavok Behaviorのやりとりについて、ざっくり流しました。
今回はbehavior graphを使って、実際にどういう状態遷移が行われてるかを見てみます。
あくまで僕の解釈によるものなので、間違いあるかもしれません。
調べるにあたり、Skyrim Behavior ToolとShikyo Kira様のDiscordを参考にさせて頂きました。
感謝です<(_ _)>
前回はこちら
skmod.hatenablog.com
Skyrimにおけるアニメーション再生ブロック(想像)図
前回も載せた、大体こんな感じだろう的ブロック想像図('_')
まあイメージ掴む用ということで。
通常移動時におけるbehaviorの状態遷移例
ではそろそろ実際のbehavior graphを見ていくとします。
locomotion(非戦闘状態の通常移動)動作のうち、基本となる8方向移動を例に。
behaviorファイル"mt_behavior.hkx"からの抜粋です。
Havok Behaviorがすることは、Skyrimが決めた方向と速度に合わせて、キャラクタが適切に動いてるように見えるアニメーションを作ることです。なのでたけし城のカール君(古すぎて意味不明だったらスルーしてください!)みたいに実際の移動速度と足の動きが合ってないと、アイススケート現象になります。戦闘系は顕著なので、AMRと対応アニメーションで実移動量の調整をしないとアイススケートになるです。
なので細かい所(各nodeの詳細設定情報等)は省きます。次々回かそこらでxmlの中身まで見ます。
図に色々注釈入ってますが、参考程度に。読み飛ばしても本文には問題無いです。
※拡大しても読みづらい時は、ダウンロードしてみてください。たしかはてなブログの拡大サイズ限界が・・・あった気がします。
左から右へと進む、すごろく盤みたいなイメージで見てください。プレイヤキャラもNPCも、状況によってあちこちのマス目(node)に乗ってる感じで。すごろくのサイコロは基本Skyrimが振りますが、盤上に「3マス進め」とか「振り出しに戻る」とか書いてあったら、Skyrimがサイコロ振らなくても指示に従って移動します(今回は無いかも)。
0.待機状態
上の図には無い状態です(遥か遠いので・・・)
キャラクタが、
- 3人称視点
- スニークしてない
- 納刀中
- 動いてない
こんな時は、お馴染みの"mt_idle"による待機状態。
1.Locomotion Default
Skyrimがサイコロを振ります。
実際はキャラクタの移動を開始させ、それに伴うanimation eventをHavok Behaviorへ通知。スプリントせずにに移動を始めると、図の中の1番"Locomotion Default"のマス目にたどり着く筈です。
Havok Behaviorは、Skyrimからanimation variableとして、
- Direction(移動方向)
- SpeedSampled(速度)
を受け取ります。
2.MT_BSCyclicBlendTransitionGenerator
移動時やターンのアニメーションの括りのroot的なマス目。
3.MT_Direction_Blend
"Direction"を元に、キャラの向く方向を決めます。移動方向に合わせて8通りに分岐してるので、適したマス目に進みます。
実際はブレンド作業があるのですが、ちょっと煩雑なのでここでは飛ばします。興味があれば次の章にて(読み飛ばしても次回に影響無いです)。
4.MT_[Forward,Backward][Left,Right]]Blend
node名は前後左右を組み合わせた8方向(例えばMT_BackwardRightBlend)。
向きは無事決まったので、次は”SpeedSampled”を元に、移動速度の分岐へ。
繰り返しになりますが、移動速度を決めるのはSkyrimです。速度に合ったアニメーションを作るのが目的です。4or5分岐の進路があるので、速度に合ったマス目に進みます。
ここもブレンドはちょっと厄介なので後述(間違ってるかもですけど( ; ゚Д゚))。
5.MT_[Walk,Run][Direction][Speed]
あとは一本道、いよいよゴールです。
node名は8方向と速度の合体。(例えばMT_RunBackwardRightFast)。
このゴールのマス目から、目的のアニメーションファイルが呼び出されます。MT_RunBackwardRightFastであれば、MT_RunBackwardRight.hkxが再生されます。
ちなみに方向に関しては8方向分のアニメーションファイルがありますが、速度別ではWalkとRunの2種類だけです。
Clip Generatorが再生速度を変更して、歩き3段走り2段を作ってくれます。
こんな感じで左から右に状態遷移しながら、最終的なアニメーションにたどり着きました!
behaviorファイルのマス目(nodeの繋がり)は非常に広大で、これはこれで見えないオープンワールドRPG状態( ; ゚Д゚)
方向と速度のブレンド
通常のアニメーションのブレンド、例えばクロスボウ構えてジャンプすると、”mt_jump.hkx”の右掌から先だけに”Crossbow_IdleHeld.hkx”をブレンドします。ニコイチです。結果としてクロスボウを右手で握りしめた状態のジャンプになります。
こうした時は合体の割合を0-1の間で設定するんですが、このモードだとweightのレンジは1を超えても全然OKそうです。
方向のブレンド
方向のブレンド(3番のやつ)でのweight設定は、前(正面)が0、右前が0.125で、時計回りに0.125づつ加算され、後ろが0.5、最後の左前が0.875になります。
このweightと、Skyrimから受け取ったanimation variable "Direction"を比較してそうです(Directionの生の値を確認してないので、behaviorファイルからの推測)。結果、以下のようになります(もち推測('_'))。
8方向キッカリであれば、黒線のように8つの固定値になると思われます。例えばDirection=0.1なら前、0.3なら右といった感じ。実際はゲームパッドのスティックも使えるので、例えば薄緑の関数(恐らく近傍黒丸2点からのブレンド)等になりそうな気がします。
Parametric Blendでのブレンド方法は4通りあるようで、実際はどんな関数になってるかは判りませぬ・・・(behaviorファイルからは見つからず、多分Havok Behaviorエンジンの領分ぽい)。
速度のブレンド
速度も同様で、animation variable "SpeedSampled"とweightを比較してそうです。
これもきっかり5段階(前進成分以外は4段階)であれば、黒線の固定値になりそうですが、実際は何かしら緑や青みたいな関数になってるかもしれません。SpeedSampledに対して近傍2点からのブレンドなら、緑みたいな区分された関数になってそうな気がしますが、使うであろう上限設定がちょっと見つからず(なので違うのやも)。
どんな関数かはこれもまさに、
(Havok)神のみぞ知る!( ゚Д゚)
(うまいこと言ったと自分で思ってる('_'))
・・・まあ置いときまして、weightがべらぼーにでかいです。これ見て最初に「なんじゃこりゃー?」思って、色々調べ始めたとです。
ここまで読んだ上で、よかったら注釈みつつ最初のbehavior graphを眺めてみてください。もうちょっと流れの整理ができるかもです!
お約束のbehaviorの型とか、アイドルアニメーションの遷移説明も用意してるんですが、ちょっと文字数が多くなったので一旦切ることにします。
次回はidleアニメーション。
構造が今回よりシンプルなので、もちっと詳細まで見ます。
本来は2回で終わる予定だったんですが_| ̄|○・・・orz
続きはこちら
skmod.hatenablog.com