KawaiiPhysics

KawaiiPhysics : Simple fake Physics for UnrealEngine4

677
126
C++

Kawaii Physics

English doc :

ディスカッション:

不具合報告

採用実績

DevCommunity :

はじめに

Kawaii Physicsは UnrealEngine4,5用に作成した疑似物理プラグインです。
髪、スカート、胸などの揺れものを「かんたんに」「かわいく」揺らすことができます。


お借りしたキャラクタ:Gray ちゃん http://rarihoma.xvs.jp/products/graychan


https://www.youtube.com/watch?v=UvpEIBGegvs
お借りしたキャラクタ:ミライ小町 https://www.bandainamcostudios.com/works/miraikomachi/

特徴


  • 元の形状を尊重しつつ、アニメーションやSkeletalMeshComponentの移動・回転を元に物理制御を行います。
  • プラグインに含まれる「KawaiiPhysicsノード」をAnimationBPのAnimGraphで使う形です。
  • 指定したボーンとそれ以下のボーンをキャラクタの動きに合わせて揺らせます。
  • 物理制御用のパラメータは2種類だけなので、エンジン標準のAnimDynamicsに比べて簡単にセットアップできます。
  • 球・カプセル・平面コリジョンを追加することができます
  • アニメーションエディタのビューポート上で各コリジョンの位置・向き・大きさを調整できます
  • 骨の長さを維持するため、仮に計算が破綻しても骨が伸び縮みすることがありません。
  • PhysXは使わずにシンプルなアルゴリズムを使用しているため、エンジン標準の物理システムに比べて負荷が低い(はず)です。

物理挙動を実装するにあたって参考にした資料
次期アイドルマスター グラフィクス&アニメーション プログラミング プレビュー

動作環境

UE4.26以前でビルドする際は、GetSkeleton()をSkeletonに修正する必要があります。

UE4.21以前でビルドする場合は、KawaiiPhysicsEditMode.cpp における
GEngine->ConstraintLimitMaterialPrismatic->GetRenderProxy () を
GEngine->ConstraintLimitMaterialPrismatic->GetRenderProxy (false) に修正する必要があります。

UE4.23以前でビルドする場合は、awaiiPhysics.uplugin における
“Type”: “UncookedOnly”, を “Type”: “DeveloperTool”, に修正する必要があります(たぶん)。

使い方

BPプロジェクトをC++プロジェクトに変換するには

「C++ クラス ウィザード」からCコードを追加することで Cプロジェクトに変換可能です。
https://docs.unrealengine.com/5.0/ja/using-the-cplusplus-class-wizard-in-unreal-engine/

ただし、Visual StudioなどのC++をビルドできる環境を準備する必要があります。
https://docs.unrealengine.com/5.0/ja/setting-up-visual-studio-development-environment-for-cplusplus-projects-in-unreal-engine/

サンプル

内部実装について

その1 http://pafuhana1213.hatenablog.com/entry/2019/07/26/171046

ライセンス

MIT

作者

おかず@pafuhana1213

ハッシュタグ

#KawaiiPhysics

