Skip to content
All documentation pages

Minecraft skin poses: 18 named poses, joints and animation

Every Minecraft skin pose the API renders, from wave and sit to think and dab, with live images, per-joint angles, sign conventions and animation frames.

Add pose=<name> to a body or bust render. Every image below is live, rendered from /render/steve/body?size=384&pose=%3Cname%3E. Poses marked anim change with the frame parameter.

To pose a skin by clicking rather than writing the URL, the playground is an interactive skin poser: a list of every pose, a slider per joint, and the finished URL to copy.

Per-joint overrides

A named pose is just a set of six rotations (head, torso, two arms, two legs). Every one of them can be overridden with its own parameter, and an explicit joint parameter always wins over the named pose for that joint only. That lets you start from a pose you like and nudge it.

Notch waving with the plain wave pose
?pose=wave
Notch waving with the head turned 20 degrees to look at the raised arm
?pose=wave&headYaw=-20: the wave, with the head turned toward the arm.

The joint parameters follow the pattern <part><Axis>:

PartPitchYawRollShort alias
head headPitch headYaw headRoll —
torso bodyPitch bodyYaw bodyRoll —
left arm leftArmPitch leftArmYaw leftArmRoll leftArm = leftArmPitch
right arm rightArmPitch rightArmYaw rightArmRoll rightArm = rightArmPitch
left leg leftLegPitch leftLegYaw leftLegRoll leftLeg = leftLegPitch
right leg rightLegPitch rightLegYaw rightLegRoll rightLeg = rightLegPitch

The four limb aliases exist because pitch is the rotation you want 90% of the time: leftArm=45 swings the left arm 45° forward and is exactly leftArmPitch=45. The torso pivots at the hips and carries the head and arms with it, so bodyYaw=30 turns the upper body while the legs stay put.

built from scratch, no named pose
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/body?headPitch=-10&bodyYaw=10&leftArmPitch=20&rightArmPitch=-120&rightArmRoll=15

Sign conventions

All angles are in degrees (or radians with units=rad) and wrap around, so 370 is 10 and -90 is 270. Zero is the standing pose.

  • Pitch rotates about the side-to-side axis. Positive swings a limb forward, away from the body’s front; positive on the head tips it down. rightArm=90 holds the arm straight out in front, rightArm=180 points it straight up, rightArm=-90 swings it out behind.
  • Yaw twists about the vertical axis. Positive turns the part toward its own right, which is the viewer’s left when the model faces the camera.
  • Roll rotates about the front-to-back axis. For arms and legs positive moves the limb outward, away from the body, which is how tpose is built. On the head it tilts the head toward a shoulder.

These are model-space rotations: they do not change when you move the camera with yaw and pitch, which describe the view, not the pose.

Steve with the right arm pitched 90 degrees forward
rightArm=90: pitch, forward
Steve with the right arm rolled 90 degrees outward
rightArmRoll=90: roll, outward
Steve with the head twisted 45 degrees
headYaw=45: yaw, twist

Animation and frame

walk, run, dance, wave are cycles rather than fixed positions. frame is the phase of that cycle from 0 to 1; frame=0.5 is the opposite half of the stride from frame=0, and frame=1 equals frame=0. On the non-animated poses the parameter has no effect.

Steve walking, frame 0
frame=0
Steve walking, frame 0.25
frame=0.25
Steve walking, frame 0.5
frame=0.5
Steve walking, frame 0.75
frame=0.75

Set fit=false for every frame of an animation. With auto-fit on (the default) each frame is framed to fill the canvas individually, so a swinging arm changes the scale from frame to frame and the model appears to jitter. With it off the camera stays fixed.

Rendering GIF frames

Render ten frames, then assemble them with whatever GIF encoder you already use (ImageMagick, ffmpeg, Pillow, gifenc…). The API does not produce GIFs itself, only the frames.

If a GIF is not specifically what you need, one request can return the whole cycle as an animated PNG: format=apng, no encoder and no frame loop.

bash
for f in 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9; do
  curl -s -o "walk-$f.png" \
    "https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/body?pose=walk&fit=false&size=256&frame=$f"
done
# ImageMagick (frames sorted numerically; 10 fps; keep transparency)
convert -delay 10 -loop 0 -dispose previous $(ls walk-*.png | sort -V) walk.gif
python
import requests
from PIL import Image
from io import BytesIO

base = "https://skinrender.dev/render/069a79f444e94726a5befca90e38aaf5/body"
frames = []
for i in range(10):
    r = requests.get(base, params={"pose": "run", "fit": "false", "size": 256, "frame": i / 10})
    r.raise_for_status()
    frames.append(Image.open(BytesIO(r.content)).convert("RGBA"))

frames[0].save("run.gif", save_all=True, append_images=frames[1:],
               duration=80, loop=0, disposal=2, transparency=0)

Ten frames is a good default for walk and run; wave and dance look smoother with twenty. The frames are ordinary cacheable PNGs, so re-rendering a GIF later costs almost nothing.

Cape angle

Capes hang at capeAngle=10 degrees from the back by default. Raise it for movement (run looks right around 35–45) or set it to 0 so the cape hangs straight. It only matters when the profile has a cape and cape=true, which is the default.

text
https://skinrender.dev/render/853c80ef3c3749fdaa49938b674adae6/body?yaw=160&pose=run&frame=0.3&capeAngle=40

See the Minecraft skin poser guide for a longer walkthrough, or open the playground and drag the sliders.