0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ragdoll Solver SOP [Mardini2024]

Posted at

これはMardini2024のDay20 Ragdoll Solver SOP の動画を視聴してまとめたものです。

動画

image.png

公式のサンプルファイル

Day19 Joint Capture Biharmonic | Day20 Ragdoll Solver SOP | Day21 Vellum Configure Cloth

Ragdoll Solver SOPノードは、ターゲットスケルトンに対してラグドールRBDシミュレーションを実行するためのノード

Ragdoll Solver SOPのヘルプ

walk.gif

概要

  • 主な手順

    • FBX Character ImportでMixamoキャラクターとアニメーションをインポート
    • Configure Jointsで関節の動きの制限を設定
    • Ragdoll Collision Shapesでコンベックス(凸)コリジョン形状を生成
    • Motion ClipとMotion Clip Evaluateでアニメーションをループ化
    • Skeleton Blendで歩行アニメーションと崩れ落ちるアニメーションをブレンド
    • Ragdoll Solverで物理シミュレーションを適用
    • Joint Deformで最終的な変形を適用
  • 設定について

    • Configure Jointsでの関節の動きの範囲設定
    • Ragdoll Solverの「Configurations」での細かい制御
    • Position Stiffness、Bend Stiffness、Dampingなどのパラメータ調整
    • 場合によってSolverのサブステップを増やして安定性を向上させる必要もある
    • ダンピングを調整して自然な動きを作成

サンプルファイル

Mixamo 歩行データはサイトからダウンロードが必要

image.png

Electra

image.png

はじめに

Ragdoll Solver SOPは名前の通りSOPレベルのため、Geometryを作成しRagdoll Solverを作成します。

image.png

このノードには2つの入力、スケルトンとコリジョンシェイプ(衝突形状)が必要です。
では実際にセットアップしていきましょう。

ラグドール用のキャラクターは Electra や、 Capybara のどちらでも使用できます。
しかし今回はFBX Character Import を使用して、Mixamo からアニメーションをインポートしてきます。

モデルはY Bot、アニメーションはStrut Walkingです。

image.png

アニメーションのインポートと初期設定

image.png

FBXはfbxcharacterimport内のFBX Fileで指定し、アニメーションのクリップ(歩行クリップ)はClipNameのドロップダウンからmixamo.comを選択します。そのままだとビューポート上では、Tポーズのままとなります。これはデフォルトで最初の出力、つまり静止ジオメトリを表示するようになっているからです。

このノードの出力がどんなものなのかを確認するために、3つのNULLノードをつなげます。
名前は、REST_GEO、REST_SKELETON、ANIMATION_SKELETONとしています。

image.png

関節の制限の設定

最初にやるべきことはスケルトンに対して、いくつかの制限(関節がどの角度まで曲がることができるか)を定義することです。ラグドールソルバーをいれてそのままだと、肘が後ろに曲がることもあります。

これを解消するには、Configure Jointsノードを使用する必要があります。
途中Rig Stash Pose も使用します。

image.png

これらの関節の制限をセットアップするために、最初にすべきことは回転順序を確認することです。
まず YZX に、Full Body IKからRagdollに変更します。

image.png

ビューポイントで特定の関節をクリックすると、トランスフォームハンドルで表示されます。

image.png

しかし、表示がなんだか変な気がします。あれ?こんなんだっけ?

image.png

一個前のバージョンで見てみます。

Houdini20

image.png

Houdini20.5

image.png

表示上のハンドルとガイドが逆になってるので、これは不具合かもしれません。

レポートを送ろう

こういった場合はSideFXにレポートを送りましょう。待っていて解決する場合も1%ほどありますが、SideFXの多喜さんの記事が参考になります。

「報告 (レポート) しなければ問題は解決されない」 は「シュートしないとゴールは生まれない」に近い。

勿論、シュートしなくともゴールが生まれることはある。例えば、オウンゴール。

