Skip to content

Poses & Emotes

This page describes named poses, and how humanoid emotes map onto a rig. Rig files are described on Rigs.

poses applies additive bone transforms for named states.

"poses": {
"crouch": [
{
"bone": "body1",
"offset": [0, 1.5, 0]
},
{
"bone": "right_front_leg",
"offset": [0, 1.5, 0],
"rotation": [0, 0, 25]
},
{
"bone": "left_front_leg",
"offset": [0, 1.5, 0],
"rotation": [0, 0, -25]
}
]
}
Pose FieldTypeRequiredNotes
bonestringyesBone to modify.
offsetnumber arraynoAdditive offset in model pixels.
rotationnumber arraynoAdditive rotation in degrees.

Townstead reads these pose names:

PoseWhen Townstead applies it
crouchThe body crouches.
sleepThe body sleeps.
crawlThe body swims or crawls.
neutralAlways. It corrects the rest pose. See Neutral Pose.

Townstead blends into crouch, sleep, and crawl over a few ticks, and blends out again when the state ends.

A pose can be a list of bones, as above, or an object with bones and a whole-body body transform:

"poses": {
"crawl": {
"body": { "pitch": 80, "offset": [0, -4, 0] },
"bones": [
{ "bone": "head", "rotation": [-70, 0, 0] }
]
}
}
body FieldDefaultNotes
yaw, pitch, roll0Degrees. For sleep, they turn the body on the bed. See Sleep Orientation. For crawl, Townstead adds them to the upright stance. The crouch pose does not use them.
offset[0, 0, 0]Moves the whole body, in model pixels. It works for crouch, sleep, and crawl.

The neutral pose uses only bones.

The neutral pose corrects the rest pose of the model. Townstead applies it every frame, after the model resets its bones and before clips play. Like clips, it works on a geometry model, an entity layer with a class, and minecraft:spider. Use it when a model from another mod rests in an odd position, for example arms that point forward:

"poses": {
"neutral": [
{ "bone": "right_arm", "rotation": [-20, 0, 0] },
{ "bone": "left_arm", "rotation": [-20, 0, 0] }
]
}

emote describes how humanoid-authored Emotecraft-style motion maps onto this rig. Humanoid rigs usually do not need an emote block. Non-humanoid rigs can use it to decide which humanoid channels they can express and which emotes should be refused.

"emote": {
"body_motion": {
"scale": 0.5,
"floor": -0.25
},
"channels": {
"head": {
"bone": "head"
},
"right_arm": {
"bone": "right_front_leg",
"mode": "additive",
"axis": ["x", "y", "z"],
"gain": [0.0, 0.3, 0.55],
"clamp": {
"z": [-100, 100]
},
"also": [
{
"bone": "right_middle_front_leg",
"gain": [0.0, 0.15, 0.3]
}
]
},
"left_arm": {
"mirror": true
}
},
"policy": {
"min_coverage": 0.5,
"deny": ["kazotsky"]
}
}

body_motion controls whole-body lift, drop, and rotation from the source emote.

FormMeaning
falseSuppress whole-body motion.
trueUse full humanoid body motion.
objectUse scale and optional floor.

Object fields:

FieldTypeNotes
scalenumberMultiplies whole-body motion. 0 suppresses it, 1 keeps it full.
floornumberLowest allowed downward movement in blocks. Useful for low bodies that should not sink under the floor.

Each channels entry maps a humanoid emote channel to one rig bone.

FieldTypeRequiredNotes
bonestringnoTarget rig bone. Defaults to the channel name.
modestringnoabsolute or additive. Defaults to absolute.
axisstring arraynoAxis remap such as ["z", "x", "-y"]. Defaults to ["x", "y", "z"].
eulernumber arraynoExtra rotation in degrees after remapping.
gainnumber arraynoPer-axis multiplier. Defaults to [1, 1, 1].
translationbooleannoWhether translation is used for this channel. Defaults to false.
clampobjectnoPer-axis degree limits.
alsoarraynoAdditional bones driven by the same channel with their own gain.
bendbooleannoApplies segment bend for limb-like bones. Defaults to false.
bend_gainnumbernoBend multiplier. Defaults to 1.
mirrorbooleannoCopies the opposite side channel and swaps left/right bone names.

Use additive when a humanoid limb is being interpreted by a different kind of bone, such as a spider leg. Use absolute when the target bone behaves like the source channel.

axis entries can be x, y, z, or a negative form such as -x.

Clamp example:

"clamp": {
"z": [-90, 90]
}

Fan-out example:

"also": [
{
"bone": "right_middle_front_leg",
"gain": [0.0, 0.15, 0.3]
}
]

policy controls which emotes the rig is willing to play.

FieldTypeNotes
min_coveragenumberMinimum share of emote motion that must land on expressible channels. Defaults to 0.
fallbackstringEmote id or name to use when a refused emote needs a substitute.
allowstring arrayEmote ids or names that are allowed.
denystring arrayEmote ids or names that are refused.

allow and deny match an emote path or display name case-insensitively.