Nodes/ComfyTV/Card 3D
ComfyUI Node

Card 3D

Turn a flat clip into a card floating in 3D space

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Card 3D
  • video
  • video
force_run_token0
project_id
parent_output_id0
fov40
tx0.00
ty0.00
tz0.00
rx0.0
ry0.0
rz0.0
card_scale1.00

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/ty slide it horizontally/vertically (−4 to 4); tz pushes 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; rz is 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.

CategoryComfyTV/VideoFX

Inputs (12)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
fovFLOAT405–140
txFLOAT0.00-4–4
tyFLOAT0.00-4–4
tzFLOAT0.00-0.95–6
rxFLOAT0.0-89–89
ryFLOAT0.0-89–89
rzFLOAT0.0-180–180
card_scaleFLOAT1.000.05–8
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
videoCOMFYTV_VIDEO