Panda3dAttachNewNode
The 'empty' node for organizing a 3D scene
- base
- parent
- base
- model
In Blender you add an "empty": a point in space with a position, an orientation and a name, but no visible geometry. Panda3dAttachNewNode is that, for the chaojie/ComfyUI-Panda3d pack. It creates a blank transform node inside the 3D scene graph, parents it to an existing model, and gives you a handle you can move around. Alone it renders nothing - but as a mount point or a grouping anchor, it's quietly one of the more useful nodes in the pack.
How it works
The mechanism is a single Panda3D call: parent.attachNewNode(nodepath), where nodepath is just the name you want the node to have (it's a string input, not a file path - the naming is confusing, I know). The result is an empty NodePath parented to whatever you wired in, with the transform you set applied to it.
The demo workflow shows exactly why this matters. The carousel has four pandas riding around it. Instead of loading four copies of the panda model directly onto the carousel, the workflow creates four empty nodes (named panda0 through panda3), positions each around the ring, and then parents a panda model to each empty. The empties do the positioning; the models just ride along. If you animate or rotate the empty, everything attached to it moves with it - that's the whole point of a transform node.
The inputs that matter
- parent (Panda3dModel) - what to attach to.
renderfromPanda3dBasefor a world-space empty, or another model's output to make it a child. - nodepath - a name for the new node. Only really matters if you're poking around in the scene graph.
- x / y / z, h / p / r, sx / sy / sz - the transform. Same conventions as
Panda3dLoadModel: position, heading/pitch/roll in degrees, per-axis scale.
Outputs are base (the engine, passed through - chain it onward) and model, the empty's handle. Feed that handle into another Panda3dAttachNewNode's parent to build hierarchies, or into Panda3dTest if you want to animate the empty itself.
Installing it
Part of the one pack, so it comes with all the others. ComfyUI Manager, search ComfyUI-Panda3d, or:
cd ComfyUI/custom_nodes
git clone https://github.com/chaojie/ComfyUI-Panda3d
cd ComfyUI-Panda3d
pip install -r requirements.txt
Restart ComfyUI and the Panda3d category appears.
Common issues
- "It renders nothing." Correct - that's the feature. An empty has no mesh. You're meant to parent models to it, and the demo does exactly that.
- "The name field isn't a path."
nodepathis a label, not a file. People trip on this once and then it's obvious. - "My model doesn't inherit the empty's position." It only inherits if you wire the model's
parentinput to the empty'smodeloutput. Parent the model directly torenderand it'll ignore the empty entirely.
For anything more complex than a static object - a rotating arm, a moving platform, pandas on a carousel - this is the node that makes it manageable.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| base | Panda3dBase | — | |
| parent | Panda3dModel | — | |
| nodepath | STRING | — | |
| x | FLOAT | 0.0-1000–1000 | — |
| y | FLOAT | 0.0-1000–1000 | — |
| z | FLOAT | 0.0-1000–1000 | — |
| h | FLOAT | 0.0-1000–1000 | — |
| p | FLOAT | 0.0-1000–1000 | — |
| r | FLOAT | 0.0-1000–1000 | — |
| sx | FLOAT | 1.0-1000–1000 | — |
| sy | FLOAT | 1.0-1000–1000 | — |
| sz | FLOAT | 1.0-1000–1000 | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| base | Panda3dBase | — |
| model | Panda3dModel | — |