Houdini 21.0 Muscles and tissue

Otis Muscle and Tissue Simulation

On this page

There are several Otis muscle and tissue recipes available through the tab menu. These are similar to shelf tools that put down networks of nodes for learning purposes and plug and play processes. The Otis Muscle and Tissue Simulation recipe provides a flexible simulation setup for any character with custom muscle geometry. It’s ideal for non-humanoid or stylized characters where the Test Geometry: Otto Muscle and Tissue Simulation recipe doesn’t apply.

Note

This recipe uses the Otis Solver SOP, the FEM-like muscle and tissue solver in SOPs. Because the Otis solver is not available in Houdini Core, this recipe is not available in Core either. However, a .hip file containing this recipe can still be opened in Houdini Core, and only the Otis Solver will have its parameters greyed out.

Note

For this recipe, make sure to place it at the geometry context instead of the object level.

Important nodes

Inputs

MUSCLE_SURFACES, REST_BONES_TRIANGULATED, ANIM_BONES_TRIANGULATED, REST_SKIN, ANIM_SKIN

These are the reuqired meshes extracted from the Test Geometry: Capybara and then fed into these null inputs. This setup allows you to feed your own muscles, rest bones, animated bones, and render skin into the recipe. See Learning and using this example to replace it with your own geometry.

Muscles

muscle_setup

This is a subnetwork that contains the nodes to:

  • Convert your muscle surface geometry into a tetrahedral mesh.

  • Paint the fiber grooms.

  • Configure the muscle physical properties and muscle Otis constraints.

See Muscle setup for more information.

muscle_id

This Muscle ID SOP, creates Muscle IDs and assigns them to each connected cluster of primitives on the input geometry. If your character’s muscles have a path attribute, then the muscle_id will automatically be initialized with the second-to-last chunk from the / separated path.

musclesolidify4

This Muscle Solidify SOP converts the muscle surface geometry into tetrahedral meshes. The size of the tets are determined by the Min Size and Max Size in the Remesh Surfaces folder. In this recipe the tets are quite large, to keep the resolution lightweight and the simulation times fast, but you will probably want to reduce the tet size for your character if you want more detail to be preserved.

fibergroom

This Fiber Groom SOP, allows you to interactively paint the fiber direction for your muscle tetrahedral meshes.

musclepropertiesotis1

This Muscle Properties Otis SOP, assigns physical properties to your character’s muscles that will determine how they are simulated by the Otis Solver. These physical properties control muscle behaviors like how receptive or resistant muscles are to shape changes, which regions of a muscle are tendon, how stiff or floppy a muscle is, how much a muscle will bulge on contraction, and so on.

muscleconstraintpropertiesotis1

This Muscle Constraint Properties Otis SOP, creates and modifies the attributes that drive multiple layers of muscle Otis constraints.

Muscle activation

tension_lines, activate, flex

The Otis Muscles and Tissue system can automatically create tension lines using Muscle Auto Tension Lines SOP, eliminating the need to manually draw lines for each muscle like in the previous Houdini versions. These tension lines are then fed into Muscle Tension Lines Activate SOP and Muscle Flex SOP nodes to set the flexing action of your muscles during simulation.

See Muscle tension lines and flex for more information.

Fascia or tissue

fascia_setup, tissue_setup

These two subnetworks contain nodes to setup and configure your fascia or tissue.

See Fascia and tissue setup for more information.

tissuesolidify1

This Tissue Solidify Otis SOP is in both the fascia and tissue setup subnetworks: fascia_setup, tissue_setup. It prepares anatomical geometry for soft tissue simulation by generating a tetrahedralized volume from an exterior surface mesh, optionally using interior muscle and bone geometry for structural context. In the fascia_setup the Method parameter is set to Fascia while in the tissue_setup it is set to Fused Tissue and Core. The resolution of the fascia can be lower than that of the tissue, as it is only needed to hold the muscles in place, while the tissue needs to eventually drive the skin output.

tissuepropertiesotis1

This Tissue Properties Otis SOP is in both the fascia and tissue setup subnetworks: fascia_setup, tissue_setup. It activates and assigns the physical properties and constraint attributes that govern the behavior of the tissue’s simulation. The Tissue Solid Layer tab has no effect on the fascia, as the fascia only consists of the Tissue Core Layer.

switch_sim_tissue

This node allows you to switch between using a fascia or tissue simulation. See Learning and using this example on how to switch between the setups.

Otis configure and solver

otisconfiguremuscleandtissue1

This Otis Configure Muscle and Tissue SOP is the final preparation step before simulation. The node collects all geometry and attributes from upstream nodes for any final configuration, creates the constraints required from the incoming attributes, and then sends it all to the Otis solver.

See Otis configure and simulation workflow for more information.

otissolver1

This Otis Solver SOP, is a specialized solver for tetrahedral soft body constraints that is faster and more accurate than the Vellum Solver for this singular task. This makes it well suited to simulate muscle and tissue.

