Nodes/ComfyUI-Charon/CHARON Camera From DA3
ComfyUI Node

CHARON Camera From DA3

Get a real camera into Nuke without typing a single matrix

By keghoang·Created 9 months ago·Updated 9 months ago· 0
CHARON Camera From DA3
    • nukecam_file
    • nukecam_text
    extrinsics_json
    intrinsics_json
    batch_index0
    image_width1920
    image_height1080
    sensor_width_mm36.00
    transform_json
    save_nukecamtrue
    nukecam_prefixcharon_camera

    If you've ever tried to move a scanned or reconstructed scene into Nuke, you know the pain: a pile of camera JSON, a few 4×4 extrinsics matrices, and the joy of hand-translating them into a Camera3 node. CHARON_Camera_From_DA3 is the node that does that translation for you. Paste in the JSON your capture tool exported, get back a ready-to-paste Nuke camera - focal length, apertures, translate and rotate all filled in.

    It's the tail end of the CHARON pipeline. Your scan tool (the "DA3" in the name - the format ships per-image intrinsics/extrinsics JSON) produces the cameras, CHARON_3D_Auto_Align orients the mesh, and this node turns the captured cameras into something compositing software actually speaks.

    The math is the reason this node exists. DA3 extrinsics are world-to-camera; the node inverts them to camera-to-world, pulls the camera position, and converts the rotation to Euler XYZ degrees. The clever bit is the focal length: pixel-space intrinsics (fx, fy from the K matrix) don't paste into Nuke, so it converts to physical millimeters - fx * sensor_width_mm / image_width - and derives the vertical aperture from your image aspect ratio. That's exactly the step people botch doing it by hand.

    The inputs that matter:

    • extrinsics_json / intrinsics_json - multiline STRING inputs. Paste DA3's output in (or wire it from a node that emits the JSON); there's no file-path input.
    • batch_index - which captured frame to use (0–999). Your JSON is a list of per-image cameras; this picks one.
    • image_width / image_height - must match your source resolution, or the vertical aperture comes out wrong.
    • sensor_width_mm - defaults to 36 (full-frame). It scales the focal conversion, so don't leave it if your camera isn't a full-frame stand-in.
    • transform_json (optional) - feed it the output of CHARON_3D_Auto_Align to move the camera so it matches the aligned mesh. That chaining is the whole point of the pack.

    Outputs are nukecam_file (a .nukecam path in ComfyUI's output folder, if save_nukecam is on) and nukecam_text (the Camera3 snippet itself). To use it, paste nukecam_text into Nuke's script editor and run - or drag the saved file in. The snippet targets Nuke 16.0 (version 16.0 v3), which newer versions read fine. The node also advertises the file in ui.files, so it shows up in Comfy's history like a rendered image.

    Where people get burned: the JSON shape is specific. The node expects DA3's format, roughly {"extrinsics": [{"image_0": [[...]]}]} - if you feed it someone else's reconstruction export you'll get "Missing 'extrinsics' list in JSON" or "Batch index X out of range". And the transform_json composition is additive Euler/translation - fine for the align node's small corrections, but don't expect it to chain arbitrary transforms.

    No API, no key, all local. It's a niche node for a niche pipeline - but if you're on that pipeline, it's the difference between ten minutes of spreadsheet work and a paste.

    Install (shared with the whole pack):

    cd ComfyUI/custom_nodes
    git clone https://github.com/keghoang/ComfyUI-Charon
    cd ComfyUI-Charon
    pip install -r requirements.txt   # only trimesh; NumPy ships with ComfyUI
    

    Restart ComfyUI, and the nodes appear under CHARON/3D. ComfyUI Manager can also install it - search "ComfyUI-Charon". No model downloads, no keys.

    CategoryCHARON/3D

    Inputs (9)

    NameTypeDefaultDescription
    extrinsics_jsonSTRINGDA3 extrinsics JSON output
    intrinsics_jsonSTRINGDA3 intrinsics JSON output
    batch_indexINT00–999Which image index to extract
    image_widthINT1920Source image width in pixels
    image_heightINT1080Source image height in pixels
    sensor_width_mmFLOAT36.00Virtual sensor width (horizontal aperture) in mm
    transform_jsonoptSTRINGOptional transform JSON from CHARON_3D_Auto_Align (rotation/translation)
    save_nukecamoptBOOLEANtrueWrite a .nukecam text snippet to the output directory
    nukecam_prefixoptSTRINGcharon_cameraFilename prefix for .nukecam export

    Outputs (2)

    NameTypeDescription
    nukecam_fileSTRING
    nukecam_textSTRING