ComfyUI Node

Scale Mesh (per axis)

Squashed 3D Output? Fix the Axis in the Graph, Not in Blender

By SilentLuxRay·Created 21 days ago·Updated 20 days ago· 1
Scale Mesh (per axis)
  • mesh
  • mesh
◄scale_x1.00►
◄scale_y1.00►
◄scale_z1.00►
◄pivotbbox_center►

Image-to-3D models have one failure mode nobody advertises: the output comes back squashed on one axis. A character with a flattened face, a prop that's stretched tall, a bust that's wider than it is deep. It's not a bug so much as a symptom of single-image reconstruction: the model guesses depth from one view and sometimes guesses wrong, and the wrapper node you're running exposes no parameter that fixes it. The community's own summary of this corner of the stack is blunt about that: these models "fail to expose parameters to the user," and those missing parameters are potent enough to matter.

The usual fix is to import the .glb into Blender, scale the axis, export it again - every single time you run the graph. Scale Mesh (per axis) is the version that lives in the workflow instead. It takes a MESH, multiplies its vertices by a per-axis value, and hands the mesh back. That's it. Small node, genuinely useful, and it saves a round trip to Blender on every iteration.

What it does to the mesh

The implementation is pleasantly boring, which is what you want in a geometry node. It shallow-copies the mesh, clones the vertex tensor - shaped (B, N, 3), batch, vertex, xyz - and scales each batch item's vertices around a pivot:

v = (v - pivot) * scale + pivot

Because it uses vertex_counts when the mesh carries it, a batched mesh scales each item against its own bounding box rather than a bbox smeared across the whole batch. Faces, UVs, textures and materials ride along untouched, because only vertex positions change. That's also why it works on meshes from any generator - it doesn't need the model's code, just a standard ComfyUI MESH object.

Where you put it matters. Slot it after your 3D generator (or after VoxelToMesh, if the pipeline goes through a voxel grid) and before whatever exports the asset - Preview3D, SaveGLB, an STL/OBJ export. Fix it after the save and you've exported the wrong proportions again.

Inputs and output

mesh goes in, one mesh comes out, same type, so you can chain it or feed it straight into the preview/export nodes. The three you set are scale_x, scale_y and scale_z, each a plain multiplier from 0.05 to 10 where 1.0 means unchanged. This is a multiplier, not a target size - to take a 2.0-unit-tall mesh down to 1.6, you type 0.8.

pivot is the one field with a real decision in it. bbox_center scales around the mesh's own bounding-box centre, so the object stays where it sits and just gets fatter or thinner - that's the default and usually what you want. origin scales around world (0,0,0), which is what you reach for when the mesh has already been positioned on purpose and you don't want the node quietly recentring it. Scaling around the origin moves an off-centre object; that's the tooltip saying so, and it's worth believing.

The practical pattern

You rarely touch all three axes. Find the one that's wrong - flattened depth is usually scale_z or scale_y depending on how your generator orients the mesh - and nudge that one with the others left at 1.0. Non-uniform scaling is the entire point here; if you wanted uniform you'd use any other scale node.

Two things the ranges imply. You can't mirror or zero an axis, since the minimum is 0.05 with no negatives. And you can't fix a 100x error in one node - the cap is 10 - but with bbox_center the centre point is invariant under scaling, so chaining two of these nodes is exactly equivalent to one node at the product of the two. Two nodes at 10 is a 100x fix.

One honest caveat about non-uniform scaling in general: skewing an axis is the mathematically awkward case for stored normals, and this node only rewrites vertex positions. If a large axis correction leaves the shading looking off in your viewer or engine, normals are the first thing to check. For small proportion fixes I've never seen it matter.

Install

Same pack as the turnaround splitter, same trivial install. Two Python files, no requirements.txt, no install script, no model files - the only import is torch.

cd ComfyUI/custom_nodes
git clone https://github.com/SilentLuxRay/ComfyUI-Furrey-TurnaroundSplitter
# restart ComfyUI

Or search Furrey-TurnaroundSplitter in ComfyUI Manager. It's MIT-licensed.

Worth setting expectations while you're here: this fixes proportion, not geometry. The honest verdict on image-to-3D output is that the surface is impressive and the topology underneath is triangle soup - fine for a print or a static prop, not something you rig as-is. Scaling one axis doesn't make a mesh good, it just makes the shape the one you asked for.

Category3d/mesh

Inputs (5)

NameTypeDefaultDescription
meshMESH—
scale_xFLOAT1.000.05–10—
scale_yFLOAT1.000.05–10—
scale_zFLOAT1.000.05–10—
pivotCOMBObbox_centerbbox_center: scale around the mesh's own bounding-box center. origin: scale around world (0,0,0) -- use if the mesh is already positioned intentionally and you don't want it re-centered.

Outputs (1)

NameTypeDescription
meshMESH—