Nodes/Avatar Graph/Object Join Uvs
ComfyUI Node

Object Join Uvs

Bringing UV maps along when your avatar layers get together

By avatechai·Created 3 years ago·Updated 2 years ago· 264
Object Join Uvs
  • BPY_OBJ
  • BPY_OBJ

UV maps are the glue between a 3D mesh and its 2D texture - they say "this part of the image goes on this part of the model." In Avatar Graph, where characters are built from a flat 2D image cut into segments and turned into meshes, UVs are doing a lot of quiet work: each mesh layer has to unwrap so its piece of the source image lands correctly.

Object_JoinUvs is the node that copies UV maps from selected objects onto the active one. It wraps bpy.ops.object.join_uvs() - Blender's "Join UVs" operation. When you've got a character built from separate layer meshes (body, face, hair) that each carry their own UV, this is how you consolidate them onto a single object, typically right before or alongside a geometry join.

How it works

BPY_OBJ sets the active object in the embedded scene and passes back through unchanged. The operator copies the UV maps from every selected object onto the active mesh. As with Object_JoinShapes, it's a copy - sources keep their own UVs - and matching vertex counts matter: UVs are stored per-vertex/corner, so if the source and target meshes disagree on topology, the copied UVs land wrong.

A note on why you'd bother: when you Object_Join two meshes, Blender does merge their UV maps automatically. So JoinUvs is really for the case where you want the target object to carry another mesh's UV without merging the geometry - or where you're standardizing UVs across layers before they meet, so a single shared texture applies everywhere.

When you'd use it in an avatar graph

Mostly in the assembly phase. The pack's Match Texture Aspect Ratio and Plane Texture Unwrap nodes deal with per-mesh UV correctness; JoinUvs is the consolidation step when layers are getting married. If your final avatar renders with textures sliding or stretched on part of the model, it's often because layers had inconsistent UVs - copying them all onto one object (or onto a shared target) fixes that class of artifact.

Inputs and outputs

  • BPY_OBJ - the mesh receiving the UV maps; returned unchanged.
  • BPY_OBJ output - pass-through.

Selection drives which sources get copied; there are no other parameters.

Installing it

Ships in Avatar Graph (avatechai/avatar-graph-comfyui). ComfyUI Manager: search "Avatar Graph". Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui && python -m pip install -r requirements.txt

Pack constraints: bpy==3.6.0 wants Python 3.10.x, and first launch pulls the SAM ViT-H checkpoint (~2.5 GB) and MediaPipe models automatically.

Common issues

Topology mismatch is the quiet killer here - copied UVs on mismatched vertex counts just look "wrong" with no error message. And because this is a copy, expect duplicate map names if you run it more than once on the same objects. If your exported avatar has one layer with broken textures, check whether that layer's UVs actually made it onto the final object before you blame the renderer. The pack's README labels it work-in-progress, so verify behavior after updates.

Categoryblender

Inputs (1)

NameTypeDefaultDescription
BPY_OBJoptBPY_OBJ

Outputs (1)

NameTypeDescription
BPY_OBJBPY_OBJ