メインコンテンツまでスキップ

外部力プリセット

バージョン情報

v1.16.0で追加

External Forceプリセットシステムは、様々な外力をモジュール化して適用できる機能です。基底構造体を継承した複数のプリセットが用意されており、C++で独自のプリセットを追加することも可能です。

概要

External Forceプリセットシステム

プリセットの種類と適用フロー

アーキテクチャ

FKawaiiPhysics_ExternalForce (基底)
├─ FKawaiiPhysics_ExternalForce_Basic (汎用方向力)
├─ FKawaiiPhysics_ExternalForce_Curve (時間変化カーブ力)
├─ FKawaiiPhysics_ExternalForce_Gravity (重力)
└─ FKawaiiPhysics_ExternalForce_Wind (風)

ソースを見る

基底クラス: FKawaiiPhysics_ExternalForce

全ての外力プリセットの基底となる構造体です。

共通パラメータ

パラメータデフォルト説明
bIsEnabledbooltrue外力の有効/無効
bDrawDebugboolfalseデバッグ描画の有効/無効
ApplyBoneFilterTArray<FBoneReference>外力を適用するボーンを指定(空の場合は全て)
IgnoreBoneFilterTArray<FBoneReference>外力を適用しないボーンを指定
ExternalForceSpaceEExternalForceSpaceWorldSpaceシミュレーション空間
RandomForceScaleRangeFFloatInterval(1.0, 1.0)力のスケールのランダム化範囲

シミュレーション空間 (EExternalForceSpace)

説明
ComponentSpaceコンポーネント空間でシミュレート。メッシュ移動は速度に影響しない
WorldSpaceワールド空間でシミュレート。メッシュ移動で速度が変化
BoneSpace別のボーン空間でシミュレート

ボーンフィルタの使用例

// 特定のボーンのみに外力を適用
ApplyBoneFilter.Add(FBoneReference("hair_01"));
ApplyBoneFilter.Add(FBoneReference("hair_02"));

// 特定のボーンを除外
IgnoreBoneFilter.Add(FBoneReference("hair_root"));

Basic: 基本的な方向力

一定方向の力を継続的または間隔を空けて適用します。

パラメータ

パラメータデフォルト説明
ForceDirFVector(0, 0, 0)力の方向
ForceRateByBoneLengthRateFRuntimeFloatCurve-ボーンの長さの比率による力の補正カーブ
Intervalfloat0.0力を適用する間隔(秒)。0の場合は毎フレーム適用

使用例

// 右方向への一定の力
FKawaiiPhysics_ExternalForce_Basic BasicForce;
BasicForce.ForceDir = FVector(100, 0, 0);
BasicForce.Interval = 0.0f; // 毎フレーム適用

Curve: カーブベースの力

時間経過に応じてカーブで変化する外力です。アニメーションやタイムラインベースの効果に最適です。

パラメータ

パラメータデフォルト説明
ForceCurveFRuntimeVectorCurve-時間に応じた外力カーブ(X:時間, Y:力)
CurveEvaluateTypeEExternalForceCurveEvaluateTypeSingleカーブ評価方式
SubstepCountint10経過時間の分割数(Single以外で有効)
TimeScalefloat1.0時間のスケール係数
ForceRateByBoneLengthRateFRuntimeFloatCurve-ボーンの長さの比率による力の補正カーブ

カーブ評価方式 (EExternalForceCurveEvaluateType)

説明
Single単一ポイントで評価
Average複数ポイントの平均値
Max複数ポイントの最大値
Min複数ポイントの最小値

使用例

// 振動する力
FKawaiiPhysics_ExternalForce_Curve CurveForce;
CurveForce.TimeScale = 2.0f; // 2倍速で再生
CurveForce.CurveEvaluateType = EExternalForceCurveEvaluateType::Average;

Gravity: 重力

重力をシミュレートします。Characterの設定と連携可能です。

注記

重力は常にWorldSpace固定です。空間選択はできません。

パラメータ

パラメータデフォルト説明
ForceRateByBoneLengthRateFRuntimeFloatCurve-ボーンの長さの比率による力の補正カーブ
bUseCharacterGravityDirectionboolfalseCharacter側のCustomGravityDirectionを使用(UE5.4以降)
bUseCharacterGravityScaleboolfalseCharacter側のGravityScaleを使用
bUseOverrideGravityDirectionboolfalse重力方向をオーバーライドするかどうか
OverrideGravityDirectionFVector(0, 0, 0)重力方向のオーバーライド値

