Move-Scale-Rotate-Sym
Place your sprite exactly, then mirror it
- image
- mask
- image
- mask
ComfyUI's built-in image transform nodes exist, but they're opinionated: fixed pivots, no symmetry, no mask handling. Move-Scale-Rotate-Sym - the node ComfyUI's search calls DAO Move - bundles translate, scale, rotate, flip, and a proper pivot control into one node, and it carries your mask along for the ride. That last bit is the sleeper feature: transform an image and its mask in perfect lockstep, then hand both to a compositing or inpainting step.
It's part of orion4d/ComfyUI_DAO_master, the French-authored vector-and-image utility pack, and it's the "positioning" workhorse the pack's clone nodes are built around. If you're hand-assembling a composite - logo onto a card, a cutout onto a background, a generated element into a scene - this is the node you reach for.
How it works
Feed it an image (and optionally a mask). dx/dy translate (up to ±8192 px), scale resizes (0.01–10×, and it accepts negative values, which mirror the image - the "Sym" in the name), and angle_deg rotates up to a full turn in either direction.
The pivot is where this beats the stock nodes. pivot_mode offers center, top_left, or custom, and with custom you get pivot_x/pivot_y to pin rotation and scaling to any point - the difference between "rotate around the middle" and "rotate around that corner so it swings like a door." flip_h and flip_v give you explicit symmetry flips.
The mask handling: apply_mask_to_alpha (on by default) writes your mask into the image's alpha channel as you transform, so the output is an RGBA cutout that moves as one unit. invert_mask flips the incoming mask if it arrives inverted.
Outputs: image and mask, both transformed consistently.
The settings that matter
pivot_mode- the first thing to set.centeris the sane default;customis how you get predictable rotation around an anchor.scalewith a negative value - instant mirror, no flip checkbox needed.angle_deg- rotation in degrees, fine-stepped to 0.1°.
Installing
Via ComfyUI Manager (search ComfyUI_DAO_master) or:
cd ComfyUI/custom_nodes
git clone https://github.com/orion4d/ComfyUI_DAO_master.git
Restart and done - pure Pillow/numpy, no extra dependencies.
Where people get burned
The usual confusion is negative scale combined with pivot_mode: center - mirroring around center flips the image in place, but with custom pivot it mirrors around your anchor, which is usually what you actually want for symmetry. And the transformed image keeps its original canvas: moving a sprite with dx/dy can push it partly off-canvas, so size your canvas or use the offset deliberately.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| angle_deg | FLOAT | 0.0-360–360 | — |
| scale | FLOAT | 1.00-10–10 | — |
| dx | INT | 0-8192–8192 | — |
| dy | INT | 0-8192–8192 | — |
| pivot_mode | COMBO | center | 3 options: center, top_left, custom |
| pivot_x | FLOAT | 0.00-8192–8192 | — |
| pivot_y | FLOAT | 0.00-8192–8192 | — |
| flip_h | BOOLEAN | false | — |
| flip_v | BOOLEAN | false | — |
| apply_mask_to_alpha | BOOLEAN | true | — |
| invert_mask | BOOLEAN | false | — |
| maskopt | MASK | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| mask | MASK | — |