3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Physics Control Componentについて

Posted at

最初に

この記事は Unreal Engine (UE) Advent Calendar 2025 の記事です
今回はPhysicsControlComponentの機能と使い方について解説したいと思います。

記載内容に誤りがある場合はご指摘頂けますと幸いです。

環境

Windows 11
UE 5.7.1

Physics Control Componentとは

このComponentを使用することでオブジェクトに対する
物理シミュレーションの切替やブレンド、重力、コリジョンの干渉などの設定が
一括で簡単に行うことが出来るようになります。

その他、制御対象を左足だけ、右手だけ、など特定の部位をまとめてプリセット化し設定を反映、利用することも可能です。

PhysicsControlComponentは少し前まではExperimental でしたが、
この記事を書いている時点(UE5.7.1)ではBetaとなり今後の正式運用が期待されます。

Body Modifier

PhysicsControlComponentで使用できる機能は、大きく2つあります。

1つ目のBodyModifierは、PhysicsAssetで定義される物理ボディごとに重力の反映や移動タイプなどの変更を行うことが出来る機能です
image (42).png

セットアップ

BodyModifierは、PhysicsControlComponentに対してCreateBodyから始まる関数を利用して生成が可能です。
生成した後は、登録されたBodyModifierの名前や、Setと呼ばれるBodyModifierをまとめた名前を経由して各種処理を呼び出すことができます。

image (43).png

名前 説明
Component BodyModifierの対象となるPrimitiveComponentです
Bone Name BodyModifierの名前になります、
対象がSkeletalMeshの場合はBone名を指定します
※指定がない場合はデフォルトで`"Body"`として設定されます
Set Name 複数のBodyをまとめて変更したい場合などに利用する、
このBodyModifierを入れるカテゴリ名のようなものです。
BodyModifierの設定を変更する場合は

①生成したBodyModifierの名前を直接指定する方法
②BodyModifierの所属するセットの名前を指定する方法
の2つが存在し、SetNameは②の複数のBodyModifierを
まとめてセットにしたい時の名前になります。

例) 左上腕のBodyModifierだから”LeftArm”で左腕でSetにする
※デフォルトで全てのBodyModifierは”All”に含められます
Body Modifier Data Bodyの挙動を定義するための設定をまとめた構造体です。
生成時に渡していますが、各パラメーターは下にそれぞれ記載

①Movement Type

物理ボディの動作方法を指定するために使用されるタイプです。
設定できるタイプは以下

名前 説明
Static Staticにするとオブジェクトがシミュレーションされず、
BodyModifierで設定されたKinematic Targetにも従いません。
(ただし、他の方法で移動されることはあります)
Kinematic Kinematicにすると、オブジェクトがシミュレーションされず、
BodyModifierで設定されたKinematic Targetの設定に従って 移動、回転されるようになります
Simulated この設定を行うと、オブジェクトが物理演算によって制御されるようになります。
Default 特に変更されることはなく、PhysicsAssetの設定がそのまま利用されます。

image (44).png

例 ) 足だけKinematic、それ以外をSimulated
qt_01.gif
足はアニメーションの座標と回転に追従し、他の部位はシミュレーションで
他のオブジェクトの干渉を受けながら動作しているのがわかります

②Collision Type

衝突タイプの指定が可能です。タイプで指定はできますが、PhysicsControlComponentでは衝突するかどうかの指定のみで利用されます。
image (45).png

③Kinematic Target

Body Modifierを利用して、指定のBodyを移動、回転させることが可能です。
この機能を利用する場合は Body Modifier Data Movement TypeがKinematicである必要があります。
※Targetの値は後述するKinematic Target Space によって座標空間が変わるので注意が必要

image (46).png

例)足のボディを利用してオフセットをかけてみた
qt_02.gif
※見た目を整えるため、画像の環境ではControlなどの機能も設定しています

④Kinematic Target Space

Kinematic Targetで指定する値の座標空間を指定します、
設定できるTarget Spaceの種類と説明は以下

