Vertex animation

From Valve Developer Community
Jump to: navigation, search

Vertex animation is the keyframed animation of individual vertices of a mesh. It's good for very complicated motion like that of cloth, hair, or water. It uses a flex controller bone to move the model through a series of flexes (one for each frame).

Vertex animation was added in Alien Swarm and is available in all games that branch from it, including Portal 2, Counter-Strike: Global Offensive, Source Filmmaker, and Dota 2. To do: Check if vertex animation was actually added in L4D or L4D2

Bug:
Using the $scale command breaks vertex animation.


Implementation

Template:TODO: CLEANUP! OUTDATED!

  1. Create a vertex animation in your modelling tool.
  2. Export a Vertex Cache file. Currently only the official Maya exporter can do this, and only to SMD.
  3. Add the vcafile command to your $model block (see example below).

Template:Note: DMX does not require a vertex cache file, so if you're using DMX ignore these two steps. The vertex animation data can be exported by Blender Source Tools to DMX.

This produces two flex controllers named after your VCA file. The first defines the blend weight of the animation, the second (prefixed with multi_) defines the active frame.

A programmer can now control your animation. If you need to map the vertex animation to a standard animation sequence, perform these extra steps:

  1. Add a new bone which will drive the vertex animation. It doesn't need to have any vertices attached.
  2. Add two $boneflexdriver commands to bind your vertex animation to the new bone (see example).
  3. Add at least one $sequence in which the new bone is animated in its X and Y axes. Its X position defines the blend weight of the vertex animation (0-1), and its Y position defines the frame of vertex animation (0-1).
    Bug:
    Currently the flex driver sequence must be defined with $upaxis Y. This doesn't affect the rest of the model.

Example

$model "body" "ref_mesh.smd" {
	vcafile "vertex_animation.vta"
}

// Optional:

$boneflexdriver "flexAnimBone" tx "vertex_animation" 0 1
$boneflexdriver "flexAnimBone" ty "multi_vertex_animation" 0 1

$upaxis Y // currently flex driver sequences must be Y-up
$sequence "vertex_animation" "flexAnimBone_anim.smd"

Example Videos

See also