Create a Freeze-Frame Avatar Pose in VRChat

A freeze-frame avatar effect is normally a full-body animation that temporarily replaces VRChat's tracked pose. Build it in the Action Playable Layer, switch the relevant tracking points to Animation, and provide an exit state that restores tracking and locomotion.

Freezing an attached prop in world space is a different effect. Use a VRC Parent Constraint with Freeze To World for that job rather than applying a large network of Constraints to the humanoid skeleton.

Freeze the Pose, Then Restore Every Control

The effect needs an authored pose, Action Layer blend, tracking override, optional locomotion lock, and a complete exit state.

  1. Create a full-body pose animation clip.
  2. Play it from a dedicated Action Layer state.
  3. Set the required Tracking Control points to Animation.
  4. Optionally disable joystick locomotion while the pose is active.
  5. Return tracking, locomotion, and Action Layer weight when the effect ends.
Tracking overrides persist

Animator Tracking Control remains in its last assigned mode until another state changes it. Every freeze-frame setup needs an explicit reset state that returns the affected body parts to Tracking.

Choose the Intended Effect

Effect Supported approach
Hold the avatar in an authored body pose Action animation plus Animator Tracking Control.
Stop joystick locomotion during the pose Animator Locomotion Control.
Move the viewpoint for a crouched or lying pose Animator Temporary Pose Space, used only for a genuine posture change.
Keep an attached prop fixed in world space VRC Parent Constraint with Freeze To World.
Stop eye movement or lip sync as part of the frame Set Eyes/Eyelids or Mouth/Jaw to Animation with Tracking Control.

The avatar root and player capsule remain part of VRChat's player system. Treat the avatar freeze-frame as a controlled animation state rather than a way to reposition or detach the player.

Create the Freeze Pose

Make a dedicated animation clip for the held frame.

  1. Duplicate the avatar scene or work in a safe animation scene.
  2. Create a new animation clip, such as FreezePose.anim.
  3. Pose the hips, spine, chest, head, arms, hands, legs, and feet.
  4. Add finger and facial animation only when the held frame requires them.
  5. Key the pose at the beginning and end of a short clip so it remains stable.
  6. Preview the pose against the avatar's normal proportions and viewpoint.

For a humanoid avatar, author the clip as a humanoid animation where appropriate. Confirm the avatar's rig is configured correctly before recording the pose.

Avoid recording unrelated objects, materials, PhysBones, or components into the pose clip. Those effects belong in the FX layer or their own dedicated systems.

Build the Action Controller States

VRChat's Action Playable Layer is intended for full animation overrides. Its layer weight is zero by default, so the controller must deliberately blend it up and back down.

A compact state flow is:

Wait
  └── Enter Freeze
        └── Hold Freeze
              └── Exit Freeze
                    └── Wait

Use the states as follows:

State Responsibility
Wait Default state with the Action Layer returned to weight zero.
Enter Freeze Blend the Action Layer up and switch tracking or locomotion controls.
Hold Freeze Play the freeze pose for as long as the toggle remains active.
Exit Freeze Restore tracking and locomotion, then blend the Action Layer down.

Do not leave an animator branch without an exit. VRChat warns that animator parameters can change, so states should have a valid path back to the normal avatar state.

Blend the Action Layer

Add VRC Playable Layer Control to the entry and exit states.

For entry:

  • Layer: Action
  • Goal Weight: 1
  • Blend Duration: a short transition suited to the pose

For exit:

  • Layer: Action
  • Goal Weight: 0
  • Blend Duration: a matching or slightly shorter transition

The Action layer should return to zero when the effect ends. If the state is exited during a blend, VRChat applies the target layer weight immediately, so test rapid toggle changes as well as normal transitions.

Override IK with Tracking Control

Add VRC Animator Tracking Control to the freeze entry or hold state. Set each body part based on the effect:

Tracking point Set to Animation when…
Head The animation must hold the head direction.
Left Hand The left arm and hand must stay in the authored pose.
Right Hand The right arm and hand must stay in the authored pose.
Hip The animation must override a full-body tracked hip.
Left Foot The left leg and foot must remain in the pose.
Right Foot The right leg and foot must remain in the pose.
Eyes & Eyelids Eye movement and blinking should stop.
Mouth & Jaw Visemes should stop and the animation should control the mouth.

Use No Change for anything the effect should not alter.

In the exit state, add another Tracking Control and set every overridden point back to Tracking. Desktop and three-point VR use the head and hands as tracked points, while full-body configurations can also use the hip and feet.

Decide Whether to Disable Locomotion

Add VRC Animator Locomotion Control when joystick movement should stop during the freeze.

  • Set Disable Locomotion to True on entry.
  • Set it to False on exit.

VRChat documents that this freezes the player's capsule for controller locomotion. Room-scale movement can still occur, and full-body tracking behaviour differs from half-body IK, so test the effect with the intended tracking setup.

If the pose should move with the player like a rigid statue, leave locomotion enabled. The avatar will keep the authored pose while the player moves through the world.

Use Temporary Pose Space Only for Posture Changes

Use VRC Animator Temporary Pose Space when a freeze pose genuinely changes the wearer's posture, such as lying down or crouching, and the viewpoint needs to move to the animated head position.

Configure a state to enter pose space after the animation reaches its target posture, then add a later state that exits pose space.

