以前、同乗者のアニメーションというネタで社畜ちゃんを助手席に座らせて動かすというのをやりました。この時WOBBLY_BITを使いましたが、まだメッシュの使い方がよくわかっていなかったため、上半身パーツを切り分けて振り子のように動かしていました。これだとやはり人らしくないですね。
最近、メッシュを使ったアニメーションが少しわかってきたので、もっと滑らかなアニメーションを作ってみよう、という覚書です。
今回も社畜ちゃんに頑張ってもらうことにしました。
まず車の助手席にのった状態の社畜ちゃんを作ります。
前回は車のモデルに直接社畜ちゃんのモデルも載せて、一つの車として扱いました。
が、それだと常に車自体に社畜ちゃんが含まれてしまうので、今回は車と独立させます。
配置するところまでは、前回と同じです。
で、最初はこのボーンに前後と左右のアニメーションをそれぞれ作ってext_config.iniに設定していたのですが、前後左右の動きが組み合わさるとアニメーションが飛んでしまいます・・・。これは悲しい。
前後左右(上下も)の動きはやはりWOBBLY_BITがベストです。
しかも、WIKIにこんな記載が!
If you want your mesh to flex, it should be skinned. Bind one end to some bone, and then move that bone with WOBBLY_BIT_N section.
つまり、アーマチュア&ボーンを配置して、それにキャラをウェイトペイントし、ボーン自体をWOBBLY_BITで動かせば、メッシュがちぎれず伸び縮みしてアニメーションしてくれるのではないか?!、、、です。
さっそく上記のボーンを組んだ社畜ちゃんを載せて設定してみましたが、ボーン一つ一つが独立して制御されるようです。(一番末端のボーンを動かすとほかのボーンが追従するということはない。)
となると、上半身すべてのボーンにWOBBLY_BITを設定することになりますが、そんなの現実的でないので、乗った状態の社畜ちゃんの姿勢を保ったまま、いったんボーンを削除します。
社畜ちゃんのオブジェクトを選択し、モディファイアープロパティからAmatureの下矢印をクリックして「適用」を選択します。これでボーンが外れます。
つづいて、ウェイトペイントを削除します。
オブジェクトデータプロパティを選択し、頂点グループをすべて削除します。
削除出来たら、社畜ちゃんオブジェクトをAmatureの外に移動させます。
最後、要らなくなったAmatureやその他オブジェクト(車含む)をすべて削除します。
すっきり、社畜ちゃんのモデルだけになりました。
ここにボーンを追加していきます。
最初のボーンを追加した後、アーマチュアのオブジェクトプロパティから、回転でX=0,Y=0,Z=180を設定します。
このZを0のままにすると、あとでWOBBLY_BITを設定したとき、前後(Z方向)のGがかかると体の動く方向が逆になったためです。(なんでだろうか・・・は不明)
とりあえずおまじないのように設定しておきましょう。
1つ目のボーンを選択して編集モードにします。そしてボーンを回転・追加させていきます。(編集モードでやること~!)
結果だけ乗せるとこういうボーン配置。3つが直列につながってます。
そして各ボーンと社畜ちゃんオブジェクトのウェイトペイントはこう塗りました。
以前の覚書でも書きましたが、メッシュでは必ずすべての頂点がどれかのボーンに紐づいている必要があります。ですので、動かさない下半身はhipボーンに紐づけます。
(hipボーン)
上半身はupボーンに紐づけます。
(upボーン)
バスト部分は追加でアニメーションさせるので、bustボーンで紐づけします。
(bustボーン)
これで社畜ちゃん完成です。
fbxでエクスポートします。設定するパラメータはこちら。
アーマチュアを含めるのを忘れないようにしましょう。あと前方は「(プラス)Zが前方」です。
今回はアニメーションを作らないので、アニメーションをベイクのチェックは外します。
作ったfbxはesEditorで読み込み、各マテリアルの設定を行った後、kn5でエクスポートします。
上に書いた通り、すべての頂点がどれかのボーンに紐づいていれば、このように壊れずに表示されます。
作成したkn5ファイルをcar modのextensionフォルダにコピーします。
最後に作成した社畜ちゃんのkn5ファイルの追加とWOBBLY_BITの設定を行います。
ext_config.iniに追記した内容はこちら。
[MODEL_REPLACEMENT_...]
ACTIVE = 1 ; set to 0 to disable the whole section (default value is 1)
FILE = mx5.kn5
INSERT = shachikuchan2.kn5
INSERT_IN = COCKPIT_HR
SCALE = 1, 1, 1 ; change size: X, Y and Z axis (for car, X is left-right, Y and up-down)
ROTATION = 0, 0, 0 ; rotate: heading, pitch and roll, in degress
OFFSET= 0,0,0
MULTIPLE = 1
MERGE = 1[MODEL_REPLACEMENT_...]
ACTIVE = 1 ; set to 0 to disable the whole section (default value is 1)
FILE = mx5.kn5
INSERT = shachikuchan2.kn5
INSERT_IN = COCKPIT_LR
SCALE = 1, 1, 1 ; change size: X, Y and Z axis (for car, X is left-right, Y and up-down)
ROTATION = 0, 0, 0 ; rotate: heading, pitch and roll, in degress
OFFSET= 0,0,0
MULTIPLE = 1
MERGE = 1[MODEL_REPLACEMENT_...]
ACTIVE = 1 ; set to 0 to disable the whole section (default value is 1)
FILE = mx5_lod_b.kn5
INSERT = shachikuchan2.kn5
INSERT_IN = COCKPIT_LR
SCALE = 1, 1, 1 ; change size: X, Y and Z axis (for car, X is left-right, Y and up-down)
ROTATION = 0, 0, 0 ; rotate: heading, pitch and roll, in degress
OFFSET= 0,0,0
MULTIPLE = 1
MERGE = 1
[WOBBLY_BIT_0]
NAME = up
CONNECTED_TO =0.343306, 0.505912 , -0.433046
MAX_RANGE = 2.5 ; max range node can move from its original position
DAMPENING_LAG = 0.9 ; think of it as usual AC lag value, trying to zero node’s speed
G_GAIN = 5 ; how much G-forces affect node’s speed
GRAVITY_GAIN = 3 ; how much gravity affects node’s speed
OFFSET_GAIN = 50 ; how strong is returning force
STIFF_AXIS = 0, 0, 0 ; optional higher stiffness axis to reduce movement along it
STIFF_AXIS_STIFFNESS = 1.7 ; now stiff is optional stiffness axis
G_FILTER = 0 ; temporal filter for G-forces
DEFAULT_GRAVITY_INCLUDED_ALREADY = 1[WOBBLY_BIT_1]
NAME = bust
CONNECTED_TO =0.34295, 0.697864 , -0.50235
MAX_RANGE = 5 ; max range node can move from its original position
DAMPENING_LAG = 0.95 ; think of it as usual AC lag value, trying to zero node’s speed
G_GAIN = 30 ; how much G-forces affect node’s speed
GRAVITY_GAIN = 3 ; how much gravity affects node’s speed
OFFSET_GAIN = 50 ; how strong is returning force
STIFF_AXIS = 0, 0, 0 ; optional higher stiffness axis to reduce movement along it
STIFF_AXIS_STIFFNESS = 1.7 ; now stiff is optional stiffness axis
G_FILTER = 0 ; temporal filter for G-forces
DEFAULT_GRAVITY_INCLUDED_ALREADY = 1
最初3つのMODEL_REPLACEMENTは社畜ちゃんのkn5(今回はshachikuchan2.kn5)をモデルに差し込む処理です。
車自体に差し込み用のエンプティ設置すればよかったのですが、手を抜いて既存のエンプティを利用することにしたところ、車から離れると社畜ちゃんが消えてしまう事象が。
一つ目の
FILE = mx5.kn5
INSERT_IN = COCKPIT_HR
は、lodA表示、かつCOCKPIT_HRが有効な距離の時用、
二つ目の
FILE = mx5.kn5
INSERT_IN = COCKPIT_LR
は、lodA表示、かつCOCKPIT_LRに切り割った時用(これがわからず最初ハマった)、
三つ目の
FILE = mx5_lod_b.kn5
INSERT_IN = COCKPIT_LR
はlodB表示用、です。lodC以降は社畜ちゃんが見えない距離なので省略しました。
次にWOBBLY_BITの設定が2つあります。
[WOBBLY_BIT_0]は上半身用、[WOBBLY_BIT_1]はバスト用です。
個々のパラメータは前回も少し触れたのでここでは省略しますが、上半身の方は大きくゆっくり揺れるように、バストの方は早く長く揺れるようにパラメータを変えています。
これで、体が揺れると同時にバストも揺れる、というアニメーションが完成です。
実際に走っているときの様子はこちら。
映像ではわかりにくいのですが、足に乗せた両手は上半身のボーンに連動しないので、前後左右に体が揺れても、手の位置は変わりません。
前は、手が離れたり、体にめり込んだりして違和感がありましたが、今回は問題なくスムーズにアニメーションさせることができました!