Hagoromo の使い方 - nozoxa/Hagoromo GitHub Wiki



 HagoromoAnim Node として実装しています。

 ここでは主にノードの設定と物理の調整方法について説明します。







物理シミュレーション実行に必ず必要なデータ :


 以下の 2 つが Hagoromo における物理シミュレーションで必須となります。


   ( 1 ) スケルトン

     └ シミュレーション対象にするチェーンには、ボーンが 2 つ以上含まれている必要があります。


   ( 2 ) スキンウェイトが設定されたスケルタルメッシュ







基本設定 :


 ▼ Hagoromo ノードを配置する


   ( 1 ) Anim BP を開きます



   ( 2 ) Anim Graph Node Editor にて適当な位置で右クリックします



   ( 3 ) 検索ボックスに hagoromo と入力します


     ss_02



   ( 4 ) 検索結果として出力される Hagoromo を選択します


     ss_00



   ( 5 ) エディタ上に Hagoromo ノードが配置されていることを確認します


    ※当該 Wiki ではこれを単に ノード と呼称していることがあります。

     ss_00






 ▼ 物理シミュレーションを適用したいチェーンを設定する


   ( 1 ) Hagoromo ノードを選択します



   ( 2 ) Detailsパネル >> Hagoromo Chain Settings の + ボタンを押下します


     ss_01



   ( 3 ) RootBone にシミュレーション対象にしたいチェーンの根元のボーンを指定します


     



       ルートボーンは複数指定することもできます。

       例えば複数のチェーンで構成される髪やクロスをシミュレーションしたい場合に利用します。



   ( 4 ) コンパイルします


     





 基本設定は以上です。

 この時点でスケルタルメッシュやアクターを動かすことで、

 動きは微妙かもしれませんが、物理シミュレーションが行われることは確認できるかと思われます。



※以下は髪をシミュレーション対象にした例です。パラメータの調整も行っています。    mov_00



 また、現状の設定ではシミュレーション対象にしたボーンがキャラクターなどと重なり、

 髪やクロスが貫通して見えるかと思います。

 物理の調整方法や貫通を防止する方法については以降の項目で解説します。







当たり判定の設定 :


 ▼ ボディコライダを設定して揺れ物の貫通を防止する


   ( 1 ) 物理アセットを作成します   




     



      Hagoromo でボディコライダの設定は Unreal Engine物理アセット で行います。

      注意点として現時点では スフィア、カプセル の 2 種類のみサポートしています。

      物理アセットの作り方が分からない場合は 物理アセットの作成方法 を参考にしていただけますと幸いです。



   ( 2 ) Hagoromo ノード > Hagoromo Body Collider Settings に物理アセットをセットします 




     





   ( 3 ) コンパイルします





   ( 4 ) Hagoromo Debug Visualizer を開きます


     





   ( 5 ) ShowBodyCollider ボタンを押下します


     





   ( 6 ) 物理アセットのコライダがデバッグ描画されることを確認します


     



       デバッグ描画が正常に行われている場合は物理アセットの設定がうまくいっています。





 ▼ チェーンのコライダのサイズを調整する


   



    シミュレーション対象のボーンには上記画像のようなスフィアの当たり判定が 自動で 割り当てられます。



       



    これは Hagoromo ノード > Hagoromo Debgu Visualizer > Show Bone Colliders ボタン を押下することで

    確認できます。

    この判定が ボディコライダ と衝突し、外側に押し出されることで揺れ物の貫通が防止されています。



     



    スフィアの半径は BoneSphereColliderRadius > Radius にて変更可能です。



    調整の注意点としてスフィアのサイズが小さすぎる場合、押し出し量も少なくなるため、

    ボーンがボディに密着するようになり、髪や布の一部が貫通して見えやすくなってしまうかもしれません。



       ※このようなケースではスフィアの半径を大きくすると貫通が改善されます

       





    またはボーンとボーンの間に大きな隙間ができ、そこに衝突判定がないため貫通が目立ってしまうかもしれません。



       ※このようなケースでもスフィアの半径を大きくして隙間を減らすことで、貫通を改善できます。

        または処理負荷が増加してしまいますが、エッジの判定を有効にすることでも問題に対応できます。

       









物理挙動の調整 :


 ▼ 剛性を調整する


   剛性は揺れ物の固さを表します。

   Hagoromo では以下を参考に設定を行います。


※1