立場が違うと感じ方に違いはあるかもしれないが、ソフトウェア開発側からすると、報告せずに問題が直るのを期待するのは、オウンゴールを期待しているのに近い。確かにそういこともあるが極めて稀。

しかし、シュートはただ打てば良いというものではなく、少なくとも枠内に飛ばさないと得点には結びつかない。

「枠内」なレポートとは
以下の情報の明記が「枠内」と言える。

  • 問題の概要: Houdini のビルド番号 (例: 19.0.460) を含める
  • 問題の再現手順 + 問題が再現可能なシーンファイル
  • 補足情報: マシン情報等

どれかが欠けているのは、枠を外したと言える。逆に、特に上の二つが明瞭であれば、所定の書式というのは不要。

レポートはここから送ります。
image.png
https://www.sidefx.com/bugs/submit/

バグ報告/機能強化リクエストの提出

Houdini で見つかったバグを送信するには、以下の送信フォームを使用してください。また、このフォームを使用して、Houdini の機能強化のリクエストを送信することもできます。

ソフトウェアの改善にご協力いただきありがとうございます。午前 9 時から午後 4 時 (東部標準時) の営業時間内に、すべての投稿に返信できるよう最善を尽くします。問題を明確に示す小さなサンプル ファイルとスクリーン ショットを送信して、投稿されたバグの再現と修正にご協力ください。

必要な情報は

  • 問題の概要: Houdini のビルド番号 (例: 19.0.460) を含める
  • 問題の再現手順 + 問題が再現可能なシーンファイル
  • 補足情報: マシン情報等

です。

■ General Information

  • Name 例:jyouryuusui
    • ログインしていると自動で入力されます 
  • AccountNumber 例:23752

■ Software Information

  • Version 例:20.5 
  • Build 例:341
  • Operating System 例:MacOS
  • Category 例:Rigging GeneralCategory
  • Houdini License 例:Indie

■ Description of Problem

(最小限の)再現方法 問題の再現手順を番号付きで簡潔に書く。

  • Summary タイトル

    • 「H20.5からConfigure JointsノードでAngle Rangeのハンドルガイドが反転している」
    • Angle Range handle guide is inverted in Configure Joints node since H20.5.
    • DeepLなどで翻訳しましょう https://www.deepl.com/ja/translator
  • 重要度 Severity 例 Low Priority

    • 以下の優先度から選択します
      • 非常に低い優先度
      • 優先度低
      • 優先度中
      • 優先度高
      • 緊急
  • Description

再現手順(Steps to reproduce)

  1. KineFXのボーンを作成する
  2. Configurationsを追加し、曲げるRigのポイントを選択する
  3. configurejointsノードでAngleRangeのX Y ZのどれかをMin:0 Max:0から広げる
  4. ビューポートの回転ハンドルとガイドのズレが発生する

実際の動作と期待される動作(Actual vs expected behavior)

  • Configure JointsノードでのAngle Rangeのガイドがハンドルに追従すること

補足

  • Z Angle RangeをMin:5 Max:45 とすると、ハンドルのガイドがMin:-5 Max:-45に反転して表示されてしまいます。 Houdini20まではガイドがハンドルに追従し、MinとMaxの間にコーナーとなる領域が表示されていました。この事象はWindows10、MacOSのHoudini 20.5.278〜20.5.341で発生してることを確認しています。
  • Attachments
    • 今回は最低限の構成のhipファイルを添付します
    • 場合によっては画像も添付します

image.png

問題なければSubmitします

image.png

日本時間だと時差が14時間あるので、同日の午後11時から翌日の午前6時までが営業時間内になるかと思います。

SubmitするとSideFXのトップページに遷移します

image.png

サッカーのオウンゴールの確率は約2%らしいです。
これを読んでいる方も、バグに出会ったら積極的にレポートを提出しましょう。

※修正された場合はまたここに追記します

つづき

