kubakub projector
Metres, not a camera you don't have
- projector
Most 3D files you get handed for a facade job have no usable camera. They might have the modelling camera someone left in the scene, at some arbitrary angle, or nothing at all. And even when there is one, it was placed by a modeller, not by the person who has to put a projector on a balcony 8 metres from the wall with a 1.5 throw lens.
kubakub projector describes the projector the way you'd describe it on site. Connect its projector output to kubakub scene render and the model is rendered from there instead of from the file's camera.
The inputs, in the order you'll use them
distance_m - metres from the wall. The important thing: 0 doesn't mean "no distance", it means as far as the throw ratio needs to cover the model (and if throw_ratio is also 0, the node assumes 1.5). So a fresh node with the defaults gives you a sensible full-model shot; you then move it closer or further to match reality.
throw_ratio - distance divided by picture width, straight off the lens data sheet. 0.8 is a wide short-throw lens, 2 is a long one. 0 means the picture just covers the model. If you know your projector's lens - and you will, because that's the hardware you own - typing the real number is what turns this from a composition tool into a previz tool. The scene report tells you where the projector ended up, how big its picture is on the wall in metres, and how much of the model the picture misses when your throw is too long.
offset_m - metres along the wall from the middle of the facade, positive to the right as the audience sees it. height_m - metres above the ground, where "ground" is the lowest point of the model. Default 1.5 is a projector on a low stand; a tower, a balcony or a roof is where this number earns its keep. turn_deg lets you aim at an angle to the wall, for a spot round the corner.
aim is the one that needs a sentence of explanation, because it is the difference between a previz and a lie:
lens shift(default) - the projector stays square to the wall and the picture is shifted onto the model. Verticals stay vertical. This is what a projector with lens shift does, and it's why the pack calls its uniform-scale viewer model exact for a lens-shift setup.tilt- the projector is turned to the middle of the model, so you get keystone. Sometimes that's the honest answer because it's what the rig does.straight- square to the wall, no shift. For a model that's already framed.
Two advanced inputs: side (auto picks the side the model is widest across, which is right for a facade - wide and shallow; or force it to Blender's front) and margin, the free border around the model when the picture is fitted. The optional name labels the reports, which matters the moment you have two projectors: "left tower" beats "projector 1" when you're reading output at 11 pm.
Several projectors
This is worth flagging early because it changes how you build the graph. The node gives you one projector, so for a two-projector setup you use one kubakub projector and one kubakub scene render per projector, both on the same file, each with its own position and lens. Then kubakub projector blend takes their scene outputs and gives you a soft-edge mask per projector.
The pack's own workflow projector_blend.json is the template. Real shows work this way - the well-known SDXL projection-mapping production in Kortrijk ran four projectors to cover a building - and the reason it isn't just "make the picture wider" is exactly what the blend node exists for.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/kubakubkub/ComfyUI_KubaNodes
python -m pip install -r ComfyUI_KubaNodes/requirements.txt
Or Manager → kubakub nodes. Requires ComfyUI 0.37.0+. This is the node where the Blender 4.x requirement bites hardest: everything under 3d / scene runs the model through headless Blender. The pack finds Blender in Program Files or on PATH, or you can set blender_path on scene render / blender = ... in kubakub.ini. Without it, the node loads and then does nothing useful.
The pack's own test target - and presumably the machine it was tuned on - is an RTX 5070 Ti 12 GB on Windows 11 with Blender 4.5. The scene render on a 3200×2160 20k-face facade takes about 4.5 s on that hardware, so guessing projector positions is cheap. Do it.
Where people go wrong
A model in the wrong units. Some FBX exports come out around half a metre wide, and then none of these metre values mean anything. kubakub scene render has a unit_scale input and warns when a model is under 2 m or over 2 km. Check the report before you blame the lens.
Flipped lens shift on FBX round trips. The pack handles it - when the imported camera sees almost none of the model and the flipped shift frames it, the flipped one is used and the report says so - but if a camera looks wrong, that's the first thing to check in the report.
Expecting scene render's width/height to follow the projector. They don't. Set scene render's output size to the projector's resolution yourself, or you're previzzing a different aspect than the one you'll deliver.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| distance_m | FLOAT | 0.00–2000 | Metres from the wall. 0 = as far as the throw ratio needs to cover the model (throw 1.5 when that is 0 too). |
| offset_m | FLOAT | 0.0-1000–1000 | Metres along the wall from the middle of the facade, + = to the right as the audience sees it. |
| height_m | FLOAT | 1.5-100–500 | Metres above the ground (the lowest point of the model): a tower, a balcony, a roof. |
| throw_ratio | FLOAT | 0.000–20 | Distance / picture width, as on the lens data sheet (0.8 = wide, 2 = long). 0 = the picture just covers the model. |
| aim | COMBO | lens shift | lens shift: square to the wall, the picture shifted onto the model (verticals stay vertical). tilt: turned to the middle of the model (keystone). straight: square to the wall, no shift. |
| side | COMBO | auto | Which side of the model is the facade. auto: the side the model is widest across; front = Blender's front view. |
| turn_deg | FLOAT | 0-89–89 | The projector's direction turned around the building, for a spot at an angle to the facade (+ = towards the right, seen from the audience). |
| margin | FLOAT | 0.050–1 | Free border around the model when the picture is fitted (throw ratio 0), as a share of the picture. |
| nameopt | STRING | A name for the reports (left tower, roof ...). |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| projector | KUBA_PROJECTOR | -> kubakub scene render, projector. |