kubakub height animate
Make the building grow out of the wall, one frame at a time
- height
- image
- wall_image
- field
- audio
- sound
- height
- lit
- masks
- fps
- audio
- frame_count
- report
Somewhere between "static relief" and "actual 3D" there's the effect everyone wants on a wall: the stones rise out of it, the ornament emerges, the facade breathes. You don't need geometry for that. You need a grey picture where white means "further out", and a way to bring it up over time.
kubakub height animate is that second half. Feed it a height map, get a height map per frame - plus a side-lit relief version of the same thing that reads as an actual clip rather than a grey blob.
What it takes
It isn't tied to the 3D side of the pack at all. height wants any greyscale image where black is the wall and white is furthest out: the height output of kubakub form height if you're doing the generated-model route, or a depth map from Depth Anything or Marigold - the depth-estimation doc's standard preprocessors - for the much more common "2D picture with parallax" route. Nothing connected runs a sample, so you can test the curve before you've built anything.
One input to know about: wall, the grey level that counts as the wall. Leave it at 0 for form height output, which is already zeroed on the wall. For a whole-picture depth map, raise it to the grey of the wall so only what stands in front of it grows - otherwise the entire frame, floor and sky included, rises together and it looks like a printer error.
The two creative dials
grow is how the forms arrive. all together brings every form up at once. peaks first pushes them out through the wall, highest points leading - the one that reads as "growing", as opposed to "fading in". built up in layers cuts flat at the level reached, like filling a mould. along the field makes them rise where a field has already passed you - plug a grey ramp from kubakub mask field into field, and soft sets how wide the rising edge is; with nothing there it goes left to right on its own.
curve is how it runs over time, and it's the same engine as kubakub mask animate, so if you've used that you already know it: ramp grows once and stays, saw repeats, triangle there and back, sine breathes, square strobes, plus random and noise. Then the sound curves: sound level follows loudness, and beats / bars / low / mid / high hits each start a ramp when they fire. cycle is the length of one run in seconds; value_from and value_to are the bottom and top of the curve in the height's own 0–1 units, so overshooting past 1 is how you get a punchy, slightly absurd growth. easing softens the start and stop.
For the sound curves, connect a sound to audio - or better, drop a kubakub sound node's sound output in there so this clip, your shader and your mask swaps all agree on the tempo. A sound curve with no sound runs on a built-in 120 bpm beat, which is handy for blocking things out.
fps, seconds and scale define the clip; seconds at 0 means "as long as the sound, else 4 s".
The outputs
height is the per-frame grey sequence: feed it to the depth presets of kubakub shader, or export it as displacement. lit is the same thing as a relief lit from the side (light direction from light_angle, depth of the relief from relief), composited over image - and this is the output you'll usually want, because growth you can't see isn't growth. Give wall_image (the bare wall, e.g. the clay render) and the forms only show their image once they've actually come out, which looks far better than a crossfade. masks is the same per frame as a mask, for anything that wants a mask; fps, frame_count and audio are the plumbing for Create Video, and report tells you frames, size, the curve's range, and the tempo or hits it found.
The two heavy notes from the author's own docs: 100 frames at 1920×1080 is about 6 GB of RAM, and scale is there for that; and lit is designed to be the moving guide for kubakub motion guide - an empty wall with forms pushing through it is exactly the kind of rough clip LTX can repaint into something finished.
Install
Nothing special. It's part of kubakubkub/ComfyUI_KubaNodes, and this node needs no AI model, no Blender and no extra package beyond what the pack already brings:
cd ComfyUI/custom_nodes
git clone https://github.com/kubakubkub/ComfyUI_KubaNodes
python -m pip install -r ComfyUI_KubaNodes/requirements.txt
Or from ComfyUI Manager, search kubakub nodes. Restart afterwards. The pack needs ComfyUI 0.37.0 or newer, because it's written against the V3 node API. There's a model-free test you can run to prove the engine works before blaming your depth map:
python ComfyUI/custom_nodes/ComfyUI_KubaNodes/tests/test_heightanim.py
Where it goes wrong
The classic one is a washed-out result: you fed it a whole-picture depth map and left wall at 0, so the background got height too. Second is forgetting that these are not metres - after subtracting wall, white is simply the furthest-out thing in the picture. Third is scale: this generates every frame and keeps them, so a 4K, 400-frame version of a subtle grow will fill RAM long before it fills your patience. Halve scale, look at it, then commit.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| grow | COMBO | all together | all together: every form rises at once. peaks first: the forms are pushed out through the wall, the highest points come first. built up in layers: from the wall up, cut flat at the level reached. along the field: the forms rise where the field has been passed. |
| curve | COMBO | ramp | How the value runs. ramp: once, then it stays. saw: again and again. triangle: there and back. sine: a soft there and back. square: on / off. random, noise. sound level: follows the loudness. beats / bars / low / mid / high hits: each one starts a ramp. |
| cycle | FLOAT | 3.000.01–3600 | Speed: seconds for one cycle of the curve (for beats and hits: seconds the ramp takes after each one). |
| value_from | FLOAT | 0.00-10–10 | The value at the bottom of the curve: 0 = the bare wall. |
| value_to | FLOAT | 1.00-10–10 | The value at the top of the curve: 1 = the whole height. More overshoots (all together), less stops on the way. |
| easing | COMBO | ease in out | ramp, saw, triangle, beats and hits: how the ramp starts and stops. |
| wall | FLOAT | 0.000–0.99 | The grey that counts as the wall. 0 for kubakub form height. For a depth map of a whole picture raise it to the grey of the wall, so only what stands in front of it grows. |
| soft | FLOAT | 0.150–1 | along the field: how wide the rising edge is (0 = the forms pop up, 1 = the whole field rises at once). |
| light_angle | FLOAT | 35-360–360 | lit: where the light comes from, degrees. 0 = from the left, 90 = from above, 180 = from the right. |
| relief | FLOAT | 1.000–20 | lit: how deep the relief reads. Raise it for flat forms. |
| fps | FLOAT | 25.001–120 | Frames per second. |
| seconds | FLOAT | 0.00–3600 | Length. 0 = the length of the sound, else 4 s. |
| scale | FLOAT | 1.000.05–1 | Size of the frames relative to the height map (RAM: 100 frames at 1920x1080 = 6 GB). |
| heightopt | IMAGE | The height as a grey picture: black = the wall, white = furthest out. From kubakub form height, or a depth map (near = white). Empty = a sample. | |
| imageopt | IMAGE | The picture on the relief for 'lit': the facade, a clay render, the picture the depth map was made from. Empty = clay grey. | |
| wall_imageopt | IMAGE | With 'image': the picture of the bare wall (e.g. the clay render). It shows where a form has not come out yet, so the forms bring their colours with them. Empty = 'image' is there from the start. | |
| fieldopt | MASK | For grow = along the field: the grey ramp from kubakub mask field, black comes first, white last. Empty = left to right over the forms. | |
| audioopt | AUDIO | For the sound curves, and passed on to 'audio' for Create Video. A sound curve without a sound runs on a built-in beat (120 bpm). | |
| soundopt | KUBA_SOUND | From kubakub sound: the sound and how it is heard (tempo, gain, release, band, threshold, gap), set once for every node that listens, so all of them step on the same beat. Connected, it comes before 'audio' and before this node's own sound settings. |
Outputs (7)
| Name | Type | Description |
|---|---|---|
| height | IMAGE | The height per frame, grey: for the depth presets of kubakub shader (hard shadow, sheet of light), or as displacement. |
| lit | IMAGE | The same as a relief lit from the side, on 'image': the growth as a clip, e.g. the guide of kubakub motion guide. |
| masks | MASK | The height per frame as masks. |
| fps | FLOAT | Frames per second. |
| audio | AUDIO | The sound, cut to the frames (silence without one). |
| frame_count | INT | How many frames. |
| report | STRING | Frames, size, the range of the curve, tempo or hits found. |