Cloth Simulation

From Valve Developer Community
Revision as of 12:33, 28 February 2020 by Rectus (talk | contribs) (Source 2)

Jump to: navigation, search

Cloth physics simulation provides a way of simulating deforming fabric on models. The Source 2 physics engine features support for cloth simulation.

Note:This system is largely undocumented and not much official information is available.

Engine Support

Source

The original Source version of Dota 2 included a legacy cloth simulation system. The cloth systems in Source 2 appear to be backwards compatible with it.

Source 2

Cloth is used in Dota 2 mainly for character clothing. It is also used in a single instance in SteamVR Home, the defeated boxbot model in the official Boxing Ring environment.

The model editor in the current toolsets has limited support for authoring cloth. The unreleased ModelDoc in-engine tool appears to supersede it, although its capabilities are unknown. Valves workflow appears to use Maya or Modo to paint per-vertex attributes to meshes. The DMX model format can be used to import these attributes into the engine tools.

To do: There may be per-mesh or per-bone attributes as well.

The cloth system appears to have received significant upgrades after the initial Dota 2 implementation, including collision with world meshes. Old versions of the Source 2 tools include help files for the model editor that document many of the cloth features. These help files were removed with an update that changed the tool help file format. Converted versions of the help files can be obtained here.

To do: Jigglebones in Source 2 appear to be implemented with cloth simulation.

To do: Keyvalues in the .vmdl file suggest other softbody systems exist.

Bug: In SteamVR Home, cloth will stop simulating after a half second unless an animation is playing on the model.

Features

Known features include:

  • Can drive meshes either directly, through a proxy mesh or through manually set up nodes.
  • Supports collision with other objects: Spheres and capsules, convex hulls, and even arbitrary meshes are supported.
  • To do: Self collision within the cloth does not seem possible.
  • Supports wind from env_wind
  • Pressure forces
  • Volumetric solver
  • Cloth can be driven from animations
  • Bend and stretch springs To do: Shear springs may exist.

How it works

A cloth piece consists of a set of cloth nodes connected together with quads and rods. Quads connect four nodes together and act as cloth surfaces, while rods connect two nodes and act as stiff rods or ropes.

The cloth nodes can drive bones in the model skeleton, which in turn drive the render mesh. Apart from manually setting up nodes and bones, the model compiler can generate cloth procedurally from attributes painted on the vertices of a mesh. The compiler will then generate a cloth node and a bone on each vertex with cloth enabled.

The attributes can be painted directly onto the render mesh, but also onto a separate cloth proxy mesh. The cloth will them be generated from the vertices of the proxy mesh instead. The proxy mesh can automatically skin and drive the render mesh, or both meshes can be skinned to the same skeleton and the joints back-driven from the cloth. This can be used if the render mesh doesn't have good topology to support cloth, or to make a simpler more performant cloth setup.

To do: It appears possible to attach physics colliders to bones driven by cloth. Can it be used to have cloth affect other objects and/or receive feedback through the collider?

To do: Cloth parameters can be modified with animation events. The command syntax is undocumented.

External tools

Note:Many of the features are still undocumented. No official best-practices are available.

Cloth attributes can be painted on with an external modeling tool. A plugin is required to export a mesh with the attributes.

Valves plugins have not been released, but an experimental fork of the Blender Source Tools addon capable of exporting DMX vertex attributes is available here.

Ways of adding cloth

To edit cloth properties, a collision file is needed in the model. In the model editor, right click Cloth (Compiled) or (NULL Collision if no cloth was generated) in the outliner, and choose New Collision. An item for cloth settings will now be available, as well as several more right-click options.

Warning: Many of the commands and options may crash the tools. Make sure to save often.

Paint onto render mesh

Paint the cloth_enable attribute onto vertices to be simulated.

The by default a hidden setting in the model forces back-solving to be used. To enable cloth processing on the render mesh, open the .vmdl file of the model in a text editor, navigate to the m_clothProxyMeshList category and set m_bDriveMeshesWithBacksolvedJointsOnly = false

Pros

  • Relatively simple

Cons

  • Expensive on high poly meshes
  • Requires planned mesh topology


Auto-match render mesh to proxy mesh

Author a proxy mesh and paint the cloth_enable attribute onto it.

To show the cloth proxy mesh category in the model editor, edit the .vmdl file navigate to the m_clothProxyMeshList category and add a set of curly brackets inside the square brackets of the m_clothProxyMeshList key inside. It should look like: m_clothProxyMeshList = [ {} ]

To make the auto matching work, add the proxy mesh to the proxy list, and uncheck all the back-solve options. Note that both meshes need to be skinned to the same skeleton to be matched.

Pros

  • Auto-matches render mesh to cloth

Cons

  • May not match well in all cases

Back-solve mutual bones on proxy mesh to drive render mesh

Enable either of the back-solving options for the proxy mesh.

Pros

  • Gives good control on how the render mesh deforms

Cons

  • Only deforms mesh from existing bones


Add cloth piece on predefined bones

Create a grid of bones in an external modeling tool. It is recommended to keep a good naming conversion.

Right click the collision properties and choose 'Add Cloth Piece'. Use the UI to select bones set up the cloth.

Pros

  • Might be a good way to add ropes

Cons

  • Hard to use UI
  • Many features missing or undocumented
  • Bones have to be in a grid pattern and oriented right
  • Tools will crash when misconfigured


Manually add nodes on predefined bones

Use the cloth properties to add nodes manually. It is recommended to turn off AutoComp while doing this.

Pros

  • Exact control over topology

Cons

  • Extremely hard to use UI
  • Many features missing or undocumented
  • Tools will crash when misconfigured


Author it in ModelDoc?

Wait for Valve to release the tool (this may take a long time).

Pros

  • Added more recently than other methods

Cons

  • May not be a complete way to author cloth
  • Unavailable for mortals

Using models with cloth

SteamVR Home

Only the prop_dynamic entity class seems to work properly with cloth, although it can be parented to other entities. To do: The entity may have to be parented to a bone of the parent entity in order not to crash.

Bug: The prop needs to have an animation playing at all times for the cloth not to sleep and reset. The animation does not need to move any of the existing bones though, so any animation file with multiple frames can be added and set to loop for models that do not already have animations.