kubakub pieces render
Clay for the projector, or the matrix cast onto them
- pieces
- matrix
- clay_color
- viewer
- frames
- alpha
- fps
- report
The end of the pieces chain. You've picked the parts, driven them with a falloff, pushed and tilted them - this node turns all of that into frames, from the projector's viewpoint, in Blender Cycles. It's the only node in the group that costs real time, and it's the one that decides whether the result goes to a projector or to your own eyes.
Two looks, two jobs
look has exactly two values and they answer different questions:
clay- the model in light, no content. This is the content to project: frames where the building's parts are visible and moving, which you then either send to the director as a layer or export as the picture that lands on the wall.projected matrix- the matrix, or its frames, cast from the projector onto the moving pieces, the way the audience actually sees it. Connect your matrix to the optionalmatrixinput (one image, or one per frame, last one repeats). This is the one that surprises people: seen from the projector itself, the picture barely moves - the movement shows up as shadows in the gaps and on the faces of the pieces the light can't reach. That is what a real projector does to a moving surface, and it's the honest previz.
If you want the audience's perspective instead of the projector's, set view to audience. Then audience_distance_m, audience_offset_m, eye_height_m and lens_mm place a camera in front of the building, and the depth of the moving pieces shows. Connect a viewer (from kubakub scene measure, audience viewpoint or project settings) and those three position numbers are replaced by that one spot, so the previz matches everything else in the graph.
The inputs worth touching
pieces is required and comes from the transform chain. duration and fps are what they say. Then the look:
projector_brightness- only meaningful in projected-matrix mode.1lands the matrix at its own brightness on the stone, like the previz. It's a good reality check on the contrast of your content: if you need 4 to be readable, the content is too dark for a real projector.environmentandenv_strength- Blender's built-in HDRIs and how bright they are.nightat 0.3 is the default because that's the situation. Everything above about 1.0 stops looking like a projection and starts looking like daylight.clayandclay_color- how bright the stone is, and what colour it is. White is neutral grey clay.background-blackgives you the building alone with its alpha on thealphaoutput;environmentputs the HDRI behind it.resolution_scale- of the scene's size.1is the matrix size,0.5is the default, and this is your main speed lever.samples- Cycles samples per frame, denoised either way. 32 while you iterate.
Outputs: frames (IMAGES), alpha (MASK - 1 on the building, so you can composite it), fps (FLOAT, straight into a video saver or the director), and report.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/kubakubkub/ComfyUI_KubaNodes
python -m pip install -r ComfyUI_KubaNodes/requirements.txt
Manager users: search kubakub nodes in the pack list or the Comfy Registry (comfyui-kubanodes). ComfyUI 0.37.0+ is required. And this node is the clearest example of the Blender 4.x requirement - everything in 3d / pieces needs it installed, found in Program Files or on PATH, or pointed at with blender = ... in kubakub.ini or the scene render node's blender_path. Blender runs as a headless subprocess; it is never imported into ComfyUI's Python, which is why a Blender problem shows up as a subprocess error rather than an import error.
Also worth setting up if you plan to iterate: kubakub.ini has blender_idle = 600 (seconds) and blender_worker = off. The default keeps one Blender worker alive between jobs, so your second render doesn't pay the startup cost. If you're doing one render and closing the app, blender_worker = off gets your RAM back.
Where it hurts
Every frame is kept. That's the pack's stated design and it's the reason a change renders only what changed - but it also means the cache grows. There's a cache_gb = 20 cap and a least-recently-used eviction in kubakub.ini, and cache_folder if you want it somewhere else.
This is a subprocess render, not a graph node. If Cycles fires but nothing comes back, look at the console, not the node. The report output usually says what happened.
Frame-zero edits re-render everything. The cache is keyed per frame; changing something that alters all frames (a different piece set, a different projector) invalidates the lot. Same for switching view between projector and audience - different camera, different cache.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| pieces | KUBA_PIECES | The pieces with their transforms. | |
| duration | FLOAT | 4.00.04–600 | Seconds. |
| fps | FLOAT | 251–120 | Frames per second. |
| look | COMBO | clay | clay = the model in light (content to project); projected matrix = the matrix cast from the projector onto the moving pieces. |
| projector_brightness | FLOAT | 1.00–20 | projected matrix: 1 = the matrix at its own brightness on the stone. |
| environment | COMBO | night | The light around the building (Blender's built-in HDRIs). |
| env_strength | FLOAT | 0.300–20 | How bright that light is. |
| clay | FLOAT | 0.700–1 | Brightness of the stone. |
| background | COMBO | black | black = only the building (alpha output); environment = the HDRI behind it. |
| resolution_scale | FLOAT | 0.500.1–1 | Of the scene's size (1 = the matrix size). |
| samples | INT | 321–4096 | Cycles samples per frame (more = cleaner, slower; denoised either way). |
| matrixopt | IMAGE | projected matrix: one image or one per frame (the last one repeats). | |
| viewopt | COMBO | projector | projector = from the projection camera (what the projector sends); audience = from a spot in front of the building: the pieces show their depth. |
| audience_distance_mopt | FLOAT | 15.00.5–500 | view = audience: metres in front of the facade. |
| audience_offset_mopt | FLOAT | 0.0-500–500 | view = audience: metres left (-) or right (+) of the facade's middle. |
| eye_height_mopt | FLOAT | 1.70–200 | view = audience: eye height above the ground (metres). |
| lens_mmopt | FLOAT | 246–300 | view = audience: focal length (smaller = wider). |
| clay_coloropt | COLOR | #ffffff | Colour of the stone (and of the surroundings); 'clay' sets how bright it is. White = neutral grey clay, as before. |
| exposureopt | FLOAT | 0.0-10–10 | Overall exposure in stops: +1 = twice as bright, -1 = half (0 = as before). |
| vieweropt | KUBA_VIEWER | The audience spot of kubakub scene measure / project settings. With view = audience it replaces audience_distance_m, audience_offset_m and eye_height_m of this node. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| alpha | MASK | — |
| fps | FLOAT | — |
| report | STRING | — |