SMPL-X Mannequin
mannequin-x provides two lightweight figures driven by SMPL-X body and hand
rotations:
armoris the repo's segmented rigid mannequin, available in three LODs.woodenis a skinned wooden mannequin at its source resolution.
Both designs accept pose dictionaries with the same fields as body-models.
Ten SMPL-X shape coefficients resize their bones and geometry. The NumPy
runtime includes the required shape calibration, so it does not need SMPL-X
model files.
pip install mannequin-x
Python API
import numpy as np
from mannequin import Mannequin
shape = np.zeros(10, dtype=np.float32)
shape[0] = 1.5
model = Mannequin("wooden", shape=shape)
pose = model.rest_pose()
pose["body_pose"][17, 2] = 0.8
vertices = model.vertices(pose)
faces = model.faces
joint_transforms = model.joint_transforms(pose)
The same methods accept the parameter dictionary returned by body-models
without renaming fields:
from body_models.smplx.numpy import SMPLX
smplx = SMPLX(model_path="SMPLX_NEUTRAL.npz", flat_hand_mean=True)
rest = smplx.get_rest_pose()
joint_transforms = model.forward_skeleton(**rest)
# Equivalent shorthand:
joint_transforms = model.joint_transforms(rest)
vertices = model.vertices(rest)
forward_skeleton() accepts the body_pose, head_pose, hand_pose,
pelvis_rotation, shape, expression, global_rotation, and
global_translation fields from body-models. rest_pose() returns those
same fields. joint_names uses the SMPL-X names Spine1, Spine2, Spine3,
L_Foot, R_Foot, L_Collar, and R_Collar. The mannequin omits the jaw and
eye joints and adds zero-length L_Hand and R_Hand skinning joints at the
wrists. It accepts but ignores head_pose and expression because neither
mannequin has the corresponding joints or geometry.
Create armor with Mannequin("armor", lod=0). Armor supports LODs 0, 1, and
2. The wooden model has one resolution, so it does not accept lod.
rest_pose() returns a mutable dictionary with the body-models fields:
body_pose:[..., 21, 3]SMPL-X body rotationshead_pose:[..., 3, 3]unused jaw and eye rotationshand_pose:[..., 30, 3]left and right hand rotationsglobal_rotation:[..., 3]world rotationpelvis_rotation:[..., 3]pelvis rotation about the pelvis jointglobal_translation:[..., 3]world translationshape:[..., 10]mannequin shape coefficientsexpression:[..., 10]unused expression coefficients
global_rotation rotates the whole figure around the SMPL-X origin.
pelvis_rotation rotates the body around the pelvis without moving the pelvis.
Rotations use axis-angle vectors. Leading batch dimensions are supported.
Shape is identity state, not motion state. Set it at construction or call
model.reshape(shape). Pose evaluation then stays concise:
model.reshape(new_shape)
vertices = model.vertices(pose)
links = model.link_transforms(pose)
Viser
Install the optional viewer dependency with pip install mannequin-x[viser].
import viser
from mannequin import Mannequin, add_to_scene
server = viser.ViserServer()
model = Mannequin("wooden")
handle = add_to_scene(server.scene, "/mannequin", model)
handle.set_pose(model.rest_pose())
handle.set_position((1.0, 0.0, 0.0))
handle.set_shape(new_shape)
handle.set_palette("sage")
Pass one of sand, ivory, charcoal, sage, clay, slate, or wood to
add_to_scene(..., palette=...) or handle.set_palette(...).
Wooden meshes use Viser's native add_mesh_skinned(), so pose updates send
bone transforms instead of vertex buffers.
Run the live comparison against a local neutral SMPL-X model:
uv run python examples/compare.py /path/to/SMPLX_NEUTRAL.npz
The viewer shows armor, wooden, and full SMPL-X figures with matched motion, random hand poses, shape controls, front and side views, a T-pose button, and a shared palette. The SMPL-X file remains external to the package.
three.js
authoring/export_glb.py exports rigid armor as a nested GLB joint hierarchy.
The root extras contain the SMPL-X body and hand parameter mapping. See
examples/threejs.html.
Assets
The editable armor source is authoring/mannequin.blend.
src/mannequin/assets/wooden.npz retains its source vertices and skin weights,
converts coordinates, triangulates faces, and maps 52 source bones onto this
package's joint hierarchy. Rebuild it with authoring/import_wooden.py.
authoring/bake_calibration.py uses the NumPy SMPL-X implementation from
body-models to bake the joint, ground-plane, head, and height response for the
first ten shape coefficients. Pass it a local SMPLX_NEUTRAL.npz; the runtime
does not depend on body-models or the SMPL-X file. The wooden torso keeps its
source proportions.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mannequin_x-0.2.1.tar.gz.
File metadata
- Download URL: mannequin_x-0.2.1.tar.gz
- Upload date:
- Size: 1.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e67118fbfa9e0d3e1a53ef191f7acd81e661f19c4ebce81d0ed3ae607f70685
|
|
| MD5 |
a8d1795c342be2d0510c31f8781842a6
|
|
| BLAKE2b-256 |
f38b1cab1f1fe0de9d1ce91035e47236609a95fb2e3dd8221869f7faba39729b
|
File details
Details for the file mannequin_x-0.2.1-py3-none-any.whl.
File metadata
- Download URL: mannequin_x-0.2.1-py3-none-any.whl
- Upload date:
- Size: 1.4 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd4ef3bfd7a5ec831ffab0b4762a6070f8ab3c26f1f4a4ac91e472e07f872b85
|
|
| MD5 |
89d13c6b898662c7245a50e62c53bd8f
|
|
| BLAKE2b-256 |
d6b8527af9c617dde3def48d99bb61a5c4ea7ec62a6315f6fdb9f247ea3ac415
|