名前 説明
World Targetはワールド空間
Component スケルトン/ボーンが使用されている場合、
Targetはそのコンポーネントの空間内に存在します。
※使用されていない場合、Targetは所有している
Componentの空間内に存在
(例:PhysicsControl、ControlRigなど)
OffsetInBoneSpace スケルトン/ボーンが使用されている場合、
Targetはボディを制御するボーン基準に相対的に指定され、
オフセットはそのボディ空間で適用されます。
※使用されていない場合、World設定と同じです。
OffsetInWorldSpace スケルトン/ボーンが使用されている場合、
Targetはボディを制御するボーン基準に相対的に指定され、
オフセットはワールド空間で適用されます。
※使用されていない場合、World設定と同じです。
OffsetInComponentSpace スケルトン/ボーンが使用されている場合、
Targetはボディを制御するボーン基準に相対的に指定され、
オフセットはコンポーネント空間で適用されます。
※使用されていない場合、これはComponent設定と同じ
IgnoreTarget 指定されたターゲットデータは無視し、
Bodyは単にボーン/オブジェクトを追跡します

image (47).png

⑤Gravity Multiplier

MovementTypeがSimulationの場合に使用する重力の強さです
(基本1以上の値にすることはなく、0~1で設定します)

image (49).png

⑥Physics Blend Weight

Simulation状態からAnimationが反映される状態に戻す際
Simulationと元のAnimationのどちらをどれだけ使用するかのブレンドの重みが設定可能です。
※RigidBodyWithControlでは使用されません

image (48).png

例 ) Weightを0から1に変化させた挙動
qt_03.gif
※見た目を整えるため、添付画像の環境ではControl機能も設定しています

最初はSimulationのWeightが高く回転するオブジェクトに体が衝突していますが、
後半になるにつれアニメーションが優先されオブジェクトとも衝突しなくなっているのが分かります

⑦Update Kinematic From Simulation

trueの場合、関連するアクターのTransformは、Kinematic設定の時にSimulationから更新されます。
これは、非同期物理を使用する際に、スケルトンの異なる部分が引き裂かれるのを防ぐために使用することが可能です。
※RigidBodyWithControlでは使用されません

image (50).png

Control

2つ目となるControl機能は、1つの物理ボディを別の物理ボディ(またはワールド)に対して制御する方法を設定するために使用されます。

言い換えると、単体のオブジェクトをSimulation状況下で操作したり、接続するPrimitiveのConstraintに関する制御をすることが出来ます。

また、使用する上で重要な事柄としてControlの制御はSimulate設定のみ有効です。

セットアップ

BodyModifierと同じように、PhysicsControlComponentでCreateControlから始まる関数を利用して生成します
image (51).png

上記関数の場合のパラメーターの内容は以下

名前 説明
Parent Component Child Componentを接続したい親ボディとなるPrimitiveComponent
※未設定でも可
Parent Bone Name Parent ComponentがSkeletalMeshの場合は
取得したいBodyInstanceが紐づくBoneNameを指定します。
※未設定でも可
Child Component 動作を反映する対象となるPrimitiveComponent
Child Bone Name Child ComponentがSkeletalMeshの場合は
取得したいBodyInstanceが紐づくBoneNameを指定します。
※未設定でも可
Control Data 後述
Control Target 後述
Set BodyModifierと同様に、複数のControlをまとめて運用する場合に設定します。
指定がない場合も、デフォルトで生成された全てのControlは”All”セットに設定されます。
Name Prefix 生成するControlの名前にPrefixを指定したい場合に使用します。

各種BoneNameが設定されている場合、以下の様に設定されます。
”Name Prefix”
+ ”Parent Bone Name”
+ “Child Bone Name”
+ “同名存在の場合はナンバリングが追加”

※Name及びPrefixも指定がない場合は”None”で生成されます
※生成できるナンバリングには上限があるので注意が必要です

Control Data

Controlで制御する移動や回転の強さなどを設定する場合に使用されます。

