Mesh Symmetry Snap
Nudging an almost-symmetric mesh the rest of the way
- BPY_OBJ
- BPY_OBJ
Mesh_Symmetrize, its sibling node in this pack, is a sledgehammer: it deletes one side of your mesh and rebuilds it as a mirror of the other. Mesh_SymmetrySnap is the version you reach for when you don't need that - when your mesh is already basically symmetric and you just need the last few stray vertices nudged into place.
What it is and why you'd reach for it
This wraps Blender's bpy.ops.mesh.symmetry_snap() directly - Avatar Graph runs actual Blender via the bpy package inside ComfyUI, and this node, like the rest of the Mesh_* family, is a thin pass-through to that operator. Instead of replacing geometry, it finds vertex pairs that are close to being mirror images of each other across your chosen axis and moves them toward matching positions. Topology stays exactly as it was; only positions shift.
That distinction matters in the Avatar Graph pipeline. A mesh generated from a 2D character image is usually nearly symmetric already - the source art was drawn roughly straight, the segmentation was roughly centered - but "roughly" leaves small mismatches that read badly once you animate blink or mouth shapes. Full Symmetrize is overkill and risks losing intentional asymmetry; SymmetrySnap is the polish pass for a mesh that's 95% of the way there.
Inputs and outputs that matter
BPY_OBJ(optional) - the mesh from upstream.direction(enum: NEGATIVE_X, POSITIVE_X, NEGATIVE_Y, POSITIVE_Y, NEGATIVE_Z, POSITIVE_Z) - the axis and side pairs are measured across.threshold(float, default 0.05, 0–10) - the maximum distance for two vertices to be considered a mirror pair. Too tight and stray vertices don't get matched at all; too loose and unrelated vertices on opposite sides get incorrectly paired and snapped.factor(float, default 0.5, 0–1) - how far each vertex moves toward its mirror partner. 0.5 meets in the middle; 1 pulls fully to the paired position; lower values are a gentler nudge.use_center(bool, default True) - whether vertices sitting right on the center-line get pulled exactly onto the axis, which is usually what you want for a seam that's supposed to sit dead-center.
Output: a single BPY_OBJ, positions adjusted, same topology.
As with every mesh-editing node here, it only acts on the currently selected verts - select the region (or the whole mesh) upstream before running it.
Installing Avatar Graph
bpy is the whole foundation of this pack and it only has wheels for Python 3.10.x, so lock that down first.
ComfyUI Manager: search avatar-graph-comfyui, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui.git
cd avatar-graph-comfyui
python -m pip install -r requirements.txt
Restart with python main.py --enable-cors-header (--force-fp16 on Mac too). Windows gets a prebuilt Python 3.10 bundle from the README; macOS/Linux is pointed at a dedicated conda create --name comfyui python=3.10.
Common issues
Nothing visibly changes. Either nothing's selected upstream, or threshold is too tight to catch the mismatched pairs you're trying to fix - widen it a little and try again.
Vertices on the far side of the mesh get dragged wrong. threshold set too loose can pair vertices that aren't actually mirror counterparts. Tighten it back down.
Nodes don't show up in the menu at all. Check python --version - outside 3.10.x, bpy fails to import and the entire pack silently fails to load.
No live editor preview. That's --enable-cors-header missing from your launch command; without it you still get a working graph and can export the final result via right-click → Save File on Avatar Main Output, you just lose the real-time editor.avatech.ai panel.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| directionopt | COMBO | 6 options: NEGATIVE_X, POSITIVE_X, NEGATIVE_Y, POSITIVE_Y, NEGATIVE_Z, POSITIVE_Z | |
| thresholdopt | FLOAT | 0.050–10 | — |
| factoropt | FLOAT | 0.500–1 | — |
| use_centeropt | BOOLEAN | true | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |