Houdini 21.0 Muscles & Tissue

Test Geometry: Otto Muscle and Tissue Simulation

On this page

いくつかのOtis Muscle and Tissueレシピをタブメニューから使用することができます。これらは、シェルフツールのようなもので、学習目的でノードのネットワークを配置して接続し、プロセスを再生できます。 Test Geometry: Otto Muscle and Tissue Simulation レシピでは、OttoのMuscleジオメトリや、別の二足歩行キャラクタに転送したOttoのMuscleを使用して、最小限のセットアップで筋肉や皮下組織のシミュレーションを開始できます。

このレシピは、Ottoの筋肉用にカスタマイズされています。筋肉は、Ottoの筋肉に付属している独自のaxialrampアトリビュートと、同じmuscle_idアトリビュート値を持っていることを前提としています。キャラクタの筋肉がOttoの筋肉から転送されていない場合は、代わりにより汎用的なOtis Muscle and Tissue Simulationレシピを出発点として使用することをお勧めします。

Note

このレシピは、Otis Solver SOP(SOPで動作するFEMのようなMuscle & Tssue Solver)を使用します。Otis SolverはHoudini Coreで使用 できない ため、このレシピもCoreでは使用できません。このレシピを含む.hipファイルはHoudini Coreで開くことができますが、Otis Solverのみ、パラメータがグレーアウトしています。

Note

このレシピでは、キャラクタはオブジェクトレベルではなく、ジオメトリコンテキストに配置するようにしてください。

重要なノード

入力

INPUT_MUSCLES, INPUT_BONES, REST_JOINTS, ANIM_JOINTS, REST_SKIN

これらは、Test Geometry: Otto SOPからアンパックされ、その後これらのNull入力に渡される、必要なメッシュです。このセットアップは、Test Geometry: Otto Muscle Transferレシピを簡単に入力に接続して、独自の二足歩行キャラクタを使用できるように設計されています。独自の転送したキャラクタと置き換えるには、このサンプルの学習と使用を参照してください。

Muscles

muscle_setup

これは、以下を行なうノードを含むサブネットワークです:

  • Muscleサーフェスジオメトリを四面体メッシュに変換します。

  • Ottoから独自のaxialrampアトリビュートを使用して、繊維方向を作成します。

  • Muscleの物理プロパティと拘束プロパティを構成し、Otto固有のmuscle_id Musclesについては上書きします。

  • Otto固有のカスタムアトリビュートを作成して、筋肉の集合体に単一の緊張ラインを作成します。

詳細は、Muscleのセットアップを参照してください。

muscle_id

このMuscle ID SOPでは、muscle_idアトリビュートはOttoに付属するpathアトリビュートから初期化されます。必要なのはpath/で区切ったときの最後から2番目の要素なので、 Extract Element from Path Attribute は有効で、 Element Pos from End1に設定されています。

musclesolidify4

このMuscle Solidify SOPは、Muscleサーフェスジオメトリを四面体メッシュに変換します。四面体のサイズは、 Remesh Surfaces フォルダの Min Size および Max Size によって決定されます。形状を正確に表現することと、シミュレーション時間の短縮につながる軽量化との間で、良いバランスが確保されるように構成されます。

fibergroom_from_axialramp, fibergroom_override_transVAbs

これらのFiber Groom SOPは、繊維方向アトリビュートmaterialWを作成します。1つ目は、Ottoの筋肉に付属しているaxialrampアトリビュートを使用して、背中の筋肉のような複雑な形状でも、正確な繊維方向にします。2つ目は、より単純な繊維方向にした方が良い結果となった特定の1つの筋肉に対して、その繊維方向を上書きします。

musclepropertiesotis1

このMuscle Properties Otis SOPは、キャラクタのMuscleに 物理プロパティ を割り当てます。これにより、Otis Solverで筋肉がどのようにシミュレーションされるかが決まります。これらの物理プロパティは、筋肉の形状変化に対する受容性や抵抗性、筋肉のどの領域が腱なのか、筋肉の剛性や柔軟性、筋肉が収縮した時の膨らみ具合など、Muscleの挙動を制御します。注意すべきプロパティの上書きの1つが、腹部の臓器に対するものです。筋肉というよりも臓器らしい挙動になるように、 Shape StiffnessMass DensityFiber Strength がかなり低い値で適用されます。

