Nodes/Avatar Graph/Transform Select Orientation
ComfyUI Node

Transform Select Orientation

Set the Compass Every Later Transform Follows

By avatechai·Created 3 years ago·Updated 2 years ago· 265
Transform Select Orientation
  • BPY_OBJ
  • orientation
  • BPY_OBJ

Transform Select Orientation is the least flashy node in Avatar Graph's mesh toolbox, and you'll probably use it exactly once - then forget it exists. That's fine. It exists because the pack auto-generates a ComfyUI node for every Blender transform operator, and this one happens to be transform.select_orientation: the thing that picks which coordinate space the transform gizmo and downstream ops treat as "up" and "forward."

In Blender you change this when you want to slide something along a surface, along a custom axis, or relative to the view instead of the world. In Avatar Graph the same idea applies: set the orientation, then let later transform nodes act in that space.

What it actually does

Peek at the pack source and you'll see these nodes aren't hand-written. blender_node.py builds each one by wrapping a bpy.ops.* call, and the node's inputs are literally Blender's operator properties, scraped from RNA. So Transform Select Orientation takes a BPY_OBJ (a mesh object, usually from Create Mesh Layer or Join Meshes), enters edit mode, and calls bpy.ops.transform.select_orientation() with the orientation you picked. It's a state-setting node: it doesn't move a single vertex itself.

The only inputs are BPY_OBJ and orientation (an enum of available orientations - the pack exposes Blender's built-in and custom orientation list). The single output is BPY_OBJ - the same mesh, unchanged, so you can chain it into the next node. Yes, it returns the object it did nothing to. That's the whole point: it threads the mesh through while setting a flag for later nodes.

Where it fits (and where it doesn't)

The honest take: for 90% of avatar work you don't need this node at all. Every transform node in the pack carries its own orient_type (GLOBAL, LOCAL, NORMAL, VIEW, CURSOR, PARENT...) and its own orientation matrix inputs, so you can get most results by just setting orient_type directly on the node doing the moving. Select Orientation is only worth reaching for when you've set up a custom orientation and want other nodes to inherit it without wiring matrices around, or when you're porting over a Blender habit of "set orientation once at the top of the stack."

Installing

Avatar Graph ships as one pack - avatechai/avatar-graph-comfyui - and this node rides along with it. The pack embeds a real headless Blender via bpy==3.6.0, which only supports Python 3.10, so that's your one real setup constraint. On macOS/Linux, make a 3.10 env first:

conda create --name comfyui python=3.10
conda activate comfyui

Then install via ComfyUI Manager (search Avatar Graph) or:

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

Restart ComfyUI with python main.py --enable-cors-header so the Avatech editor can preview and animate the avatar live; without the flag you can still run the graph and export a .GLB/.GLTF from the Avatar Main Output node.

One gotcha if you do chain it: transform nodes in this pack act on the entire mesh - there's no vertex-selection input. So "orientation" applies to the whole object you feed in. If you want different parts oriented differently, split them into separate mesh layers first.

Categoryblender

Inputs (2)

NameTypeDefaultDescription
BPY_OBJoptBPY_OBJ
orientationoptB_ENUM

Outputs (1)

NameTypeDescription
BPY_OBJBPY_OBJ