Symmetryflow

Dev.Luv Studios in Rigging


USER MANUAL · v3.3.0

SymmetryFlow

What every button and checkbox does, when to use it, and when to leave it alone – in plain English.

Blender 3.6 – 5.1 3D Viewport → N → SymmetryFlow GPL-2.0-or-later

⚠ Not compatible with Blender 5.0.0 or 5.0.1. A bug in those two Blender releases crashes Blender itself. It was fixed in 5.1 – use 5.1+, or 4.2 LTS, 4.4 or 4.5.
Which download?
Blender 4.2 or newer → SymmetryFlow v3.3.0 (Blender 4.2+).zip
Blender 3.6, 4.0, 4.1 → SymmetryFlow v3.3.0 (Blender 3.6-4.1).zip
Tested on 3.6 LTS, 4.0.0, 4.2.9 LTS, 4.4.0, 4.4.3, 4.5.0 and 5.1.2. Also in the download: README.txt, Known issues and workarounds.txt, CHANGELOG.txt.
CONTENTS
  1. The idea in one minute
  2. Quick start
  3. The buttons
  4. The checkboxes (settings)
  5. Reading the panel
  6. Quick Fix: what happens when you press it
  7. Run Diagnostics
  8. How group names are paired
  9. How fast it is
  10. Things it cannot do
  11. Recipes for common jobs

1  The idea in one minute

A character's skin weights say how much each bone moves each vertex. They live in vertex groups, usually in left/right pairs: Arm.L and Arm.R, Thigh_L and Thigh_R. You paint one side, then want the other side to match.

Blender's own mirror only works when every vertex has an exact twin at the mirrored position. Real characters often don't: posed rigs, shape keys, split face shells, assembled parts, lashes, lips and teeth all break it.

SymmetryFlow copies weights across anyway, and then checks the result – pair by pair – and tells you whether the two sides really match. If they don't, a Quick Fix button repairs them.

It finds each vertex's twin in one of two ways:

🔗 By the mesh's edges ("topology")
Follows how the vertices are connected. Works even when the character is posed, because the connections stay the same when the arms move. Needs the mesh to be built the same way on both sides.
📍 By position ("spatial")
Looks for the vertex sitting at the mirrored position. Works on meshes that weren't built symmetrically: separate pieces, imported parts, uneven edge flow.

You don't have to choose. With the default settings, SymmetryFlow tests each group and picks the method that works for it.

2  Quick start

  1. Select your character mesh. Weight Paint or Object mode both work.
  2. Open the SymmetryFlow tab in the sidebar (N).
  3. Click the vertex group you want to copy from, so it's the active group.
  4. Click Mirror Active Group. Its opposite-side group now matches it.
  5. Look at the L/R Balance box. Any pair marked Mismatched has a Quick Fix button.

To rebuild a whole side at once (say, after deleting every left-side group), click Mirror All L/R Groups instead.

💡 One thing to know: after Mirror Active Group, the group it just wrote becomes the active group, so you're looking at the result. Clicking the button again therefore copies back the other way. Always click the group you want to copy from just before you press the button.

3  The buttons

At the top of Mirror Operations you pick a Mode:

Group to Counterpart DEFAULT
Copy one group onto its opposite-side partner, e.g. Arm.L → Arm.R.
Symmetrize Single Group
Make one group symmetric onto itself – for groups in the middle of the body that cover both sides: head, spine, pelvis, a strip of eyelashes.

You also pick the Axis (X, Y or Z – X is left/right and almost always what you want). In Symmetrize Single Group mode you also pick the Direction: which half gets copied onto the other.

🪞 Mirroring

Mirror Active Group · Group to Counterpart mode
Copies the active group onto its opposite-side partner. The direction is worked out for you. If the partner group doesn't exist yet, it offers to create it. If you've painted a selection mask, only the selected vertices are mirrored, and the status bar says so.
Mirror All L/R Groups · Group to Counterpart mode
Rebuilds every pair on the mesh in one go:
  • pairs every group with its partner by name,
  • creates any partner groups that are missing,
  • copies from whichever side has the weight (an empty group is never used as the source),
  • makes middle groups (head, spine) symmetric onto themselves,
  • then re-checks every pair and re-does any that came out short.
