Cam Shot Toolkit: Save Pose Rig
Save a pose once, reuse it in a thousand synthetic shots
- mesh_data
- model
- skeleton
- reference_image
- rig_dir
- rig_entry_json
Reconstructing a human mesh from a single photo is slow, and doing it every time you want a pose reference is a waste of your afternoon. Save Pose Rig is the archiving step in the Cam Shot Toolkit's posing group: it takes the mesh that comes out of the pack's SAM3D processing chain and files it away as a named, reusable "rig" - a rigged .glb plus an entry in a rig.json index. Next run, you don't re-reconstruct the person; you Load the rig and reuse the pose.
The bigger picture first. This pack is EnviralDesign's focused extraction of the SAM3D-Body ecosystem - Meta's SAM 3D Body model, which landed November 2025 and recovers a full articulated human mesh from one image, wrapped for ComfyUI by Pozzetti's ComfyUI-SAM3DBody. These posing nodes exist to turn those reconstructions into a library of gestures, then procedurally assemble synthetic pose-reference scenes from it. Save is where a single good reconstruction becomes part of that library.
What it writes
Give it a mesh_data (SAM3D_OUTPUT, from the pack's Process Image node) and a label, and it does the following:
- Extracts the person meshes and anchors them feet-on-the-floor with +Y up - so the GLB opens standing on a ground plane in Blender, not floating mid-air.
- Rigs them, if you want:
riggingacceptsauto(armature + skin binding),skeleton_only, ornone- same semantics as the pack's Save Meshes (GLB) node. - Writes
<set>/<label>.glband records arig.jsonentry carrying the actorcount, footprint and bounding box, capture camera (focal, aspect, image size) and a SHA-256 of the source image when you connectreference_image.
The label matters - it becomes the rig id and file name, and it's the gesture the whole pipeline keys on (think wave, star_jump, 01_turn). It gets sanitized through safe_rig_id: alphanumerics and -_ . survive, everything else becomes an underscore, and it must contain at least one alphanumeric character or the node throws. So give it a real name, not an empty string.
Inputs and outputs worth knowing
Required: mesh_data, label, rig_set (folder, default pose_rigs/default - relative paths live under the ComfyUI output folder), count (actor count for this gesture; 0 = however many people were reconstructed), rigging. Optional: model (a SAM3D_MODEL, for real skin weights and joint hierarchy from the MHR model), skeleton (joint parent hierarchy for the armature), and reference_image (records the capture camera and source hash - worth connecting if you want provenance in your dataset).
It returns rig_dir (the folder the rig landed in) and rig_entry_json (the full entry). It's an output node, so you also get a text readout of the path it wrote.
Install
ComfyUI Manager (search sam3d-body-comfyUI-camshottoolkit) or:
cd ComfyUI/custom_nodes
git clone https://github.com/EnviralDesign/sam3d-body-comfyUI-camshottoolkit
cd sam3d-body-comfyUI-camshottoolkit
python -m pip install -r requirements.txt
Restart ComfyUI after installing. Note that this node is the upstream-heavy end of the pack: the first time you run the SAM3D loader, weights auto-download into ComfyUI/models/sam3dbody (and the person detector into ComfyUI/models/sam3_person_detector, trying the gated facebook/sam3 first and falling back to an ungated mirror). Those downloads are one-time, but they're the reason the first run feels slow.
Gotchas
The most common failure here isn't in this node - it's upstream. If you haven't actually run the SAM3D pipeline (Load SAM3D Model → Load SAM3 Person Detector → Process Image), there's no SAM3D_OUTPUT to feed in, and "No mesh vertices/faces found in mesh_data" is the honest result. Reconstruct first, save second.
The good news about the GLB end: the rigged export is meant to open in Blender, so if you want to eyeball what you archived, that's the place - a human mesh reconstructed from one photo is never production topology, but as a pose reference asset it's exactly what the rest of this pack expects.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| mesh_data | SAM3D_OUTPUT | Mesh data from the SAM3D process node. | |
| label | STRING | Gesture label this rig stands for (becomes the rig id and file name). | |
| rig_set | STRING | pose_rigs/default | Rig set folder. Relative paths live under the ComfyUI output folder. |
| count | INT | 00–32 | Actor count for this gesture. 0 = number of reconstructed people. |
| rigging | COMBO | auto | Same as Save Meshes (GLB): armature + skin binding, armature only, or plain mesh. |
| modelopt | SAM3D_MODEL | Optional. Real skin weights / joint hierarchy from the MHR model. | |
| skeletonopt | SKELETON | Optional. Joint parent hierarchy for the armature. | |
| reference_imageopt | IMAGE | The image the reconstruction came from. Records the capture camera (focal, size) and the source hash in rig.json. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| rig_dir | STRING | — |
| rig_entry_json | STRING | — |