Tips:Priorityとblend: nについて
kfファイルのアニメーション用のファイルでは、各Boneに「Priority」という優先度を設定でき、それに加えて「blend: n」というTextkeyを利用することで複雑なアニメーションを実現できます。
Priorityとは
Priorityとは、そのkfファイルがそのBoneの動きにどれくらいの優先度があるかの設定です。
仮にヒトのkfファイルの設定だとして、「Idle.kf」や「FastForward.kf」、「TurnRight.kf」などの各行動のアニメーションは同時に1つしか再生されません。もしもこの各行動のアニメーションしか使われていないなら、Priorityというのは意味を為しません。キャラクターを動かすアニメーションがそれ1つだけなのですから。
しかし、アニメーションにはもう1つ「SpecialIdle」というものがあります。これはPickIdleというFunctionが実行されることにより、その時の条件に合ったものを1つシステムが選択して再生するというものです。解除する時は「Player.Playgroup Idle 1」のようにします。
このSpecialIdleは各行動のkfファイルと同時に再生することができます。その際に、Priority値によって各Boneをどちらが動かすのかを制限し合うというわけです。
SpecialIdleの例として、「CastSelf」(スペルを唱える)なんかは上半身のPriorityが高く、下半身は低いので他のアニメーションを邪魔しません。「Stagger」(ふらつき)はかなり高めなので、これが再生されると他の多くの操作を受け付けなくなります。
SpecialIdleは同時に複数のものを実行することはできず、違うSpecialIdleをPickIdleで再生した場合は、それまで再生されていたものは解除されます。右手を挙げるSpecialIdleを再生していたなら、右手はその場所から次のSpecialIdleのポーズの動きに入りますが、この際に右手がどの位置にあったかは別に次のSpecialIdleのポーズには影響しません。
具体的なPriorityの判定方法
AとB、2つのアニメーションが同時に再生されているとします。「各行動のkfファイル」と「SpecialIdle」、どちらがAでもBでも同じことです。
- 「A > B」…AのBoneの設定だけが適用されます。
- 「A < B」…BのBoneの設定だけが適用されます。
- 「A = B」…AとBのBoneの設定の平均値が適用されます。
1と2は簡単ですね。Priorityが高いほうだけが適用されるということです。
注意すべきなのは3で、同じPriorityだった場合は両方の平均値が使われます。Aが10度の回転、Bが90度の回転だったら50度の回転になりますし、Aが-2の座標、Bが6の座標なら2の座標になります。
blend: nとは
「blend: n」とは、それが設定されたkfファイルが再生される際に、どのくらいゆっくり滑らかに時間をかけてポーズを移行するかを決める設定です。これがない場合、SpecialIdleが切り替えられた際には一瞬でポーズが変化します。
「n」には数字を入れ、滑らかさはその大きさで調整されますが、「nフレームかけて行う」のような厳密さはないようです。「blend: 0」の場合は、その設定は意味がないと考えられますが、なぜかヴァニラのkfファイルではしばしば見受けられます。
Blenderを使ったことのある方は「キーフレームとキーフレームの間に空のフレームをいくつ挟んで動きをどれだけ滑らかにするか」…といったら想像しやすいかもしれません。
ちなみに、この「blend: n」はPriority値判定によってそのkfで変化するBoneにのみ適用されます。当たり前といえば当たり前ですが、Priorityが低くて変化しないBoneは、「blend: n」がどう設定されていても関係ありません。
剣道の突きのモーションを実現するやり方
blend: nは非常に強力で、例えば剣道の突きの竹刀の動き、これは竹刀が反時計回りしながら前に進むというものですが、たった2つの簡素なSpecialIdleだけで再現できます。
1つ目は突きを実行される前の最初の状態の、1フレームだけのSpecialIdle。座標も回転量も0だとしましょう。
2つ目は突きが完全に終わった時の状態の、やはり1フレームだけのSpecialIdle。例えば座標はY軸に+3して、回転量もY軸に-50°(多分)でもすればOKです。
両方共「CYCLE_LOOP」に設定し、そして2つ目のkfファイルのTextkeyに「blend: 20」とでもしておきます。これで1つ目のSpecialIdleを「PickIdle」して再生した後に2つ目のSpecialIdleを「PickIdle」すれば、1秒くらいで(厳密な時間は不明)突きの動作がされると思います。突き終わった後も1フレームが「CYCLE_LOOP」されているのでそのポーズが持続します。
突きの途中のモーションは全く作る必要がありません。それは「blend: n」によってOblivion側が勝手にやってくれるからです。
さらに言えば、例えばこの突きのポーズから防御や上段の構えに移るために動きも、単純に1フレームのSpecialIdleを作って「blend: n」を設定して「PickIdle」するだけで可能です。
各フレーム毎の変化量が一定でちょっと不自然感が出てしまうので、こだわる場合は「CYCLE_CLAMP」で途中のモーションを作ったり、1フレームで「CYCLE_LOOP」のSpecialIdleを複数作って繋げるというのもアリですが、それなりに複雑になります。
おまけ:「Blender+CYCLE_CLAMP」でも確かにできる。でも制約がある
「Blenderで1フレーム目と20フレーム目にそれぞれキーを打って、1つのkfファイルで実現できるじゃないか」と考える方もいらっしゃるかもしれません。
確かにそれでもできます。ただし多少の制約があります。
まず、そのkfファイルは「CYCLE_LOOP」が使えません。だって、もしそうしたら20フレーム経過して突き終わったと思ったら21フレーム目には再び1フレームの座標と回転にワープするかのように一瞬で戻って、それからひたすら突きまくってしまいますから。
そういう動きを実現したい場合は別ですが、普通はそうでないと思うので、「CYCLE_CLAMP」しか使えません。
しかし「CYCLE_CLAMP」は結構使い勝手が悪いところがあって、まず「CYCLE_CLAMP」中は「PickIdleによるSpecialIdle切り替え」と「Player.Playgroup Idle 1のようなSpecialIdleの解除」が使えません。不発に終わります。つまり、そのアニメーションが完全に終了して、SpecialIdleが解除されるまで待つ必要があります。本来、SpecialIdleはPickIdleでいつでも切り替えたり止められたりするのが大きな強みなので、これはかなり痛いです。
それに加え、その「CYCLE_CLAMP」のアニメーションを終了した後に、再び同じものをPickIdleで再生すると、なんと最後のフレームの状態(座標・回転・スケール)がスタート地点として、そこからアニメーションされてしまいます。突きだったら、さらに前に前進して反時計回りしてしまうわけです。
あと加えて言うなら、Blenderのキーフレーム間のアニメーション補完機能は、結構思った動きをしてくれないことがあります。
まず各フレームの変化量が「IPOカーブエディター」の「補完モード」で「リニア」にしておかないと緩急のついた動きになる。設定次第で好きに変化量を調整できるわけでもありますが、これがまた上手くいかなかったりします。
例えば、20フレームかけて360度回転したいとします。とりあえず10フレームの時点で180度回転するとして、そこからさらに180度回転させるとする。しかし、180度の回転の時点で回転量は「0」から「1」に到達しており、次の180度の回転は「1」から「0」へ戻る動作、つまり逆回転で戻っていくことになります。
プレイヤーが望んでいることは「0(0度) → 1(180度) → 2(360度)」なのですが、Blender側は「-1から+1」の範囲で動かそうとする、つまり、「0」である0度から、「-1」である-180度と「1」である+180度で扱おうとするのです。
「IPOカーブエディター」で直接「0→2」というように操作するか、開始位置を「0」じゃなくて「-1」とかからにすれば360度の回転は実現できますが、それは面倒だし、しかも「2」という数値はあくまでXYZ軸に平行か垂直である場合であって、斜めになってたりすると「2」じゃなくなって調整が困難を極めます。
そういった場合は、1フレーム1フレーム根気強く独力でキーフレームを設定するか、ちょっとした工夫が必要になります。

その工夫とは、次のフレームで(順回転させたいのに)逆回転してしまうという、正常なフレームの一番最後にキーを打ち、次のフレームで直接「IPOカーブエディター」をいじって反対側の符号へ持っていってキーを打つのです。1フレームなら補完は働かないので、動きは全く問題なく自然に繋がります(仮にもしも1フレーム補完が入ったとしたら、そのフレームでは0までワープ、つまり180度も一気に回転する)。例えば180度から190度にしたとしたら、目に見える変化量は10度ですが、Blenderでは-350度したという処理になるわけです。決して補完を入れてはなりません。
と話がそれましたが、ここで言いたいのはそんないらぬ苦労するより、1フレームだけのSpecialIdleを2個作って、「blend: n」を使ってOblivionに滑らかに切り替えるように指示するほうがよほど楽だということです。