名前 説明
Enabled この設定が有効かどうか
Linear Strength 直線運動を行うために用いられる力(0で無効)
Linear Damping Ratio 線形強度に関連する減衰量
値を 1 に設定するとオーバーシュートは発生せず、
制御量が目標値に可能な限り迅速に到達するようになります。
値を 1 より大きく設定すると減衰効果が強化され、
1 より小さい値を設定すると、運動はより速くなりますが
目標値に到達するまでの「揺れ」が大きくなります。
Linear Extra Damping 追加の線形減衰量。
この値は Linear Damping Ratio から算出される減衰量に加算されます。
Linear Strength が0の場合でも減衰効果を得たい場合に有用です。
Max Force 直線運動を駆動するために使用される最大力(0は制限なし)
Angular Strength 角度運動を駆動するために用いられる力(0で無効)
Angular Damping Ratio 角速度強度に関連する減衰量。
値を 1 に設定すると、オーバーシュートは発生せず、
制御量が目標値に可能な限り迅速に到達するようになります。
値を1より大きくすると減衰効果が強まり、
1より小さい値では制御は速く行われますが、より「不安定な」動きになります。
Angular Extra Damping 追加の角減衰量。
Angular Damping Ratio から算出される減衰量に加算され、
Angular Strength が0の場合でも減衰効果を得たい場合に有効です。
Max Torque 角度運動を駆動するために使用される最大トルク(0は制限なし)
Linear Target Velocity Multiplier 線形速度に乗算される係数で、減衰効果に適用されます。
値が 1 の場合、アニメーションの目標速度が使用され、
これによりアニメーションの動きを正確に追従できます。
値が 0 の場合、減衰は「ワールド空間」で動作し、減衰は移動に対する抵抗として機能します。
Angular Target Velocity Multiplier 角速度に乗算される減衰係数。
値が 1 の場合、アニメーションの目標速度が使用され、
アニメーションの動きを正確に追従できます。
値が 0 の場合、減衰は「ワールド空間」で適用されるため、動きに対する抵抗として機能します。
Custom Control Point カスタム制御点を使用する場合の制御点の位置
Use Custom Control Point Custom Control Pointを使用するかどうか。
falseの場合はChildComponent のBodyInstanceから取得される重心が使用されます
Use Skeletal Animation もしtrueであれば、ControlTargetはアニメーションが
存在する場合計算結果の上に適用されます
Disable Collision 親ボディと子ボディ間の衝突を無効化するかどうか
(親ボディが存在する場合にのみ有効)
Only Control Child Object trueの場合、制御は子オブジェクトのみに影響し、親オブジェクトには影響しません

例 ) 強度設定の違う2つのControlによる制御
qt_04.gif
qt_05.gif

Control Target

ControlDataの設定を利用して、ボディを移動、回転させる目標値を設定したい時に使用します。

HTMLの要素
名前 説明
Target Position 目標位置
Target Velocity 目標速度
Target Orientation 目標の向き
Target Angular Velocity 目標角速度
Apply Control Point To Target ControlPointをターゲット変換のオフセットとして使用するかどうかを指定します。

この値がtrueの場合、ターゲットの変換行列は
実際のオブジェクトに対する変換として扱われますが、
制御はデフォルトで質量中心に位置するControlPointを介して行われます。

falseの場合、ControlPoint自体に対するターゲット変換として扱われます。

World Space と Parent Space

Control TargetはParentComponentがいるかどうかでコントロールターゲットの座標空間が変わり、ターゲットに対する移動、回転挙動が違うものになります。

  • World Space
    • Parent Componentを使用しない場合
    • Targetはワールド空間上の値として扱われる
    • SkeletalMeshを使用している場合、各Controlはアニメーションの座標を目的値とし、それぞれ単独で遷移する
  • Parent Space
    • Parent Componentを使用する場合
    • TargetはParentComponentからの相対的な値として扱われる
    • SkeletalMeshを使用している場合、各Controlは筋肉のような緩やかな追従となるが、結果として転倒することもある

Body ModifierとControlの連携の具体例

例えば、Fall Guysのような
「歩きアニメーションを再生して移動するが、上半身は他のキャラに当たった時物理挙動をしたい」
といった時

  1. 物理挙動したい場所をBodyModifierでSimulated、アニメの挙動をしたい場所はKinematicに変更
  2. 1でBodyModifierを生成したBodyにControlを生成

といった設定で似たようなものが作れます
qt_06.gif

解説すると、1の対応だけだとBodyModifier - MovementTypeで
載せていた画像の様に、上半身がまともに立つことが出来ません。

そこでControlを同じ場所に生成することで、
Simulated中でも各部位はアニメのポーズに追従され、衝突しても緩やかに元の位置に戻ろうと画像のような挙動になります。

ContentSampleAnimation_PhysicsControlレベルでは、
このような参考になるサンプルが多数展示されていますので
BodyModifierとControlの具体的な使い方が気になる方はおすすめです。

最後に

ControlRigでも物理表現する機能はありますが、PhysicsControlComponentによる物理表現はゲームスレッド側で簡単に制御できるのが印象的でした。
今回はボリューム的にカットしましたが、PhysicsControlActorや
具体的な使用例もその内アップすることが出来たらいいなと思っております。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?