On meshes of 10,000+ vertices it shows progress, and Esc cancels it and puts everything back – every group, weight, the active group and your selection. It ignores selection masks on purpose. A middle group with all its weight on one side is left alone and named in a warning, because that's usually half of a pair with a name it couldn't read (section 8).
Perfect Single Mirror · Symmetrize Single Group mode
Makes the active group symmetric onto itself. Built for meshes made of many separate pieces (eyelashes, hair cards, teeth, buttons): it matches each piece to its mirror piece first, then the vertices inside it. If your chosen direction would copy empty space over the painted side, it refuses and tells you to flip Mirror Direction instead of erasing your weights.
Force Exact L → R  /  Force Exact R → L LAST RESORT
Copies each weight onto the vertex sitting exactly at the mirrored position, ignoring every safety check and tolerance. Use it when a normal mirror still leaves gaps on dense overlapping geometry (lashes joined to eyelids, hair cards) even though exact twins exist. Vertices with no exact twin are left alone, so it never invents weight. Because it skips the checks that stop weight landing on the wrong surface, it isn't the default.

🔧 Checking and repairing

Quick Fix – repairs a pair marked Mismatched. See section 6.

Confine to Mesh Island & Re-Mirror – shown on a pair marked Distorted. Re-mirrors keeping weight on the matching separate piece, so an eyeball's weight stays on the eyeball, not the cheek behind it. Puts your settings back afterwards.

Repair Full Parity – shown when Parity is under 100%. Tries stricter and stricter ways of placing each weight on its exact twin, keeps the best result, and undoes itself if nothing helped. It never invents a twin.

Run Diagnostics Check – a health report for the whole mesh. See section 7.

🧰 Utilities

Button What it does
Select Mirror Group Jumps to the active group's partner. Handy, since Blender only shows one group at a time.
Select Mismatched Vertices Selects target vertices that got no weight and switches to Weight Paint with them masked, ready to touch up.
Select Unpairable Vertices Selects vertices with no twin on the other side, so you can see the geometry causing it.
Create Missing Groups Makes an empty partner for every group that lacks one. Changes no weights.
Clear Active Group Removes all weight from the active group.
Delete All L / R Groups Deletes one whole side. Mainly for testing "delete a side, rebuild it".
Export Log Writes a full text report to attach to a support request.
Align Pivot to Center Fixes an off-centre object origin, which confuses position-based matching.
Optimize All Groups / Apply Tolerance helpers – only needed if you turn Auto-Calculate Tolerance off.
Add / Remove Custom Pattern Teach it a left/right naming style it doesn't know (section 8).
Show Welcome & Onboarding Guide Re-opens the welcome screen.
Uninstall Addon & Clean Files Removes the add-on, after asking you to confirm.

4  The checkboxes (settings)

The defaults are sensible. Most people never change anything except, now and then, one of the problem-solving options for a tricky area. Each setting shows its default:ONOFF

⭐ The ones you'll actually use

Clean Unmatched Weights OFF
On: wipes weight on the target side wherever the source has nothing to match it. A clean result, no leftovers from earlier painting.
Off: the target keeps any weight it already had there. Useful when building up a group in steps.
Restrict to Counterpart Vertices (Mask) OFF
On: Mirror Active Group only writes onto vertices that are proven twins of the source's painted vertices, and touches nothing else. Afterwards they're left selected with the paint mask on, so you can see exactly what changed and paint straight onto it. Use it when weight spills onto a nearby surface – like the upper lip's weight landing on the lower lip. On one test head it gave exactly the right 461 vertices, where the unrestricted mirror gave 468.
Off: every target vertex takes weight from its nearest painted source.
Only affects Mirror Active Group. A paint mask you made yourself takes priority. The selection it leaves behind won't shrink your next mirror.
Confine to Mesh Island (Depth) OFF
On: keeps weight on the matching separate piece of the mesh. Eyes, teeth, tongue, tear lines and lashes sit a hair's width in front of the face, so a plain position match can grab the face behind them. This stops it – on a Genesis 8.1 eye, 43 vertices spilled onto the cheek without it, 0 with it. It also switches off Robust Asymmetric Fallback (they contradict each other); your setting comes back when you turn this off.
Off: matches against the whole mesh.
Verify Normal Alignment OFF
On: refuses to put weight on a surface facing the opposite way to the source. Stops leaks onto back-to-back surfaces: the inside of the mouth behind the lips, the back of a lash, a garment's lining. Only surfaces more than about 126° apart are refused.
Off: the nearest vertex wins, whichever way it faces.
It can't separate surfaces facing the same way (upper and lower lip at rest) – use Restrict to Counterpart Vertices for that.
⚠ Normal Alignment vs. Fallback – read this one.
Verify Normal Alignment only has the final say while Robust Asymmetric Fallback is off. With the fallback on, its promise – "no weight is ever dropped" – wins.
• Lips, eyelids, stacked layers: Normal Alignment ON + Fallback OFF
• Garments, sculpted meshes: Normal Alignment ON + Fallback ON
Robust Asymmetric Fallback OFF
On: when a vertex has no twin close enough, it uses the nearest vertex anyway, so no weight is ever dropped. Good for sculpted, organic and garment meshes. The catch: on a healthy mesh, "nearest" can be the wrong vertex where no true twin exists.
Off: vertices with no close twin are skipped. You may see unweighted spots on lopsided meshes, but nothing lands in the wrong place.
Interpolate Symmetrical Weights OFF
On: blends the three nearest painted vertices instead of copying from one twin. The right choice when the halves have different vertex counts and there's no one-to-one twin. Left and right counts will then differ – that's expected, and the Balance box and Quick Fix know it.
Off: copies from the single matched twin.
Invert Transferred Weights OFF
On: writes 1 minus the weight (1.0 becomes 0.0, 0.2 becomes 0.8). For opposite-side masks and gradients. Mirror All only inverts left/right pairs, never middle groups. The Balance box isn't meaningful after an inverted run.
Off: a straight copy – what you normally want. Don't combine with Auto-Clean Micro-Noise.

