Transform Select Orientation
Set the Compass Every Later Transform Follows
- 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.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| BPY_OBJopt | BPY_OBJ | — | |
| orientationopt | B_ENUM | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| BPY_OBJ | BPY_OBJ | — |