muscleconstraintpropertiesotis1

このMuscle Constraint Properties Otis SOPは、Muscle Otis拘束の複数のレイヤを駆動するアトリビュートを作成および変更します。上書きは主に、Muscle EndおよびMuscle Glueマスクを微調整するためのものです。

tensionendmask_for_tensionlines

このAttribute Combine SOPは、次のノードでmuscleendmaskが編集される前に、tensionendmaskと呼ばれるmuscleendmaskのコピーを作成します。tensionendmaskアトリビュートは、tension_linesで使用されます。

zero_out_ends_in_glue_region

このAttribute Combine SOPは、muscleendmaskアトリビュートからmuscletomuscleglueアトリビュートを減算します。一部のOttoの筋肉、特に腹部と斜筋については、筋肉の腱の領域を筋肉の両端にすべきではありません。それらが付着するボーンがなく、代わりにmuscletomuscleglueを使用して隣接する筋肉に付着しているからです。

tension_id

ここでは、Muscle ID SOPを使用して、tension_linesで使用される、tension_idという名前のIDアトリビュートを作成します。それを既存のmuscle_idアトリビュートから初期化し、すべてのL_rectusAbdominis_* IDの名前をL_rectusAbdominisという単一のIDに変更して、緊張ラインが1本だけ作成されるようにします。このように処理するのは、個別のIDのままにしておくと、その領域には緊張ラインを正確に変形するボーンがないからです。L_oblique_* Muscleでも同様の処理が行なわれます。

Muscleのアクティブ化

tension_lines

このMuscle Auto Tension Lines SOPは、上で定義されたそれぞれのtension_id値に、自動的に緊張ラインを作成します。また、muscleendmaskではなく、Otto用に定義されたカスタムアトリビュートtensionendmaskを使用して、緊張ラインの両端の場所を決定します。

activate

この Muscle Tension Lines Activate SOPのActivationパラメータは、Otto用にカスタマイズされています。このノードでは、静止ポーズでも緊張ラインをアクティブ化できることに注目してください。立っているときでも、一部の筋肉が使用されているからです。

flex

Muscle Flex SOPは、カスタムセットアップがほとんど必要ありません。 Attribute to Match パラメータはtension_linesノードの Muscle ID Attribute と一致するように、tension_idに設定されます。また Blend パラメータは、シミュレーションの開始時に筋肉が完全に弛緩するようにキーが打たれます。一部の緊張ラインは静止ポーズでアクティブ化されているからです。

詳細は、筋緊張ラインと屈曲を参照してください。

FasciaまたはTissue

fascia_setup, tissue_setup

これら2つのサブネットワークには、Fascia(筋膜)またはTissue(皮下組織)をセットアップおよび構成するためのノードが含まれています。

詳細は、Fascia & Tissueのセットアップを参照してください。

tissuesolidifyotis1

このTissue Solidify Otis SOPは、FasciaとTissueのセットアップのサブネットワークであるfascia_setup, tissue_setupの両方にあります。外部サーフェスメッシュから四面体化したボリュームを生成して、軟組織シミュレーション用の解剖学的なジオメトリを準備します。このとき、必要に応じて、構造コンテキストとして内部のMuscleやボーンのジオメトリを使用します。fascia_setupで、 Method パラメータは Fascia に設定され、tissue_setupでは Fused Tissue and Core に設定されています。またFasciaの解像度がTissueの解像度より低いのは、FasciaはMuscleを所定の位置に保持するためにのみ必要されるのに対し、Tissueは最終的にSkin出力を駆動する必要があるためです。

tissuepropertiesotis1

このTissue Properties Otis SOPは、FasciaとTissueのセットアップのサブネットワークであるfascia_setup, tissue_setupの両方にあります。Tissueのシミュレーションの挙動を制御する物理プロパティと拘束アトリビュートを、アクティブ化して割り当てます。 Tissue Solid Layer タブがFasciaに影響しないのは、Fasciaは Tissue Core Layer のみで構成されているからです。

switch_sim_tissue

このノードで、FasciaとTissueのシミュレーションの使用を切り替えることができます。セットアップを切り替える方法については、このサンプルの学習と使用を参照してください。

Otis構成とソルバ

otisconfiguremuscleandtissue1

