Card 3D
Turn a flat clip into a card floating in 3D space
- video
- video
If you've ever wanted a piece of footage to sit on a virtual wall, swing in from depth for a title card, or fake a camera move without re-rendering anything, this is the node. Card 3D takes a COMFYTV_VIDEO clip, maps it onto a flat plane, and lets you translate, rotate, and scale that plane under a perspective camera - then projects it back to 2D. Because it's a true 3D projection and not a 2D warp, tilting the card gives you correct perspective foreshortening: the near edge gets bigger, the far edge squashes. It's the ComfyTV version of the Card node in Nuke or a 3D layer in After Effects.
In practice that means two jobs. The first is faking camera moves - swing footage in perspective for an intro, or push a card toward the camera for a reveal. The second is compositing: tilt a plate so it reads as sitting on a floor or against a wall, then build a simple parallax "photo in space" look.
How it works
The stage builds an fx spec (card3d) with your parameters and passes the video through for the renderer - the pack's own docs describe it as running on a Torch backend as an fx-spec pass, with a ▶ Run and a live preview on the node. If you haven't changed anything - no translation, no rotation, scale 1.0 - it's a clean pass-through, no render wasted.
Inputs and output are COMFYTV_VIDEO; to hand the result to native ComfyUI nodes you add a Bridge, which is true of every ComfyTV video stage.
The inputs that matter
There are eight, and honestly only three groups you'll fiddle with:
- fov - camera field of view in degrees, 5–140 (default 40). Lower is a longer lens (flatter, subtler perspective); higher is wide-angle (dramatic tilt).
- tx / ty / tz - move the card in 3D.
tx/tyslide it horizontally/vertically (−4 to 4);tzpushes it toward (negative, −0.95) or away (positive, up to 6) from the camera. - rx / ry / rz - rotation: pitch (
rx) and yaw (ry) tilt the card into perspective, each capped at ±89 so it can't go fully edge-on;rzis in-plane roll, ±180.
card_scale (0.05–8, default 1) resizes the plane before it's placed. Output is video (COMFYTV_VIDEO).
Installing it
cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV
Restart the backend, not the tab; nodes appear under the ComfyTV category. ComfyUI Manager finds it by searching "ComfyTV". The README's two recurring gotchas: on Desktop/macOS/multi-install setups the relative cd can clone into the wrong instance - read the startup log for the base path it actually loaded and clone into that absolute path, quoted - and the first level of custom_nodes/ComfyTV/ must contain __init__.py (fix a nested ComfyTV/ComfyTV/… by moving the inner folder up). No Python dependencies to install.
Tips that cost nothing
Keep rx/ry inside ±89, or the card swings edge-on and the perspective gets silly. Use a low fov when you want the move to feel subtle and telephoto; crank it up for drama. And tz combined with a rotation is the classic "card swinging in from depth" trick. The docs pair this with Z Defocus for depth of field, which makes a tilted card read as genuinely 3D instead of just warped - that combo is worth one pass through an FX Chain.
If the node doesn't seem to do anything, check you actually changed a value - all-neutral is a deliberate pass-through.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| fov | FLOAT | 405–140 | — |
| tx | FLOAT | 0.00-4–4 | — |
| ty | FLOAT | 0.00-4–4 | — |
| tz | FLOAT | 0.00-0.95–6 | — |
| rx | FLOAT | 0.0-89–89 | — |
| ry | FLOAT | 0.0-89–89 | — |
| rz | FLOAT | 0.0-180–180 | — |
| card_scale | FLOAT | 1.000.05–8 | — |
| videoopt | COMFYTV_VIDEO | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| video | COMFYTV_VIDEO | — |