材質 剛性
コンクリート 1.0
木材 0.24
レザー 0.004
0.002
ゴム 0.00004
0.0000002
脂肪 0.00000004


   これはあくまでも目安になります。

   最終的には見た目に納得できるものを設定してください。

   デフォルトでは 0.004( レザー ) が設定されています。



 ※1

   値については XPBD の考案者の一人である Miles Macklin 氏の記事を参考にしています。

   https://blog.mmacklin.com/2016/10/12/xpbd-slides-and-stiffness/

   Hagoromo では扱いやすいように 0.0 ~ 1.0 にマッピングしています。





 ▼ 摩擦を調整する


   



   ノードの Friction から 0.0 ~ 1.0 の間でコントロールできます。

   摩擦はボディコライダとボーンのスフィアコライダが衝突した場合に働きます。

   摩擦が大きいほどザラザラとした表面に抵抗のあるような質感を表現できます。

   反対に小さい場合はツルツル、スベスベとした印象を与えるでしょう。





 ▼ "アクター" の "移動" によって発生する力を調整する


   



     World Velocity Damping > Damping0.0 ~ 1.0 の間で調整します。

     値が大きいほど力が減衰するため、暴れの起きにくい落ち着いた( 固い )物理挙動になります。





 ▼ "アクター" の "回転" によって発生する力を調整する


   



     World Angular Velocity Damping > Damping0.0 ~ 1.0 の間で調整します。





 ▼ ボーンの "移動"、 "回転" によって発生する力を調整する


   ルートボーンや腰骨のアニメーションによって発生する大きな力で、揺れ物が破綻する場合があります。

   ここではそのような力をコントロールする手順を説明します。


    ( 1 ) Simulation Root Bone に力を調整したいボーンを指定します


      



    ( 2 ) Simulation Velocity Damping > Damping で "移動" によって発生する力を調整します


      



      Damping1.0 にすると Simulation Root Bone の姿勢がいくら変化しても、

      物理シミュレーションの結果に影響を及ぼさないようになります。



    ( 3 ) Simulation Angular Velocity Damping > Damping で "回転" によって発生する力を調整します


      



     [ プログラマ向けの補足 ]


       技術的にはシミュレーション実行前に姿勢の変化をシミュレーション対象のボーンの今の座標と、

       前フレームの座標に反映しておき、位置ベースの物理計算によって

       力が発生しないようにしています。 ( 参考. SolverInternal::ApplySimulationRootBone() )

       Simulation Root Bone の逆行列で基底を変換して力を相殺することも検討しましたが、

       変換負荷が高いことと、アニメーションポーズに関連したコンストレイントと相性が悪かったため、

       採用を見送っています。







クロスシミュレーションのやり方 :



 



  Hagoromo はデフォルトではシミュレーション対象のチェーンに対して上記画像の

  縦方向の Structural コンストレイント( 制約 )を導入しています。

  そのためチェーンが千切れたり、重力によって過剰に伸びたりせず、適当な長さが維持されています。

  しかし、クロスの場合は縦方向の距離制約だけでは布が横に大きく広がってしまいます。

  ここではクロスシミュレーションに役立つコンストレイントを説明します。



  ※ [ 前提条件 ] チェーンを時計回り、もしくは反時計周りに設定する


   



    縦方向以外の制約を計算するにあたり、チェーンのデータが隣接していると計算が簡単になります。

    現時点ではノードの設定時点で、チェーンが時計・反時計回りに登録されていることを前提にしています。





   ▼ シミュレーション対象のボーンに横方向の距離制約を追加する


    



     これは横方向の Structural に該当します。

     Use Horizontal Structural Constraint にチェックを入れることで制約が有効になります。



     [ ループ構造の対応 ]


      



       シミュレーション対象がスカートのように横方向にループした構造の場合は、

       追加で Loop Horizontal Structure にもチェックを入れてください。


      



       これにより、最初のチェーンと最後のチェーンにも横方向の距離拘束が追加されます。





   ▼ シミュレーション対象のボーンに対角線の距離制約を追加する


    



     これは Shear に該当します。

     Use Shear Constraint にチェックを入れることで拘束が有効になります。

     Shear はクロスの "歪み" の補正を行います。


      



     補正の強弱は Shear Stiffness で調節できます。





   ▼ シミュレーション対象のボーンに曲げ制約を追加する


    



     これは Bend に該当します。

     Structural 同様に垂直・水平方向で個別に設定できますが、ほぼ同じであるため、まとめて説明します。

     Use Vertical/Horizontal Bend Constraint にチェックを入れることで拘束が有効になります。

     Bend はクロスの "曲がり具合" を補正します。


      ※クロスを横から見た図です。間隔を空けて距離拘束を行うことで自然な垂れ具合を表現できます。

      



     補正の強弱は Vertical/Horizontal Bend Stiffness で調節できます。