Do not use Temporary Pose Space to scale an avatar. VRChat warns that this produces major problems. The state also must remain active long enough for its configured delay to execute.

Add an Expression Toggle

Create a Bool expression parameter, such as FreezePose, and add it to an Expression Menu toggle.

Use transitions such as:

  • FreezePose == true: enter the freeze sequence
  • FreezePose == false: enter the reset sequence

Keep the parameter name identical in:

  • the Expression Parameters asset
  • the Expression Menu control
  • the Action controller
  • any FX controller state used for visual effects

Choose a default value that matches the avatar's initial state. The avatar should load unfrozen unless there is a deliberate reason for the pose to be active immediately.

Add Visual Effects Separately

Use the FX Playable Layer for non-transform effects that accompany the frame:

  • enabling or disabling a prop
  • material or shader changes
  • blend shapes
  • particle systems
  • Constraint properties on a separate prop

Do not record humanoid bone transforms into FX. The Action layer should own the body pose, while FX owns non-transform presentation changes.

Freeze an Attached Prop in World Space

For a prop that should stay behind when the avatar moves away:

  1. Put the visible prop under a dedicated PropRoot.
  2. Add VRC Parent Constraint to PropRoot.
  3. Add the normal attachment transform, such as a hand, as its source.
  4. Position the prop and use Activate to preserve its offset.
  5. Enable all required position and rotation axes.
  6. Animate Freeze To World from False to True when dropping the prop.
  7. Set it back to False when the prop should follow its source again.

Freeze To World ignores the Constraint's sources and actively keeps the selected axes fixed in world space. Disabling the Constraint is different: the object stops being solved in local space but still follows its parent hierarchy.

Use Rebake Offsets When Unfrozen when the prop should calculate a new offset from its source as it returns. Test both choices because keeping the original offset and rebaking produce different pickup behaviour.

Freeze To World is for a constrained transform, not the whole humanoid rig

Use it for props or isolated helpers. A full-body avatar freeze should use an authored Action animation and Tracking Control instead of a Constraint on every humanoid bone.

Keep the Animator Predictable

Follow these checks:

  • use Animation Controllers only in Playable Layer slots
  • do not reuse one controller in multiple Playable Layers
  • keep Write Defaults usage consistent across the avatar
  • give every state a motion clip when using Write Defaults Off
  • animate reset values explicitly when needed
  • restore Action weight, tracking, locomotion, and pose space on every exit path
  • keep body transforms out of FX

VRChat's examples use Write Defaults Off. Mixed Write Defaults can produce unexpected property values and triggers an SDK warning.

Test Every Tracking Mode

Build and test locally in VRChat.

Check:

  • desktop head and hand simulation
  • three-point VR tracking
  • full-body hip and foot tracking
  • room-scale movement while locomotion is disabled
  • rapid toggling during entry and exit blends
  • eyes, blinking, mouth, and visemes
  • viewpoint position in crouched or lying poses
  • remote appearance when all tracking points use Animation
  • prop Freeze To World and offset rebaking

The freeze can look different to remote users when only some tracking points are overridden. Test with the intended balance between live tracking and animation rather than assuming the Unity preview represents networked IK.

Troubleshooting

The avatar still follows my head or controllers.

Check Animator Tracking Control in the active freeze state. Set each body part that must hold the authored pose to Animation, and confirm that a later state is not immediately returning it to Tracking.

The avatar remains frozen after the toggle is off.

Tracking, locomotion, and playable-layer weights persist until another state changes them. Verify the exit path sets tracking points to Tracking, enables locomotion, exits pose space when used, and returns Action weight to zero.

The pose plays but normal locomotion animations remain visible.

Confirm the Action Playable Layer is blended to weight 1 and that the freeze clip contains the required body pose. Use an appropriate Avatar Mask if the Action controller has multiple layers.

The viewpoint stays at standing height during a lying pose.

Add Animator Temporary Pose Space for the genuine posture change, enter it after the pose reaches its target, and add a reliable exit state. Do not use Pose Space to scale the avatar.

The mouth or eyes keep moving during the frame.

Set Eyes and Eyelids or Mouth and Jaw to Animation in Tracking Control and include the required values in the pose. Restore them to Tracking when the freeze ends so blinking and visemes resume.

Locomotion is disabled but I can still move in room scale.

This matches VRChat's documented behaviour: Locomotion Control freezes controller locomotion, while room-scale movement can still occur. Design the pose with that limitation and test it in VR.

The frozen prop moves with the avatar.

Confirm the VRC Parent Constraint remains active and Freeze To World is enabled. Select all position and rotation axes that must stay fixed; unselected axes continue to follow normal Constraint behaviour.

The prop jumps when Freeze To World is released.

Review Rebake Offsets When Unfrozen. Enable it when the prop should calculate a new source offset on release, or disable it when the original attachment offset should be restored.

Freeze-Frame Checklist

  • The held frame is a dedicated full-body animation clip.
  • The Action layer blends to one on entry and zero on exit.
  • Required tracking points switch to Animation.
  • Every overridden tracking point returns to Tracking.
  • Locomotion is disabled and restored only when intended.
  • Temporary Pose Space is limited to genuine posture changes.
  • FX contains presentation effects rather than humanoid transforms.
  • Write Defaults usage remains consistent.
  • Prop Freeze To World uses a separate VRC Parent Constraint.
  • Desktop, VR, full-body, remote, and rapid-toggle cases are tested.

Official References

Related Guides