このOtis Configure Muscle and Tissue SOPは、シミュレーション前の最後の準備段階です。このノードは最終構成に向けて上流ノードからすべてのジオメトリとアトリビュートを収集し、入力アトリビュートから必要な拘束を作成して、それをすべてOtis Solverに送信します。

詳細は、Otis構成とシミュレーションのワークフローを参照してください。

otissolver1

このOtis Solver SOPは、四面体ソフトボディ拘束に特化したソルバです。この特定のタスクでは、Vellum Solverよりも高速かつ正確です。筋肉と皮下組織のシミュレーションにはこのノードが最適です。なお、このレシピでは、サブステップはファイルのフレームレートに依存しているため、デフォルトのFPS(24)では40サブステップで実行されますが、それより高いFPS、例えば60では16サブステップのみで実行されます。

スキンのポスト処理

deform_skin

このサブネットワークには、スキンのポスト処理のセットアップが含まれています。皮下組織を筋肉とともにシミュレーションする際に適用します。

詳細は、スキンのポスト処理を参照してください。

Note

このサブネットが適切に機能するように、switch_sim_tissueスイッチが1に設定されていることを確認してください。

cache11

このノードで、ポスト処理が高速化します。Otisシミュレーションをディスクにキャッシュ化した状態で、Displayフラグをこのノードに設定し、フレーム範囲を再生します。これにより、シミュレーションがメモリにキャッシュ化されます。

skindeform1

このSkin Deform SOPは、レンダリング用スキンアニメーションを1番目の入力、シミュレーションされたTissueの外部サーフェスを2番目の入力として受け取って、前者を後者で変形します。頭、手、足といったシミュレーションの影響を受けない領域は、deform_skinサブネット内部で作成されるskinmaskアトリビュートによって、変形から除外されます。 Skin Sliding のトグルをオンにすると、シミュレーションのような結果を提供するQuasistatic(準静的)Skinスライディングが有効になります。

スキンの変形。Skinスライディングなし(左)とSkinスライディングあり(右)

wrinkledeformer1, switch_add_wrinkles

スイッチが1に設定されているとき、このWrinkle Deformer SOPによってプロシージャルな皺が追加されます。下流のdeltamush_weak Delta Mush SOPで皺をプレビューしましょう。そうしないと、皺がきつくなりすぎてしまいます。カスタムアトリビュートを作成して、異なる領域の皺の見た目を制御できます。

deltamush_weak, deltamush_strong, blend_strong_deltamush

deltamush_weak Delta Mush SOPはキャラクタ全体に適用され、メッシュのあらゆる小規模な変形を修正するのに大変便利です。blend_strong_deltamush Wrangleは、より強いdeltamush_strongをブレンドして、シミュレーションジオメトリとアニメーションジオメトリ間のトランジション領域(手首、足首、首の上部など)にのみ影響するようにします。

このサンプルの学習と使用

To...Do this

Test Geometry: Otto Muscle Transferレシピを使用し、それをこのネットワークに接続する

この2つのレシピは、互いに直接連携して動作します。筋肉の転送プロセスを完了させたら、ソースおよびターゲットアセットをこのレシピに直接供給することができます。

  1. ノードネットワークで、 Test Geometry: Otto Muscle Transfer レシピの下に Test Geometry: Otto Muscle and Tissue Simulation がくるように、2つのレシピを並べて配置します。

  2. 以下のノードを削除します:

    • testgeometry_otto

    • unpack_muscles

    • BONES_TRACH

    • unpack_rest_joints

    • invoke_joint_anim

    • unpack_skin

  3. REST_MUSCLESINPUT_MUSCLESノードに接続します。

  4. REST_BONESINPUT_BONESノードに接続します。

  5. REST_SKINREST_SKINノードに接続します。独自のターゲットジオメトリを使用している場合は、レンダーメッシュの解像度に応じて、subdivide1ノードをバイパスすることをお勧めします。

  6. 転送されたリグを使用している場合:

    • RIG Null出力の後に、Unpack Folder SOPを作成し、 Extract Pattern/Base.skelに設定します。

    • これをREST_JOINTS Nullに接続します。

    • RIG Null出力の後、APEX Scene Animate SOPを作成します。ここで、自分のキャラクタをアニメーションします。

    • Scene Animate の後に、APEX Scene Invoke SOPを作成します:

      • OutputUnpacked Geometry に設定し、

      • Character Shapes のトグルをオフにし、

      • Extra Outputs の下で Scene Output Path/Base.rig/outputに、 KeyBase.skelに設定します。

    • Scene InvokeANIM_JOINTS Nullに接続します。

    • その他のオプションは、アニメーションワークフローページを参照してください。

  7. または、アニメーションボーンおよびスキンジオメトリのキャッシュを持っている場合は、以下の アニメーションをアニメーションキャッシュに置き換える を参照してください。

