📃

【UE5】コントロールリグで疑似的にIKコリジョンを実現する方法

に公開

コントロールリグではSphereTraceというノードを使って特定の範囲にヒットするアクタ (コリジョン) 情報を取得することができます。ただこのノードでは自分自身のコリジョンを検知することができず、他に使えそうなノードは見当たらなかったため、自前でノードを組んで疑似的にコリジョンを実現してみました。


腰にめり込んでしまった腕をめり込まない位置に補正

1.IKコントローラーをhandジョイントの位置に設定

コリジョンの範囲に入らない間は再生するアニメーション通りに動いてほしいので、
まずは作成したIKコントローラーを手のジョイント位置に設定します。

2.コリジョンの中心から手までの距離を計算

コリジョンへの接触判定を腰ジョイントからの距離で行うため、後の計算に備え、ここでは腰から手までの距離を変数に記録します。

  • BPから受け取ったコリジョンの親(Pelvis)のTransform(SocketTransform変数)はワールド空間の値なので「FromWorld」ノードでリグ空間に変換
  • hand_lジョイントとの距離を「DistanceBetween」ノードで取得
  • HandDistance変数に設定

3.手が指定の距離より近づかないように補正

腕のIKがメッシュにめり込む距離に入ってきたら、入った分を外に押し返してちょうどいい位置に再配置します。

  • branchノードで腰とIKの距離がめり込む距離(25)に入っているかどうかを判定
  • 入っている場合は、腰→手の方向を正規化で求め、入り込んでいる分だけ外側に押し出します
  • 正規化のノードが見当たらなかったため、自前でノードを組んでいます

4.IKの設定

最後にIKの設定をすれば完了です。

Discussion