⚙️ Matching engine – leave these alone unless you have a reason

Auto-Calculate Tolerance ON
On: works out how far to look for a twin from the size of the mesh's own edges, area by area. The same settings work on a giant creature and a tiny eyelash strip, in centimetres or metres.
Off: shows a Precision Tolerance field (default 0.001). Too big and weight lands on a neighbour; too small and no twin is found. Only affects position matching, and is capped so it can't freeze Blender.
Auto-Detect Symmetry Mode (Beta Test) ON
On: tests each group and picks edge-based or position-based matching for it. Recommended. Applies to Mirror All too.
Off: the Topological Mirror checkbox decides.
Topological Mirror OFF greyed out while Auto-Detect is on
On: always match by the mesh's edges. Best for posed meshes and shape keys; weight can't jump between separate surfaces this way. Needs the mesh built the same on both sides.
Off: always match by position.
Safety net: where the mesh isn't built the same on both sides (the joints a Skin modifier makes, for example), Blender's edge map can pair vertices a whole body part apart. Any pairing that lands more than four edges from the vertex actually at the mirrored position is thrown out and matched by position instead. Posed meshes are unaffected.
Find Own Mirror Plane ON
On: checks that the mesh really is symmetric where it's about to mirror it. If it isn't (the character is rotated on its rig, or its origin is slightly off-centre), it tries the object's own space and the mesh's own middle, and uses whichever lines up. The panel says which plane it's using. A plane is only accepted if three-quarters of the mesh mirrors across it, so a lopsided mesh is never "fixed" with a wrong plane.
Off: always mirrors in the space the other settings imply.
Mirror in World Space OFF
On: mirrors in world space – for objects scaled, rotated or moved in a way that breaks the mirror.
Off: the object's own space.
Use UV Space Mirroring OFF
On: finds twins by their position on the UV map instead of in 3D – for meshes lopsided in 3D but with a mirrored UV layout. Needs a UV map. Vertices with no UVs or on a seam are left out, and it warns you if the layout isn't actually mirrored.
Off: 3D matching.
Cache Symmetry Mapping (Recommended) ON  ⚠ Leave this on.
It makes Mirror All work out the twins once and reuse them for every group. Turning it off is not a trade of speed for accuracy – it's much slower and it damages weights. On a 14,164-vertex rig that was already symmetric: on, 1.8 seconds and nothing changed; off, 119 seconds, 11 groups rewritten and 74 painted vertices lost. Lost weights can't be brought back by running again – reload your file instead. No effect on Mirror Active Group.

🧹 Housekeeping

