SplineIKでキャタピラを回したのでログ
環境
UE5.6
Windows11
モデルの準備
とてもざっくりキャタピラを用意。ボーンの根本(回転するところ)が追従するメッシュの中心に来るように
今回はリーフボーンを使わないので余分なBoneを追加しておく
使わないとチェーンを適用した際にこんなかんじで重複が発生し変になる(一敗)
ControlRigを作る
前準備
ControlRigを作成し、余分の骨の分を除いた回転する部分のBoneにギスモを追加する
SplineIKに追加して、ボーンがリグを追いかけるようにしておく。
SplineはColsedにする
(SplineIKについて詳しい記事はこちら)
ギスモを動かす
変数を追加する
名前 | 効果 |
---|---|
TargetTransfromList | 目指すべき目標のリスト |
Each Controller Now Target List ID | 今どのギスモがどの地点(0-9)を目指しているか |
NextFutureTargetTransfrom | これから進みたい目標地点の一個先の目標地点 |
NextTargetTransfrom | これから進みたい目標地点 |
OldTargetTransform | 今いる目標地点 |
MoreOldTargetTransform | 今いる場所の一個前の目標地点 |
Cycle0-1 | 補間の進み具合 |
Speed | 回るスピード |
TargetTransfromList 以外のTransformの配列4つ(目標地点シリーズ)には初期値でいいので配列を10エレメント
Each Controller Now Target List IDは10エレメント作成したうえで0-9を割り振ってください
目標地点の取得
Construction Eventでこのコントロールリグが始まった瞬間の各ギスモのTransformを保存(配列の中身はギスモ一覧)
Get New Targetの中身
ギスモ1が①から②を移動するとき、①と目標地点の②、円弧の補間のために⓪と③が必要になります。
仮にギスモ2が②から③を移動するとき、②と目標地点の③、円弧の補間のために①と④が必要になります
これを開始時と移動し終わったときに自動で取得する関数です
全体図
関数が呼ばれたらまずギスモの配列をForLoopし、Loopが終わった際にReturnが呼ばれるようにしておきます。
またForLoopのIndex(要はどのギスモの話をしているか)もローカル変数に保存しておきます
パーツ2
Each Controller Now Target List IDから現在の位置(①とかどの番号を使っているか)を取得しローカル変数を作成して保存ます。次の目標地点の番号を取得するため、9でなければ+1、9であれば0をローカル変数を作成してSetしておきます。
次のパーツは9の判定のCompletedからつなげてください
パーツ3
さっき作成したローカル変数を足したり引いたりしながら、目標地点類をゲットし、配列にセットします。
Forwards Solve側の実装
タイマーの作成
CycleにSpeedで掛け算したDeltaTimeを足して、1を超えたら先ほどのGet New Targetを呼び出しCycleを0に戻すだけの関数です
補間しながらギスモを動かす
最初はInterpolateで動かしていたのですが、脈動するキャタピラができてしまったので止めました(一敗)
ChatGPTにかかせたいい感じに補完させる式に突っ込んでいきます
何を言っているのかよくわからないので文字に起こします
↓もらった式
A = P1 × 2
B = (P2 − P0) × t
C = (P0 × 2 − P1 × 5 + P2 × 4 − P3) × t × t
D = (−P0 + P1 × 3 − P2 × 3 + P3) × t × t × t
Result = (A + B + C + D) × 0.5
↓こういうこと
A = OldTargetTransform × 2
B = (NextTargetTransfrom − MoreOldTargetTransform) × Cycle
C = (MoreOldTargetTransform × 2 − OldTargetTransform × 5 + NextTargetTransfrom × 4 − NextFutureTargetTransfrom) × Cycle × Cycle
D = (マイナスMoreOldTargetTransform + OldTargetTransform × 3 − NextTargetTransfrom × 3 + NextFutureTargetTransfrom) × Cycle × Cycle × Cycle
Result = (A + B + C + D) × 0.5
これをするとなんかいい感じに位置が計算されるので、これをForEachしたギスモにSetTransfromします
するとヌルヌル動くキャタピラを観測することができます
完成!