アニメーションポーズを尊重した物理シミュレーションのやり方 :


 本質的にはシミュレーション結果をアニメーションポーズに近づけるだけです。

 Hagoromo は位置ベースの物理シミュレーションを採用しているため、

 シミュレーション中のボーンの座標をオリジナルのボーンの座標に寄せるだけでもそれっぽくなります。

 Hagoromo ではもう一歩作り込めるように位置以外の制約も実装しました。



  ▼ [前提条件] Use Anim Pose Constraint にチェックを入れる


   



   以降で紹介するコンストレイントは表題のフラグにチェックを入れることで有効になり、

   併せてエディタ上にてパラメータが出現するようにしています。





  ▼ アニメーションポーズからの距離制約


   



     Use Anim Pose Constraint Movalbe Radius にチェックを入れることで当該拘束が利用可能になります。



   



     この拘束はアニメーションポーズ( ボーン )からの離れられる距離を設定します。



      



     距離は Anim Pose Constraint Movable Radius > Radius で指定します。



      



     画像の赤色のボーンはシミュレーション中のポーズ( ボーン )を表しています。

     シミュレーション中のボーンが Radius よりも離れたとき、拘束が起動して

     Radius で定義された可動域に位置を戻します。

     Radius がほとんど 0 に近い場合、シミュレーション結果はほぼアニメーションポーズに一致します。

     また、拘束によって位置を戻す速度は Damping を通じて調整することができます。

     Damping を大きくすることで遅延してアニメーションポーズに近づくようになります。

     動きに緩急を付けたい場合は Damping0 より大きくすると良いでしょう。





  ▼ アニメーションポーズからの角度制約


   



     Use Anim Pose Constraint Limit AngleON にすると当該拘束が有効になります。

     Anim Pose Constraint Movalbe Radius角度版 です。

     アニメーションポーズ( ボーン )を基準にどれだけ曲げられるかを制約します。

   



     角度は Angle に度数法で指定します。

     拘束力の減衰は Damping で調整します。

     Damping が大きいほど、遅延しながらはみ出した角度が元に戻されます。





  ▼ アニメーションポーズからの平面制約


   



     当該機能は Use Anim Pose Constraint Planar にチェックを入れることで有効になります。



   



     平面の法線はチェーン単位で Hagoromo Chain Settings > Anim Pose Constraint Planar Axis から指定します。



   



     当該コンストレイントはボーンの任意の軸を法線とした平面上にシミュレーション結果を拘束します。

     画像のように頭が傾くと髪がおでこの奥にめり込んでしまうことがあります。

     平面コンストレイントを有効にし、シミュレーションした位置を平面上に固定することで、

     この問題を改善できます。

     単体で改善が難しい場合は、これまでに紹介したコンストレイントと組み合わせると効果的かもしれません。







その他・コンストレイント :


  ▼ 親ボーンからの相対角度拘束


   



     これはデモにおいて のシミュレーションに使用しました。

     ノードにて Use Relative Limit Angle Constraint のフラグを ON にすることで機能が有効になります。



 コンストレイント はグラフィックスプログラミングで言うところの シェーダ のようなものだと思っています。

 正解はなく、アイディア次第では他の作品と大きく差別化できる要素となる可能性を秘めています。

 面白い拘束のアイディアが思い浮かんだら、ぜひ実装して遊んでみてください!







ボーン単位でパラメータを調整する方法 :


 



  ボーン単位の調整は カーブ で行います。

  基本的に各パラメータには Multiplier Cuver という名前のカーブを用意しています。

  縦軸 はパラメータに 乗算 する値です。

  横軸 は正規化されたボーンの長さ( または番号 )になっており、 0.0 ~ 1.0 の範囲で指定します。


   



  正規化されたボーンの長さは上記ステップで計算されます。

  正規化された値を 横軸 に設定することでボーン単位でのパラメータ調整が可能になっています。





  ▼ ノードに含まれるボーン全体をカーブで調整する


   



     これはおおまかな調整に向いており、ノードの Hagoromo General Settings に含まれている

     カーブで行います。

     ここでのパラメータ変更は Hagoromo Chain Settings に登録されている すべてのボーン に影響があります。





  ▼ チェーンに含まれるボーン単位で細かく調整する


   



     こちらは Hagoromo Chain Settings のカーブで行います。



   



     Override XXX にチェックを入れるとチェーン単位のパラメータ設定が有効になり、

     Hagoromo General Settings のパラメータを上書きします。





 調整のフローは様々あるかと思われますが、まずは Hagoromo General Settings でざっくり調整し、

 挙動がいまひとつなチェーンを Hagoromo Chain Settings > Override XXX で詰めていくのが良いかと思われます。