FasciaとTissueのセットアップを切り替える

  1. switch_sim_tissueノードを見つけます。デフォルトで、ノードはfascia_setupに設定されています。

  2. それをtissue_setupに変更するには、 Select Input パラメータを1に設定します。

  3. それをfascia_setupに戻すには、 Select Input パラメータを0に設定します。

  4. さらに下流のswitch_sim_tissue1ノードも、自動的に同じように更新されます。そのパラメータがswitch_sim_tissueのパラメータを参照するからです。これは、Tissueもシミュレーションされる場合にのみ、deform_skinサブネットを実行するようにするためです。

シミュレーションを使って、アニメーションされたスキンを変形する

  1. セットアップがFasciaではなくTissueのシミュレーションに切り替わっていることを確認します。

  2. 最初に、otissolver1deform_skinサブネットの間に配置されたFile Cache SOPを使用して、シミュレーションをディスクにキャッシュ化することをお勧めします。

  3. deform_skinサブネットの中に入ります。

  4. Displayフラグがcache11に設定されていることを確認し、フレーム範囲全体を再生してシミュレーションをメモリにキャッシュ化します。

  5. Skinスライディングを有効にしたい場合、skindeform1を選択し、 Skin Sliding のトグルをオンにします。

  6. プロシージャルな皺を有効にしたい場合は、switch_add_wrinklesを選択し、 Select Input パラメータを1に設定します。

アニメーションをアニメーションキャッシュに置き換える

  1. bonedeform1Surface Deform SOPに置き換えます。

    • 1番目の入力は、前と同じbone_setupサブネットにする必要があります。

    • INPUT_BONES Nullを2番目の入力に接続します。

    • アニメーションキャッシュからボーンを分離して、それを3番目の入力に接続します。アニメーションされたボーンが、静止INPUT_BONESと同じトポロジーを持っていることを確認します。

    • これにより、アニメーションされたボーンが三角形化されます。

  2. アニメーションキャッシュからレンダリング可能なスキンを分離して、それをANIM_SKIN Nullに接続します。ANIM_SKINREST_SKINと同じトポロジーを持っていることを確認します。

異なる開始フレームを使用する

  1. フレーム範囲を、プレイバーで必要な範囲に更新します。シミュレーションがtposeのキャラクタで始まるように、プリロールフレームが含まれていることを確認してください。

  2. flexノードで:

    • Blend パラメータをクリックし、 Delete Channels を選択します。

    • 開始フレームに移動して、 Blend0に設定し、 BlendAltを押しながらクリックしてキーフレームを設定します。

    • 数フレーム(プリロールの長さに応じて3~10フレーム)先にジャンプして、 Blend1に設定し、 BlendAltを押しながらクリックしてキーフレームを設定します。

  3. otisconfiguremuscleandtissue1ノードで:

    • Reference Frame を自分の開始フレームか、$FSTART(Frame Rangeの開始フレームが何であっても自動的に使用するようにしたい場合)に設定します。

    • 静止長が1以外の場合、開始フレーム時の0から数フレーム後の1まで、 Rest Blend アトリビュートにキーを設定します(前述のflex Blend を参照)。

  4. otissolver1で:

    • Start Frame を自分の新しい開始フレームまたは$FSTART(Frame Rangeの開始フレームが何であっても自動的に使用するようにしたい場合)に設定します。

    • 静止長が1以外の場合、 Target タブで Rest Shape のトグルがオンになっていることを確認します。

  5. deform_skinサブネット内部のskindeform1ノードで、 Reference Frame を自分の新しい開始フレームまたは$FSTART(Frame Rangeの開始フレームが何であっても自動的に使用するようにしたい場合)に設定します。

Muscles & Tissue

基本

Musclesの扱い方

Musclesレシピ

レガシーMuscles(Vellum Solver)