履歴

  • 2024/2/8 v1.14.0
    • 骨間の距離拘束を行う BoneConstraint機能 を実験的に追加しました
      • image
      • 指定した骨間(BoneConstraints/Bone1, 2)の距離を維持しようとします(XPBDを使用)。なお、指定する骨はKawaiiPhysicsの制御対象である必要があります。
      • Bone Constrain Iteration Count Before(After) Collision で拘束処理の実行回数を指定できます(結果を収束させるため)。
      • DataAssetでも設定可能にしました。試験的にDataAssetに正規表現で拘束対象の骨セットを設定できるようにしています。
        image
    • KawaiiPhysicsのAnimNodeが持つDataAssetをピンに公開できるようにしました
    • Planar Limitの処理に無駄があったので修正 https://github.com/pafuhana1213/KawaiiPhysics/pull/108
    • BoneConstraint対応に伴い、物理処理部分のコードをリファクタリング
  • 2023/9/15 v1.13.0
    • 物理の空回し(Warm Up)機能・サンプルを追加しました
      • https://www.youtube.com/watch?v=stIOjZQh3Qw
      • image
      • Need Warm Up が true かつ Warm Up Frame( 空回しするフレーム数 ) が 1以上だと Warm Up 処理が行われます
      • 実行後は Need Warm Upは false になります
      • Warm up Frameが大きいほど安定しますが、物理計算の回数がその分増えるので負荷が上がります
      • image
        v1.12.0から対応したAnimNode関数からWarm Upを有効にすることも可能です
  • 2023/9/8 v1.12.0
    • UE5.3に対応
      • といっても、特に何もしていないです
    • AnimNode関数から各パラメータの変更・取得を可能に
      • image
      • サンプルを追加(AnimBP_GrayChanKawaiiPhysicsAnimNodeFunction)
    • AnimNode関数への対応に伴い、UE4.27のサポートを終了
  • 2023/8/30 v1.11.1
  • 2023/5/28 v1.11.0
    • UE5.2に対応
      • といっても、特に何もしていないです
    • KawaiiPhysicsとSequencerを併用するサンプルを追加
      • SkeletalMeshComponentのAnimClassをAnimBlueprintに設定することと、AnimGraphにSlotノードがあるかを要チェック
    • コンパイルしなくてもプロパティの変更を挙動に反映できるように
      • CopyNodeDataToPreviewNodeの対応が抜けていたので追加
    • UE5.1にてコライダー(~Limits系)のプレビューが上手く動作しない不具合(2つ目以降がコンパイルしないと出てこない)を修正 https://github.com/pafuhana1213/KawaiiPhysics/issues/84
    • コライダー(~Limits系)の回転を編集したときにクラッシュする事がある不具合を修正 https://github.com/pafuhana1213/KawaiiPhysics/issues/86
    • DataAssetからのLimitsをDeleteで消した際のクラッシュを修正 https://github.com/pafuhana1213/KawaiiPhysics/issues/72
    • コライダー(~Limits系)のDrivingBoneに指定しているボーンがLODによって除去された際にクラッシュする不具合を修正 https://github.com/pafuhana1213/KawaiiPhysics/issues/87
    • Control Rig, AnimationLayer と併用した際のクラッシュを(たぶん)修正 https://github.com/pafuhana1213/KawaiiPhysics/issues/56
    • サンプルのモデルにLOD1・2を追加しました(動作チェック用)
  • 2022/12/03 v1.10.0
    • UE5.1に対応
    • LODでボーン除去している場合に発生するクラッシュの修正
    • 一部コードをRider様によってリファクタリング
  • 2022/4/11 v1.9.0
  • 2022/4/11 v1.8.0
    • UE5正式版に対応
    • UE4.26以下のサポートを一旦切りました。
  • 2020/12/2 v1.7.0
  • 2020/11/17 v.1.6.2
    • FKawaiiPhysicsEditMode::DrawHUDが正常に動作していない不具合を修正
  • 2020/9/4 v1.6.1
    • プロパティのカテゴリ指定忘れによるパッケージ作成エラーの修正
  • 2020/8/29 v1.6.0
    • 専用のDataAsset(KawaiiPhysicsLimitsDataAsset)でコリジョン設定を管理・流用できるようになりました
    • UE4.25.3をデフォルトにしました
  • 2020/7/28 v1.5.3
    • MeshとSkeletonのBoneIndexが違う場合に、正しい長さが取得できなくて、カーブでのパラメータが正常に動作しなくなる不具合修正
  • 2020/5/29 v1.5.2
    • v1.5.1 における対応がDummyBoneを考慮してなかった不具合の修正
  • 2020/5/29 v1.5.1
  • 2020/5/29 v1.5.0
  • 2020/5/15 v1.4.6
  • 2020/5/15 v1.4.5
    • GravityをComponentSpaceで動作するように変更
      (dxd39 様、ありがとうございました!)
  • 2020/3/13 v1.4.4
    • MacOSでビルドに失敗する不具合の修正
      (melMass 様、ありがとうございました!)
  • 2020/3/13 v1.4.3
    • Package作成に失敗する不具合を修正
  • 2020/2/16 v1.4.2
    • Standalone実行時に正常に動作しない不具合を修正
  • 2020/1/31 v1.4.1
    • SphereLimitのLimitTypeがInnerの場合、Outer設定時に異なりBoneのRadius設定を考慮してなかった不具合の修正
      1.3.1以前の挙動に戻したい方は CVarEnableOldPhysicsMethodSphereLimit を 1 に設定してください
  • 2020/1/31 v1.4.0
    • 重力変数の位置更新の計算がgt^2でなくgtになっていたので修正
      1.3.1以前の重力計算を使用したい場合は p.KawaiiPhysics.EnableOldPhysicsMethodGravity を 1 に設定してください
  • 2020/1/31 v1.3.1
    • TeleportRotationThresholdの計算にてラジアンと度が混在していたことでWorldRotationのテレポート対応がほぼ機能してなかった不具合を修正
      (monguri 様、ありがとうございました!)
  • 2020/1/31 v1.3.0
    • UE4.24.2 に対応
      (TheHoodieGuy02 様、ありがとうございました!)
  • 2019/10/29 v1.2.1
    • World Damping系を従来処理に差し戻し。30fps時の挙動が更に安定しました
      (@seiko_dev 様、ありがとうございました!)
  • 2019/10/26 v1.2.0
    • 簡易可変フレームレート対応。フレームレート低下時の挙動が少し安定するようになったはず
      (@seiko_dev 様、ありがとうございました!)
    • 基準フレームレートを設定できるようにしました(デフォルト:60)(正直テスト不足です。何かあったらissueへ
    • カーブの調整用に各ボーンの始点からの長さの割合をデバッグ表示するようにしました
  • 2019/10/19 v1.1.2
    • BoneのScaleが(1,1,1)以外の環境に対応できてなかったので修正
      (shop-0761様、ありがとうございました!)
  • 2019/9/11 v1.1.1
    • Bone.LengthFromRoot の計算が間違っていたのを修正
      (KazumasaOhashi様、ありがとうございました!)
  • 2019/8/26 v1.1
    • WindDirectionalSourceに対応しました(注意:従来のWind設定に対して破壊的変更が入ります)
  • 2019/7/20 v1.0.1
    • CollisionのOffsetLocationがボーンのRotationを考慮していない不具合の修正
      (v1.0 におけるOffsetLocationの挙動が大きく変化します)
  • 2019/7/2 v1.0 公開 v1.0