アニメーションカーブで物理のブレンド率を調整する方法 :


  ▼ AnimBP内の全てのノードのブレンド率を調整する


     



      Hagoromo_Alpha カーブを追加してブレンドを調整するだけです。





  ▼ AnimBP内の特定のノードのブレンドを調整する


     こちらの手法では "髪だけ物理を切りたい"、のようなことがアニメーションカーブから設定できます。



      ( 1 ) ノードの Hagoromo Animation Curve Number にカーブ識別番号を設定します


     





      ( 2 ) Hagoromo_Alpha_識別番号 のカーブでブレンド率を調整します


     







振動の改善策 :


 ▼ 許容深度を増やして押し出しによって発生する力を抑える


   



     許容深度は Collider Penetration Depth で指定します。



   ※青が押し出し後のコライダです。

   



     若干のコライダのめり込みを許容することで、押し出し時に発生する力が弱まるかつ、

     しばらくの間めり込みが維持されるためコライダの 侵入 → 分離 → 侵入 → 分離 ...... による振動が改善されます。





 ▼ 押し出し処理をフレーム分散させる


   



     押し出し結果をどれだけ反映させるかを Collision Blend にて、 0.0 ~ 1.0 の間で指定します。

     0.0 < Collision Blend < 1.0 のとき押し出しが遅延し、滑らかな押し出しになり、振動の軽減が期待されます。

     注意点として、0.0 に近い値にしてしまうと貫通が目立ちやすくなります。

     0.98 のようにほぼ 1.0 に近いような値でも十分効果はあるため、様子を見ながら調整してください。





 ▼ 摩擦を大きくする


   摩擦はコライダの衝突時に発生します。

   摩擦を大きくすることで押し出し時に発生する力が減衰するため、振動の改善が期待されます。





 ▼ [ プログラマ向け ] フレームレートを安定させる


    コマンド t.MaxFPS 30 などで振動が改善する場合、

    フレームレートが不安定になっていることが原因の可能性が高いです。

    この問題は以下のような対策で改善できる可能性があります。


      ● 固定フレームレートにする

      ● 負荷軽減を実施してフレームレートを安定させる

      ● プラグインを改造して平均化された Delta Time を導入する

      ● プラグインを改造してサブステップ実行を実装して物理挙動を安定させる



    理想的には物理の計算を専用のスレッドにて一定のタイムステップで実行したいところですが、

    Unreal Engine でこれを実現するにはもしかしたらエンジンの修正が必要になり、

    実装・保守のコストが非常に高くなる恐れがあります。