ビューポイントで特定の関節をクリックすると、トランスフォームハンドルで表示されます。

image.png

image.png

これは関節の範囲を定義するために使用するものです。
各関節がそれぞれの軸でどれだけ動けるか?を複数の軸でセットアップします。
つまり、このメッシュで表された領域で関節が動けるということです。

image.png

↑肩の動き

いくつかの関節に対して繰り返しセットアップします。
すべての関節に対して行う必要はないのですが、重要な関節に対してはなるべく設定しましょう。

また、この段階はあくまで初期セットアップであるため設定が完璧である必要はありません。
後で調整を加えることができます。

すべてセットアップすると、ConfigreJointsノードを確認してみてください。
セットアップした数分だけ設定が追加されています。以下の例だと18箇所の関節

image.png

これで関節の制限ができました。

コリジョン形状の設定 Ragdoll Solver + Ragdoll Collision Shapes

次に必要なのは、ジオメトリのコリジョンです。
そのために、Ragdoll Collision Shapes を使用します。以下のようにConfigureJointsを第1入力に、REST_GEO から第3番入力に取り込みます。これにより凸面が生成されます。

image.png

オリジナルのレストジオメトリのままシミュレーションを行うと、非常に計算が複雑になるため、
レストジオメトリを簡略化した凸面(コンベックス)が利用されます。

image.png

これはRagdoll Solverで完璧に動作します。(内部的にはRBD Solverです)

クリーンアップ

ビューポート上部のdisplay intersections をクリックすると、交差(赤くなっているところ:肩と胸)を表示できます。

image.png

ここでShapeをCapsuleからConvex Hull(凸)に変更し、Enable Handleにチェックを入れてハンドルを有効にします。

image.png

ハンドルが出てきたので、拡大や移動を行い各形状を干渉の無い状態に変更していきます。

image.png

指のようにたくさんの形状で構成されている場合は、指を(マージしたい親は選択せずに)まとめて選択し、右クリックから「Merge Convex Hull with Parent」を選択します。するとひとかたまりのコンベックスにすることができます。
これは形状が複雑になりすぎるのを避けるための便利な方法です。

image.png

Ragdoll Solverの設定

Ragdoll Solverノードを以下のようにつなぎます。

image.png

もしオブジェクトが下に行ってしまった場合は、reset simulation を押すともとの位置に戻ります。

image.png

再生すると、キャラクターは単に自由落下していきますが、それはそれで問題ありません。

image.png

Ragdoll SolverノードのGround Collisionで「Ground Plane」を選択して、再度再生させます。

image.png

するとキャラクターは設定した関節の制限を守って崩れ落ちるはずです。

image.png

※もしも特定の関節の動きの範囲が大きすぎると感じた場合は、ConfigureJointsノードに戻って調整を行います。

アニメーションの適用

では、一番最初の歩行アニメーションをどのようにRagdoll Solverに送り込めばいいでしょうか?
最初にすることは、Motion Clip を使用してアニメーションをループ可能にすることです。

image.png

Frame Rangeチェックボックスを有効にし、右クリックからDeleteChannelsで $FSTART と $FEND のチャンネルを消します。

image.png

そして、このアニメーションの最後のフレームである34フレームを設定します。

image.png

Motion Clip Evaluateノードを追加し、end behavior をループに設定します。

image.png

これで完璧にループされた状態になります。

動画ではその場でループするアニメーションとなっていますが、もしも前方に移動するアニメーションが付与されていた場合、MotionClipノードの後ろにMotionClipExtractLocomotionノードを追加します。

image.png

Compute Locomotion内のLocomotion Jointに固定したい場所、例えば「mixamorig:Hips」で固定することで、その場で歩き続ける動作に変更することができます。

image.png

「歩いているのに前に進まないよ〜」

ではRagdoll Solverに適用していきます。
Skeleton Blendノードを追加し、以下のように接続します。

image.png