Leave Locked Groups Alone OFF
On: Mirror, Mirror All, Quick Fix, Force Exact and Perfect Single Mirror skip any target group you've locked, and tell you.
Off: locked groups are written like any other (what Blender's own mirror does).
Normalize After Mirroring OFF
On: after a mirror, rescales the other bone weights on every vertex it wrote to so each adds up to 1. The mirrored group and locked groups are never changed, so it can't undo the mirror. Needs an armature.
Off: other groups are left as they were.
Auto-Clean Micro-Noise OFF threshold 0.000001
On: deletes tiny leftover weights before mirroring. Imported rigs are often full of them, and they clutter groups and throw counts off.
Off: every weight is kept.
Don't combine with Invert: cleaning happens first, and a tiny 0.003 matters when it's about to become 0.997. The panel warns you in red.
Include Near-Zero Weights OFF
Decides what counts as "painted". On: anything above 0.000001 counts and the threshold slider is greyed out. Off: the slider decides.
Auto-Resolve Mismatches OFF
On: if a mirror comes out mismatched, automatically tries again with a wider search.
Off: reports the mismatch and leaves it to you or Quick Fix.
Auto-Detect Suffixes/Prefixes ON
Reads left/right from group names automatically (section 8). Untick it to add a naming pattern of your own.

5  Reading the panel

The Active Group box

Shows the active group, how many vertices carry weight, its partner group and how many that has. Also:

  • Parity: N% – the share of painted vertices whose twin carries the same weight. Below 100% you get a Repair Full Parity button.
  • Force Exact – the two last-resort buttons from section 3.

The L/R Balance box

One row per left/right pair:

Row reads Status Meaning
L:589 | R:589 BALANCED All good.
L:477 | R:477 BALANCED – 1 UNPAIRABLE All good; one vertex simply has no twin.
L:589 | R:588 MISMATCHED, DELTA 1 Needs a fix.
L:589 | R:589 MISMATCHED – N LOST Counts agree but weight was dropped. Needs a fix.
L:348 | R:348 DISTORTED ~61% Counts agree but weight is on the wrong vertices.
What "unpairable" means. Some vertices have no twin: one side of the mesh has geometry the other doesn't. No tool can place a weight on a vertex that doesn't exist, so these are a footnote, not a permanent red error.

Why the box and Quick Fix always agree. Both use exactly the same check – you'll never see "Quick Fix succeeded" next to "Mismatched".

After Run Diagnostics the box also uses Blender's edge map to predict which pairs Quick Fix can repair – much more accurate on sculpted meshes. The box says when it's in use.

The box updates after any SymmetryFlow button. After painting by hand, press any SymmetryFlow button to refresh it.

6  Quick Fix: what happens when you press it

Quick Fix tries the gentlest repair first and only goes further if that didn't work, checking after every step:

0 A normal mirror. Most pairs are fixed here.
1 Try again with Verify Normal Alignment off.
2 Swap edge-based and position-based matching.
3 Search a wider area for twins.
4 Briefly turn on Robust Asymmetric Fallback – kept only if it actually helped.
5 Rebuild the target strictly one-to-one. Vertices with no twin are skipped, never faked.
✔ It won't make things worse. Quick Fix saves the target group first. If the result is worse in any way – more mismatches, a bigger count gap, or fewer painted vertices – it puts the group back. It restores your mode, selection mask and settings when done. If a pair genuinely can't be made perfect, it says so instead of forcing a green label.
Tested on every left/right pair of four very different rigs (148 pairs): none made worse, every setting restored every time.

7  Run Diagnostics

A full health check of the mesh:

Alignment Index (0–100) An overall score; a clean, mirrorable mesh scores at or near 100. Points come off for vertices with no twin, lopsided areas, flipped normals, groups missing a partner and an off-centre origin.
Unpairable Vertices How many vertices have no twin, which side has more, and which groups are affected. Hidden vertices (teeth, eyes you've hidden on purpose) don't count against you.
Unbalanced Vertices Vertices whose twin the mirror couldn't reach. 0 means the next mirror will be clean.
Also Vertex and face counts, a suggested tolerance with an Apply button, a flipped-normals alert, and an off-centre origin warning with a one-click fix.

On meshes of 20,000+ vertices it shows progress, and Esc stops it and puts back everything it had changed.

8  How group names are paired

SymmetryFlow reads left and right from group names. It understands, with no setup:

Style Example
.L / .R   _L / _R   -L / -R Arm.L, Arm_L, Arm-L
Left / Right   Lft / Rgt Arm.Left, Arm_right, Arm.Lft
L_ / R_ at the start L_Arm
Character Creator CC_Base_L_Thigh
Rigify, numbers on the end DEF-thigh.L.001
Words inside the name mFaceCheekUpperRight
Daz Genesis 3 / 8 lShldrBend / rShldrBend
3ds Max Biped Bip01 L UpperArm
MMD The Japanese words for left and right

The Daz, Biped and MMD styles are only used when the other side's name actually exists (as a group, or a bone on the rig), so an ordinary name isn't mistaken for a side. It won't think "Collar" is a left-side group just because it has an L in it.

✎ Your own naming style: untick Auto-Detect Suffixes/Prefixes, choose Custom Match Pattern, and enter what to search for and replace it with. Your pattern is tried first, by every button including Mirror All. It's a plain text swap, so "_L" → "_R" would turn "Shoulder_Left" into "Shoulder_Reft" – match your pattern to your real names.

A group none of these rules can pair is treated as a middle group and made symmetric onto itself.

9  How fast it is

Measured in Blender 5.1.2 with the default settings. Mirror All's time grows in step with the size of the mesh – the same body split into more and more vertices:

Vertices Mirror All L/R Groups
14,164 about 3.5 seconds
56,412 about 13 seconds
225,184 about 52 seconds
1,138,724 about 5 minutes (about 3 GB of memory)

On a 53,790-vertex body with 37 pairs: Mirror All about 12 s, Run Diagnostics about 12 s, Quick Fix about 9 s for one pair, and the panel about 2 s for its first update after a button, then instant.

Up to 225,184 vertices every pair came out as an exact mirror. Past a million, a few pairs in the face and fingertips had some weights land a vertex or two off their twin; Mirror Active Group places those exactly. At that size other operations are slow too: Mirror Active Group about 2 minutes a pair, Quick Fix about 6 minutes, and Run Diagnostics used over 5 GB of memory before the test stopped it.

⌛ Hair cards, lashes and brows are the slow case, whatever their size – they're thousands of small overlapping pieces. Blender can look frozen for several minutes while it works. SymmetryFlow warns you before it starts.

10  Things it cannot do

It can't make a lopsided mesh symmetric. If one side has a vertex the other doesn't, there's nowhere exact to put that weight. SymmetryFlow tells you which groups are affected instead of guessing.
Faces often end up with different vertex counts. Faces are usually not built vertex-for-vertex across the middle. On one body, the chest has an exact twin for 97–99% of its vertices, the lower lip for 15%, the upper eyelid for none. Judge faces by how they look and deform, not by the count.
Normal Alignment can't separate surfaces facing the same way. Use Restrict to Counterpart Vertices or edge-based matching for that.
The Balance box doesn't watch your brush. After painting by hand, press any SymmetryFlow button to refresh it.
Auto-Detect Symmetry Mode is still marked beta.

The full list, with measurements and workarounds, is in Known issues and workarounds.txt in the download.

11  Recipes for common jobs

Job Do this
🔁 Rebuild one whole side Mirror All L/R Groups. Leave Cache Symmetry Mapping on.
👄 Lips and eyelids Verify Normal Alignment on, Robust Asymmetric Fallback off. If weight still spills onto the other lip or lid, also tick Restrict to Counterpart Vertices and use Mirror Active Group.
👁 Eyes, teeth, tongue, lashes
Daz / Genesis-style layered heads
Confine to Mesh Island on (it turns the fallback off for you). If a pair reads Distorted, press its Confine to Mesh Island & Re-Mirror button.
👕 Garments, sculpted or lopsided meshes Verify Normal Alignment on, Robust Asymmetric Fallback on. If the halves have different vertex counts, try Interpolate Symmetrical Weights.
🤸 Posed, or with shape keys Leave Auto-Detect Symmetry Mode on. It uses edge-based matching, which doesn't care about the pose.
🔄 Rotated, or off-centre origin Leave Find Own Mirror Plane on. If that isn't enough, Run Diagnostics and use Align Pivot to Center, or try Mirror in World Space.
🧠 A middle group
head, spine, an eyelash strip
Switch Mode to Symmetrize Single Group, pick the Direction that copies from the painted half, and press Perfect Single Mirror.

© 2026 Dev.Luv Studios · GPL-2.0-or-later · Questions: [email protected]

$20$15

Have questions about this product?
Login to message

Details
Blender Extension Compatible Yes
Dev Fund Contributor
Published 3 days ago
Blender Version 3.6 - 5.1
Extension Type Add-on
Render Engine Used Cycles
License GPL