bEpic 3D Scene (Previz)
Stop prompting camera moves — block the shot in 3D and render it back into the graph
- model
- images
- frame_count
- fps
You can't prompt a camera move. Ask a video model for a slow dolly in on a coffee cup and you'll get something that drifts, wobbles, or turns the cup into a lamp. The old fix is Blender: model a rough set, render a depth or normal pass, feed it to ControlNet. bEpic 3D Scene (Previz) is that pipeline with the DCC app deleted - a scene builder and shot renderer living inside the pack's image-viewer panel, handing frames back as an IMAGE batch.
What it actually is
It comes in ComfyUI-ImageViewer by bEpic (Sebastian Zilius) - the "give ComfyUI a real viewer" pack that hit r/comfyui at +99 in April 2026, pitched as RV/Nuke-style review for the graph. Every 3D tab in that viewer is a scene; this node stores one on the graph, in a widget, so it travels with your workflow.
Where it earns its place: block a set, drop in primitives, add a camera with a resolution gate, keyframe the move, render it, then push those frames into a depth preprocessor, a ControlNet union, or an LTX depth IC-LoRA. The camera move is yours and the model only has to paint.
How it works, mechanically
The node itself does almost nothing clever, which is the point. The scene lives in scene_data, a widget the viewer writes and hides from you. On a run, the node ships that scene over the viewer's websocket and then goes looking for a render - output/previz/<render_name>.mp4 (or .mov/.webm), or a folder of PNG frames at that same name. Whatever it finds becomes images.
If nothing's there it doesn't fail: it logs nothing rendered yet for 'shot' - press Render in the viewer's previz panel and hands back one 64×64 black frame. Deliberate, and the number one thing people trip on.
Rendering happens in the viewer, under Export → Render… in the scene's Outliner - camera, resolution, range, shading, transparent background, supersampling. Those settings live on the scene rather than in node widgets, so don't go hunting for them on the canvas. A video render leaves one clip behind and deletes the frames; PNG leaves frame_0012.png stills. A new take clears the last one.
The inputs that matter
Two required fields do the real work:
tab_name- which viewer tab the scene opens in (defaultPreviz). Cosmetic, but rename it if you're juggling several shots.render_name- the folder underoutput/previzthe node reads back (defaultshot). The render dialog's Name field writes this same value, so they stay in sync - change it in one place and the other follows.
Then there's model, optional: wire a MESH or any 3D-file output into it (the kind Load 3D and the Hunyuan3D wrappers emit) and it's pushed into the scene as one more item to stage. Generated an asset and want it in your previz? This is the door. scene_data is the hidden one - leave it alone.
Three outputs come back: images (the rendered shot as an IMAGE batch - exactly what you'd wire into a depth preprocessor, ControlNet, or a video model's conditioning), frame_count (INT, the batch length), and fps (FLOAT, the scene's frame rate; 24 if the scene says nothing).
Install
ComfyUI Manager, search ComfyUI-ImageViewer, install, restart. The registry publisher is sebastianzilius; older threads link the repo as bEpic-studio/ComfyUI-ImageViewer, so if a clone URL 404s, go through the Manager instead.
Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/szprivate/ComfyUI-ImageViewer.git
pip install -r ComfyUI-ImageViewer/requirements.txt
That pulls Pillow, numpy, usd-core and trimesh. usd-core is the heaviest of the four, but it's a wheel, so nothing compiles. The README only names three; trimesh is in requirements.txt, which is what actually installs. Video rendering needs imageio-ffmpeg (VideoHelperSuite drags it in, otherwise pip it yourself) - and that same dependency is what lets the node decode an MP4 render back into images.
After a restart you get a Toggle bEpic Image Viewer button in the action bar and an Open in Image Viewer button on this node. Press the latter and you're on an empty scene - no run needed, since the scene travels in the workflow rather than the queue.
Where people get burned
Black frames. You wired images into the graph before rendering the shot. Press Render… in the viewer and run again.
"Nothing on this install could decode it." You rendered MP4 but have neither imageio-ffmpeg nor OpenCV. Render a PNG sequence instead - no encoding involved, and the node reads the folder directly.
The node runs, but the viewer never updates. It isn't marked as an output node, so it only executes if something downstream pulls on images or frame_count. Wire any preview or save node to it.
Scene opens on another machine and everything's a red !. Models are stored by path, not copied in. Drag-in from your desktop does get copied to input/3d, but a scene built from files elsewhere on your disk expects them to still be there. Saved scenes live in output/3d_scenes.
One last thing, and it isn't a bug: this pack is free for personal and non-commercial use only, with commercial use prohibited without written permission. If you're doing client work, have that conversation before you build a pipeline on it.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| tab_name | STRING | Previz | — |
| render_name | STRING | shot | — |
| modelopt | * | — | |
| scene_dataopt | STRING | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| frame_count | INT | — |
| fps | FLOAT | — |