SkeltonBlendのWeightがデフォルトで0、Translate Rotate Scaleが有効となっているので
変更する必要の無いScaleを無効化します。

Weightを0から1に変更すると、アニメーションがブレンドされていることが確認できます。
0→1にすることで2つのアニメーションの切り替えができるということです。

image.png

これをRagdoll Solverに入力できます。

image.png

アニメーションの調整

image.png

なにも設定しないまま接続すると開始ポーズが少し異なる以外は先ほどとほぼ同じように倒れます。
歩いている途中で倒れる。というアニメーションにしたい場合は、Ragdoll SolverのRagdoll設定を使用して調整します。

Configurations で、+ボタンを押して追加します。

image.png

group には特定の関節を選択できますが、いったん1つ目と同様アスタリスク (*) を入力します。
(これは選択可能なすべての関節を使用することを意味します)

また、Match World Transformのチェックボックスも有効にします。
そしてPositionStuffinessに倒れさせたいフレームでアニメーションキーを打ちます。(WinならAltかMacならOption)

image.png

この例だと、40フレーム目でpositional stiffness:100、47フレーム目で0にしています。
これで歩いている途中47フレーム目でこけるアニメーションとなります。

上記の例ではアスタリスクですべて選択しましたが、これを限定的な関節に選択することで、面白い効果を発揮します。
例えば脚の関節だけを選択すると、脚の関節だけがアニメーションに一致することになります。

image.png

そうすると、以下のようにゾンビ状態(もしくは酔っぱらい)の歩行アニメーションが簡単につくれます。

image.png

Ragdoll Solver + Joint Deform

アニメーションの準備ができたら後はJoint Deformノードを使用するだけです。

image.png

image.png

注意すべき点として、Ragdoll Solver内のConfigurationsで後から新しい設定を追加すると、競合する設定を上書きすることです。例えば同じボーンを2番めと3番目のGroupに適用していた場合、下のものが優先されてオーバーライドされます。

しかし、これはあくまで同じボーンを設定した場合の話であり、例えば2番目の設定に下半身、3番目の設定に上半身と設定すると両方の設定を活かすことができます。

動画では上半身を選択し、Match World Transforms を選び、Position Stiffness を5のような値に減らして適用させています。

詳細な調整

変更できるもう一つのものは、一般的な bend stiffness と bend damping です。
bend stiffness を0.5のような値に下げると、すべてが非常にフニャフニャになります。

image.png

逆にbend stiffnessを20のような値に上げると、動きが滅茶苦茶硬くなります。

bend damping は、元の位置に戻るまでにかかる時間を定義します。
似たような名前ですが position damping もあります。
これを上げると、元の位置に戻るまでに時間がかかるようになります。

image.png

衝突オブジェクトの追加

最後に、Ragdoll Solverのこれまで使っていなかった3つ目の入力についてです。
ここには、衝突させる情報を入力します。
Cubeを追加して歩行者にぶつかるキーフレームアニメーションを付与します。

image.png

image.png

・・顔が吹っ飛んでしまいました。

これを修正する方法はいくつかあります。
・Solverのサブステップを増やす 
例えば50ほど増やします。

image.png

それでも駄目ならダンピングも必要です。
他のオプションもいろいろ調整してみましょう。
constraints iterations も50に上げます。

image.png

image.png

多少マシなぶつかり方になりました。

まとめ

Ragdoll Solverを含むこの一連の機能の良いところは、この後にインポートする別のMixamoキャラクターのどのアニメーションにも機能するはずだということです。

今回はStrut Walkingのアニメーションを適用させましたが、ブレイクダンスのアニメーションに変更させて途中で転ぶというアニメーションにもすぐに変更できます。

この柔軟性はプロシージャルならではだと思います。

※ブレイキングダンスの場合はループアニメーションではないのでMotion Clip とMotion Clip Evaluate を無効にする必要があります。

0
0
1

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?