📃
【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