貫通の改善策 :


 ▼ ボーンのスフィアコライダ、物理アセットのコライダを調整する


   当たり判定の設定 で触れたようにコライダのサイズが小さすぎる場合は

   貫通が目立つ場合があります。





 ▼ 平面コライダを活用する


   



     設定は Hagoromo Additional Collider Settings から行えます。


      ( 1 )

        平面の原点となるボーンを指定できます。

        指定がない場合は スケルトンメッシュのピボット が原点になります。



      ( 2 )

        原点のオフセットです。



      ( 3 )

        角度のオフセットです。



   



     例えば平面コライダで髪が身体の前に貫通しないようにすることができます。

     黒色の矢印が押し出し方向を表しています。

     デバッグ描画は Show Plane Colliders ボタンを押下することで表示されます。





 ▼ エッジコライダを有効にする


   



     処理負荷は上がってしまいますが Use Edige Collider にチェックを入れることで、

     ボーンとボーンの間に線分のコライダが生成されるようになります。

     このコライダによってより貫通が防止されます。





 ▼ 平面コンストレイントを活用する


   アニメーションポーズからの平面制約 で紹介したようにシミュレーション結果を

   ボーンの姿勢を基にした平面に拘束することができます。

   前髪など特定の平面のみの動きで十分なチェーンは 平面コンストレイント を利用することで、

   貫通を軽減することができます。





 ▼ Solver Iterations の数を増やす


   



      数値を上げることで衝突解決処理の回数が上昇します。

      その分だけ処理負荷も増加してしまいますが、貫通は改善されるはずです。

      また、衝突判定とは関係がありませんが反復回数を上げることで 剛性 の品質も向上します。





 ▼ ボーンとメッシュの隙間を広げる


   



     これはモデルやアニメーションデータの修正が必要になります。

     画像のようにボディとシミュレーション対象のチェーンの間の隙間を広げることで、

     ボーンのスフィアコライダを違和感なく、大きめのサイズで配置することができるようになります。

     大きくなったスフィアコライダによって貫通が一層防止されます。





 ▼ 補助骨で貫通を防止する


   CEDEC2024 UnityのHumanoidと共存するキャラクタジョイント制御と制作ワークフロー

   上記、 QualiArts さんの技術ブログの 揺れ骨のサポート補助骨 が参考になります。

   Hagoromo の計算を実行する前に揺れものが貫通しにくいアニメーションポーズを

   ガイドラインとして出力しておき、味付け程度に Hagoromo で物理挙動を乗っけることで

   破綻の少ない安定したシミュレーション結果を生成できるはずです。

   Unreal Engine の場合は コントロールリグ で実装すると良いかもしれません。

   またはランタイムで処理せずにアニメーションデータとしてベイクすることもできますが、

   この場合はデータサイズが増加する懸念があります。







デバッグ描画機能 :


ボタン コマンド 説明
ShowBoneCollider p.Hagoromo.ShowBoneColliders 物理アセットで指定されたボディコライダを表示します
ShowBodyCollider p.Hagoromo.ShowBodyCollider シミュレーション対象のスフィアコライダを表示します
ShowPlaneColliders p.Hagoromo.ShowPlaneColliders 平面コライダを表示します
ShowStructures p.Hagoromo.ShowStructures 上下左右の距離拘束を表示します
ShowShearStructures p.Hagoromo.ShowShearStructures 対角線の距離拘束を表示します
ShowFixedBledns p.Hagoromo.ShowFixedBlends 固定点の情報を表示します
ShowAnimPoseMovableRadiuses p.Hagoromo.ShowAnimPoseMovableRadiusConstraint アニメーションポーズからの可動域を表示します
ShowAnimPoseLimitAngles p.Hagoromo.ShowAnimPoseLimitAngleConstraint アニメーションポーズからの制限角度を表示します
ShowAnimPosePlanarAxes p.Hagoromo.ShowAnimPosePlanarConstraint アニメーションポーズからの平面拘束を表示します
ShowRelativeLimitAngle p.Hagoromo.ShowRelativeLimitAngleConstraint 親ボーンからの相対角度拘束を表示します
ShowVelocities p.Hagoromo.ShowVelocities 速度情報を表示します






トラブルシューティング :


 ▼ Hagoromo ノードが検索結果に出てきません


   



     Hagoromo プラグインが有効になっているか確認してください。





 ▼ 効果が分からないパラメータがあります


   



     パラメータをマウスオーバーすることで説明文がポップアップします。





 ▼ シミュレーション対象のボーンが見つからずコンパイルエラーが発生します


   



     Hagoromo はボーンの有無を正確に判定するためにプレビューメッシュのスケルトンを参照しています。

     Anim BP のプレビューメッシュが意図通りになっているか確認してください。





 ▼ エディタが非アクティブになると物理が暴れます


   



    この問題は Use Less CPU When in Background のチェックを外すことで改善される可能性があります。

    チェックボックスは エディタ上部のツールバー > Editor Preferences... にて検索すると見つかります。

    問題の根本的な原因はリアルタイムの可変タイムステップと物理の計算の相性が悪いことにあります。

    問題はアプリケーションに割り当てられる CPU リソースが低下することで発生します。

    アプリケーションの更新間隔が伸びることで、タイムステップの間隔も伸びます。

    物理の計算はタイムステップが滑らかで連続になっていることを前提としているため、

    この状況ではカクつきや暴れが起きることがあります。

    Hagoromo ではヒッチ対策を SolverInternal::UpdateDeltaTime() で行っています。

    ただ今のところは適当な定数で調整しています。

    問題をより改善するためには 何らかの手段でフレームレートを安定させる、速度を平均化する などの

    追加対応が必要かもしれません。






⚠️ **GitHub.com Fallback** ⚠️