Skin post-processing

deform_skin

This subnetwork contains the skin post-processing setup which gets applied when the tissue is simmed with the muscles.

See Skin post-processing for more information.

Note

Ensure the switch_sim_tissue switch is set to 1 for this subnet to work correctly.

cache11

This node helps to speed up the post-processing. With the Otis simulation cached out to disk, and the display flag set to this node, play through your frame range. This will cache the sim to memory.

skindeform1

This Skin Deform SOP takes the render skin animation as the first input, and the simmed tissue outer surface as the second input, and deforms the former with the latter. Regions that aren’t affected by the sim, such as the head, hands, and feet, are excluded from the deformation with the skinmask attribute which is created inside the deform_skin subnet. Toggle on Skin Sliding to enable quasistatic skin sliding which gives simulation-like results.

Skin deform without skin sliding (left), and with skin sliding (right).

wrinkledeformer1, switch_add_wrinkles

When the switch is set to 1, procedural wrinkles will be added with this Wrinkle Deformer SOP. Preview the wrinkles in the downstream deltamush_weak Delta Mush SOP or the wrinkles will look too harsh. Custom attributes can be created to control the look of the wrinkles in different areas.

deltamush_weak, deltamush_strong, blend_strong_deltamush

The deltamush_weak Delta Mush SOP is applied to the entire character and is very useful for fixing any small scale distortions in the mesh. The blend_strong_deltamush wrangle blends the more extreme deltamush_strong to only affect the transition regions between the sim and the anim geometry, such as the wrists, ankles and top of the neck.

Learning and using this example

To...Do this

Use your own character’s muscles, bones, animation, and render skin.

  1. Delete the following nodes:

    • capy_muscles

    • capy_bones

    • bone_setup (or keep as an example of how to prepare your bone geometry)

    • capy_skin

    • skin_only

    • tissue_grp

  2. Connect your muscle surface geometry to the MUSCLE_SURFACES node.

  3. Connect your bone surfaces in t-pose (rest position) to the REST_BONES_TRIANGULATED node. Ensure that your bones are triangulated and have a tpose attribute. An ID attribute, such as muscle_id is also recommended. See the bone_setup subnet for how to do this.

  4. Connect your animated bone surfaces to the ANIM_BONES_TRIANGULATED node.

  5. Connect your rest render skin to the REST_SKIN node. Ensure that it has a point group called tissue that excludes the points on the skin that should not be turned into tissue geometry, such as the face, hands, feet, paws, and thin tails.

  6. Connect your animated render skin to the ANIM_SKIN node.

See Muscle setup’s required asset section for more information about input geometry requirements.

Switch between fascia and tissue setup.

  1. Locate the switch_sim_tissue node. By default, the node is set to fascia_setup.

  2. To change it to tissue_setup, set the Select Input parameter to 1.

  3. To change it back to fascia_setup, set the Select Input parameter to 0.

  4. The switch_sim_tissue1 node further down will automatically update to the same, because the parameter references that of switch_sim_tissue. This is in order to only run the deform_skin subnet when the tissue is also simulated.

Deform your animated skin with the simulation.

  1. Ensure your setup is switched to sim tissue and not fascia.

  2. It is recommended to first cache out your simulation to disk with a File Cache SOP placed between the otissolver1 and the deform_skin subnet.

  3. Dive inside the deform_skin subnet.

  4. Ensure the display flag is set to cache11 and play through the entire frame range to cache the simulation to memory.

  5. If you want to enable skin sliding, select skindeform1 and toggle on Skin Sliding.

  6. If you want to enable procedural wrinkles, select switch_add_wrinkles and set the Select Input parameter to 1.

Use a different start frame.

  1. Update your frame range to the required range on the playbar. Make sure that there are some preroll frames included so that the simulation starts with the character in tpose.

  2. On the flex node:

    • Navigate to the start frame, set Blend to 0, Alt + on Blend to set a keyframe.

    • Jump a couple of frames forward (3-10 depending on your preroll length), set Blend to 1, Alt + on Blend to set a keyframe.

  3. On the otisconfiguremuscleandtissue1 node:

    • Set Reference Frame to your start frame, or $FSTART if you want to make it automatically use whatever the Frame Range start frame is set to.

    • If you have any rest length not equal to 1, key your Rest Blend attribute from 0 on the start frame to 1 a few frames later, as shown for the flex Blend above.

  4. On the otissolver1:

    • Set the Start Frame to your new start frame, or $FSTART if you want to make it automatically use whatever the Frame Range start frame is set to.

    • If you have any rest length not equal to 1, ensure that in the Target tab Rest Shape is toggled on.

  5. On the skindeform1 node inside the deform_skin subnet, set the Reference Frame to your new start frame, or $FSTART if you want to make it automatically use whatever the Frame Range start frame is set to.

Muscles and tissue

Basics

Working with muscles

Muscles recipes

Legacy Muscles (Vellum Solver)