Characterとの連携

UE5.4以降では、Characterの重力設定と自動連携できます。

// Characterの重力設定を使用
FKawaiiPhysics_ExternalForce_Gravity GravityForce;
GravityForce.bUseCharacterGravityDirection = true;
GravityForce.bUseCharacterGravityScale = true;

重力方向のオーバーライド

// 横向きの重力(宇宙ステーションなど)
FKawaiiPhysics_ExternalForce_Gravity GravityForce;
GravityForce.bUseOverrideGravityDirection = true;
GravityForce.OverrideGravityDirection = FVector(1, 0, 0);

Wind: 風

WindDirectionalSourceからの風を利用します。ClothやSpeedTreeとの連携を想定しています。

注記

風は常にWorldSpace固定です。空間選択はできません。

パラメータ

パラメータデフォルト説明
ForceRateByBoneLengthRateFRuntimeFloatCurve-ボーンの長さの比率による力の補正カーブ
WindDirectionNoiseAnglefloat0.0WindDirectionalSourceによる風方向のノイズ(角度、度数)

WindDirectionalSourceの設定

  1. レベルにWindDirectionalSourceを配置
  2. 風の強さと方向を設定
  3. KawaiiPhysicsノードでWindプリセットを追加
FKawaiiPhysics_ExternalForce_Wind WindForce;
WindForce.WindDirectionNoiseAngle = 15.0f; // 15度のランダム変動

カスタム外力 (CustomExternalForces)

実験的機能

この機能は実験的です。AnimNodeをクリックするか、Animation Blueprintをコンパイルしないと正常に動作しない場合があります。

BlueprintまたはC++で独自の外力ロジックを実装できます。

基底クラス: UKawaiiPhysics_CustomExternalForce

UCLASS(Abstract, Blueprintable, EditInlineNew, CollapseCategories)
class UKawaiiPhysics_CustomExternalForce : public UObject

パラメータ

パラメータデフォルト説明
bIsEnabledbooltrueこのカスタム外力が有効かどうか
bDrawDebugboolfalseデバッグ描画を行うかどうか

オーバーライド可能な関数

関数説明
PreApply外力適用前の処理(全ボーンに対して1回呼ばれる)
Apply各ボーンに外力を適用(ボーンごとに呼ばれる)

C++での実装例

UCLASS()
class UMyCustomForce : public UKawaiiPhysics_CustomExternalForce
{
GENERATED_BODY()

public:
virtual void Apply_Implementation(FAnimNode_KawaiiPhysics& Node,
int32 ModifyBoneIndex, const USkeletalMeshComponent* SkelComp,
const FTransform& BoneTransform) override
{
// カスタムロジック
}
};

Blueprintでの実装

  1. UKawaiiPhysics_CustomExternalForce を継承したBlueprintクラスを作成
  2. PreApplyApply イベントをオーバーライド
  3. KawaiiPhysicsノードの CustomExternalForces に追加

共通機能

ForceRateByBoneLengthRate

全てのプリセットで使用できる、ルートからの距離に応じた力の補正カーブです。

  • X軸: ボーンチェーン内での位置(0.0 = ルート、1.0 = 末端)
  • Y軸: 力のスケール係数
// 末端に行くほど力を強くする例
ForceRateByBoneLengthRate.GetRichCurve()->AddKey(0.0f, 0.5f);
ForceRateByBoneLengthRate.GetRichCurve()->AddKey(1.0f, 1.5f);

デバッグ描画

bDrawDebug = true にすると、力のベクトルがビューポートに表示されます。


Blueprint API

外力はBlueprintから動的に制御できます。

外力の追加

UFUNCTION(BlueprintCallable, Category = "Kawaii Physics")
static bool AddExternalForce(const FKawaiiPhysicsReference& KawaiiPhysics,
FInstancedStruct& ExternalForce, UObject* Owner, bool bIsOneShot = false);

コンポーネントへの外力追加

UFUNCTION(BlueprintCallable, Category = "Kawaii Physics")
static bool AddExternalForcesToComponent(USkeletalMeshComponent* MeshComp,
TArray<FInstancedStruct>& ExternalForces, UObject* Owner,
FGameplayTagContainer& FilterTags,
bool bFilterExactMatch = false,
bool bIsOneShot = false);

詳しくは UKawaiiPhysicsLibrary を参照してください。


関連ページ