- Bundle example inputs (example_inputs/: pinhole + fisheye JPEG, example trajectory .npy); install.py copies them into ComfyUI's input/ folder and every LoadImage/LoadTrajectory default now points at them, so the shipped workflows queue on a fresh install. - Template browser: add same-name .jpg thumbnails for 10 workflows (workflows/ is already a recognized template dir); drop the stray workflows/__init__.py. - Move superseded reference graphs to workflows/legacy/ (SD-checkpoint outpaint variant, manual multi-view fisheye depth) - out of the template browser, still documented. - video_camera.json: remove dead-end BlurMaskFast (radius 0/0 no-op), easy-mathInt pad math and dangling VHS_VideoInfo; swap KJNodes GetImageRangeFromBatch for built-in ImageFromBatch. Pack deps cut from five to two (VideoHelperSuite + Florence2). - New workflows/record_trajectory.json - produces the .npy trajectory that PC_enricher and wan_vace_ref_to_video consume. - Stamp extra.camera_comfyui_rev=1 in all workflows for future migrations; prune 8 pre-existing stale link references found by a bidirectional integrity sweep. - CI: .github/workflows/validate.yml runs the schema validator, installer-logic tests and 4D smoke suite (CPU torch) on PRs and main. - README + docs/workflows_review.md updated accordingly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
782 lines
15 KiB
JSON
782 lines
15 KiB
JSON
{
|
|
"id": "016c13e5-c6a7-4b2e-adfc-18e9e969f21e",
|
|
"revision": 0,
|
|
"last_node_id": 21,
|
|
"last_link_id": 32,
|
|
"nodes": [
|
|
{
|
|
"id": 10,
|
|
"type": "SaveWEBM",
|
|
"pos": [
|
|
3352.103515625,
|
|
1535.6951904296875
|
|
],
|
|
"size": [
|
|
315,
|
|
437
|
|
],
|
|
"flags": {},
|
|
"order": 8,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "images",
|
|
"name": "images",
|
|
"type": "IMAGE",
|
|
"link": 24
|
|
},
|
|
{
|
|
"localized_name": "filename_prefix",
|
|
"name": "filename_prefix",
|
|
"type": "STRING",
|
|
"widget": {
|
|
"name": "filename_prefix"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "codec",
|
|
"name": "codec",
|
|
"type": "COMBO",
|
|
"widget": {
|
|
"name": "codec"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "fps",
|
|
"name": "fps",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "fps"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "crf",
|
|
"name": "crf",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "crf"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [],
|
|
"properties": {},
|
|
"widgets_values": [
|
|
"ComfyUI",
|
|
"vp9",
|
|
24,
|
|
32
|
|
]
|
|
},
|
|
{
|
|
"id": 4,
|
|
"type": "TransformPointCloud",
|
|
"pos": [
|
|
2458.775390625,
|
|
1405.860595703125
|
|
],
|
|
"size": [
|
|
329.20001220703125,
|
|
46
|
|
],
|
|
"flags": {},
|
|
"order": 5,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "pointcloud",
|
|
"name": "pointcloud",
|
|
"type": "TENSOR",
|
|
"link": 4
|
|
},
|
|
{
|
|
"localized_name": "transform_matrix",
|
|
"name": "transform_matrix",
|
|
"type": "MAT_4X4",
|
|
"link": 5
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "transformed pointcloud",
|
|
"name": "transformed pointcloud",
|
|
"type": "TENSOR",
|
|
"links": [
|
|
23
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "TransformPointCloud"
|
|
},
|
|
"widgets_values": []
|
|
},
|
|
{
|
|
"id": 5,
|
|
"type": "TransformToMatrix",
|
|
"pos": [
|
|
2296.978759765625,
|
|
1742.214599609375
|
|
],
|
|
"size": [
|
|
315,
|
|
154
|
|
],
|
|
"flags": {},
|
|
"order": 0,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "shiftX",
|
|
"name": "shiftX",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "shiftX"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "shiftY",
|
|
"name": "shiftY",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "shiftY"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "shiftZ",
|
|
"name": "shiftZ",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "shiftZ"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "theta",
|
|
"name": "theta",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "theta"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "phi",
|
|
"name": "phi",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "phi"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "transformation matrix",
|
|
"name": "transformation matrix",
|
|
"type": "MAT_4X4",
|
|
"links": [
|
|
5,
|
|
25
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "TransformToMatrix"
|
|
},
|
|
"widgets_values": [
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
],
|
|
"title": "Camera move (edit me)"
|
|
},
|
|
{
|
|
"id": 2,
|
|
"type": "DepthToPointCloud",
|
|
"pos": [
|
|
2099.81640625,
|
|
1385.9761962890625
|
|
],
|
|
"size": [
|
|
315,
|
|
170
|
|
],
|
|
"flags": {},
|
|
"order": 4,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "image",
|
|
"name": "image",
|
|
"type": "IMAGE",
|
|
"link": 1
|
|
},
|
|
{
|
|
"localized_name": "depthmap",
|
|
"name": "depthmap",
|
|
"shape": 7,
|
|
"type": "TENSOR",
|
|
"link": 32
|
|
},
|
|
{
|
|
"localized_name": "mask",
|
|
"name": "mask",
|
|
"shape": 7,
|
|
"type": "MASK",
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "input_projection",
|
|
"name": "input_projection",
|
|
"type": "COMBO",
|
|
"widget": {
|
|
"name": "input_projection"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "input_horizontal_fov",
|
|
"name": "input_horizontal_fov",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "input_horizontal_fov"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "depth_scale",
|
|
"name": "depth_scale",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "depth_scale"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "invert_depth",
|
|
"name": "invert_depth",
|
|
"type": "BOOLEAN",
|
|
"widget": {
|
|
"name": "invert_depth"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "pointcloud",
|
|
"name": "pointcloud",
|
|
"type": "TENSOR",
|
|
"links": [
|
|
4,
|
|
26
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "DepthToPointCloud"
|
|
},
|
|
"widgets_values": [
|
|
"PINHOLE",
|
|
60,
|
|
1,
|
|
false
|
|
]
|
|
},
|
|
{
|
|
"id": 14,
|
|
"type": "CameraMotionNode",
|
|
"pos": [
|
|
2984.30224609375,
|
|
1486.6483154296875
|
|
],
|
|
"size": [
|
|
315,
|
|
198
|
|
],
|
|
"flags": {},
|
|
"order": 7,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "pointcloud",
|
|
"name": "pointcloud",
|
|
"type": "TENSOR",
|
|
"link": 23
|
|
},
|
|
{
|
|
"localized_name": "trajectory",
|
|
"name": "trajectory",
|
|
"type": "TENSOR",
|
|
"link": 27
|
|
},
|
|
{
|
|
"localized_name": "n_points",
|
|
"name": "n_points",
|
|
"type": "INT",
|
|
"widget": {
|
|
"name": "n_points"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "output_projection",
|
|
"name": "output_projection",
|
|
"type": "COMBO",
|
|
"widget": {
|
|
"name": "output_projection"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "output_horizontal_fov",
|
|
"name": "output_horizontal_fov",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "output_horizontal_fov"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "output_width",
|
|
"name": "output_width",
|
|
"type": "INT",
|
|
"widget": {
|
|
"name": "output_width"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "output_height",
|
|
"name": "output_height",
|
|
"type": "INT",
|
|
"widget": {
|
|
"name": "output_height"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "point_size",
|
|
"name": "point_size",
|
|
"type": "INT",
|
|
"widget": {
|
|
"name": "point_size"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "motion_frames",
|
|
"name": "motion_frames",
|
|
"type": "IMAGE",
|
|
"links": [
|
|
24
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "CameraMotionNode"
|
|
},
|
|
"widgets_values": [
|
|
10,
|
|
"PINHOLE",
|
|
60,
|
|
1024,
|
|
1024,
|
|
2,
|
|
0,
|
|
false,
|
|
false
|
|
],
|
|
"title": "Render fly-through"
|
|
},
|
|
{
|
|
"id": 17,
|
|
"type": "CameraTrajectoryNode",
|
|
"pos": [
|
|
2722.265380859375,
|
|
1772.097412109375
|
|
],
|
|
"size": [
|
|
317.4000244140625,
|
|
46
|
|
],
|
|
"flags": {},
|
|
"order": 6,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "pointcloud",
|
|
"name": "pointcloud",
|
|
"type": "TENSOR",
|
|
"link": 26
|
|
},
|
|
{
|
|
"localized_name": "initial_matrix",
|
|
"name": "initial_matrix",
|
|
"type": "MAT_4X4",
|
|
"link": 25
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "trajectory",
|
|
"name": "trajectory",
|
|
"type": "TENSOR",
|
|
"links": [
|
|
27
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "CameraTrajectoryNode"
|
|
},
|
|
"widgets_values": [],
|
|
"title": "Build trajectory"
|
|
},
|
|
{
|
|
"id": 3,
|
|
"type": "DepthEstimatorNode",
|
|
"pos": [
|
|
1570.1402587890625,
|
|
1859.879638671875
|
|
],
|
|
"size": [
|
|
315,
|
|
82
|
|
],
|
|
"flags": {},
|
|
"order": 2,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "image",
|
|
"name": "image",
|
|
"type": "IMAGE",
|
|
"link": 3
|
|
},
|
|
{
|
|
"localized_name": "model_name",
|
|
"name": "model_name",
|
|
"type": "STRING",
|
|
"widget": {
|
|
"name": "model_name"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "depth_scale",
|
|
"name": "depth_scale",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "depth_scale"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "depth tensor",
|
|
"name": "depth tensor",
|
|
"type": "TENSOR",
|
|
"links": [
|
|
31
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "DepthEstimatorNode"
|
|
},
|
|
"widgets_values": [
|
|
"Depth-Anything-V2-Metric-Indoor-Base-hf",
|
|
1.0000000000000002,
|
|
1
|
|
]
|
|
},
|
|
{
|
|
"id": 20,
|
|
"type": "ZDepthToRayDepthNode",
|
|
"pos": [
|
|
1969.0958251953125,
|
|
1782.2877197265625
|
|
],
|
|
"size": [
|
|
210,
|
|
58
|
|
],
|
|
"flags": {},
|
|
"order": 3,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "depth",
|
|
"name": "depth",
|
|
"type": "TENSOR",
|
|
"link": 31
|
|
},
|
|
{
|
|
"localized_name": "fov",
|
|
"name": "fov",
|
|
"type": "FLOAT",
|
|
"widget": {
|
|
"name": "fov"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "ray depth",
|
|
"name": "ray depth",
|
|
"type": "TENSOR",
|
|
"links": [
|
|
32
|
|
]
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "ZDepthToRayDepthNode"
|
|
},
|
|
"widgets_values": [
|
|
90
|
|
]
|
|
},
|
|
{
|
|
"id": 1,
|
|
"type": "LoadImage",
|
|
"pos": [
|
|
1575.78955078125,
|
|
1419.3006591796875
|
|
],
|
|
"size": [
|
|
315,
|
|
314
|
|
],
|
|
"flags": {},
|
|
"order": 1,
|
|
"mode": 0,
|
|
"inputs": [
|
|
{
|
|
"localized_name": "image",
|
|
"name": "image",
|
|
"type": "COMBO",
|
|
"widget": {
|
|
"name": "image"
|
|
},
|
|
"link": null
|
|
},
|
|
{
|
|
"localized_name": "choose file to upload",
|
|
"name": "upload",
|
|
"type": "IMAGEUPLOAD",
|
|
"widget": {
|
|
"name": "upload"
|
|
},
|
|
"link": null
|
|
}
|
|
],
|
|
"outputs": [
|
|
{
|
|
"localized_name": "IMAGE",
|
|
"name": "IMAGE",
|
|
"type": "IMAGE",
|
|
"links": [
|
|
1,
|
|
3
|
|
]
|
|
},
|
|
{
|
|
"localized_name": "MASK",
|
|
"name": "MASK",
|
|
"type": "MASK",
|
|
"links": null
|
|
}
|
|
],
|
|
"properties": {
|
|
"Node name for S&R": "LoadImage"
|
|
},
|
|
"widgets_values": [
|
|
"camera_example_pinhole.jpg",
|
|
"image"
|
|
]
|
|
},
|
|
{
|
|
"id": 21,
|
|
"type": "MarkdownNote",
|
|
"title": "About this workflow",
|
|
"pos": [
|
|
1010.1402587890625,
|
|
1385.9761962890625
|
|
],
|
|
"size": [
|
|
520,
|
|
262
|
|
],
|
|
"flags": {},
|
|
"order": 0,
|
|
"mode": 0,
|
|
"inputs": [],
|
|
"outputs": [],
|
|
"properties": {},
|
|
"widgets_values": [
|
|
"# Point cloud walker (fly-through video)\n\nSingle image → metric depth → point cloud, then **CameraTrajectoryNode** derives a camera path and **CameraMotionNode** renders a fly-through saved as WEBM.\n\n- **Set:** input image; the move in TransformToMatrix (shift XYZ + theta/phi); frames-per-segment (`n_points`) in CameraMotionNode.\n- **Requires:** Depth-Anything V2 (auto-download).\n- **Note:** the pinhole FOV here is 60° — keep DepthToPointCloud and CameraMotionNode FOVs consistent with your input."
|
|
],
|
|
"color": "#432",
|
|
"bgcolor": "#653"
|
|
}
|
|
],
|
|
"links": [
|
|
[
|
|
1,
|
|
1,
|
|
0,
|
|
2,
|
|
0,
|
|
"IMAGE"
|
|
],
|
|
[
|
|
3,
|
|
1,
|
|
0,
|
|
3,
|
|
0,
|
|
"IMAGE"
|
|
],
|
|
[
|
|
4,
|
|
2,
|
|
0,
|
|
4,
|
|
0,
|
|
"TENSOR"
|
|
],
|
|
[
|
|
5,
|
|
5,
|
|
0,
|
|
4,
|
|
1,
|
|
"MAT_4X4"
|
|
],
|
|
[
|
|
23,
|
|
4,
|
|
0,
|
|
14,
|
|
0,
|
|
"TENSOR"
|
|
],
|
|
[
|
|
24,
|
|
14,
|
|
0,
|
|
10,
|
|
0,
|
|
"IMAGE"
|
|
],
|
|
[
|
|
25,
|
|
5,
|
|
0,
|
|
17,
|
|
1,
|
|
"MAT_4X4"
|
|
],
|
|
[
|
|
26,
|
|
2,
|
|
0,
|
|
17,
|
|
0,
|
|
"TENSOR"
|
|
],
|
|
[
|
|
27,
|
|
17,
|
|
0,
|
|
14,
|
|
1,
|
|
"TENSOR"
|
|
],
|
|
[
|
|
31,
|
|
3,
|
|
0,
|
|
20,
|
|
0,
|
|
"TENSOR"
|
|
],
|
|
[
|
|
32,
|
|
20,
|
|
0,
|
|
2,
|
|
1,
|
|
"TENSOR"
|
|
]
|
|
],
|
|
"groups": [
|
|
{
|
|
"id": 1,
|
|
"title": "1. Image → point cloud",
|
|
"bounding": [
|
|
1550.1402587890625,
|
|
1325.9761962890625,
|
|
884.6761474609375,
|
|
635.9034423828125
|
|
],
|
|
"color": "#3f789e",
|
|
"font_size": 24,
|
|
"flags": {}
|
|
},
|
|
{
|
|
"id": 2,
|
|
"title": "2. Trajectory",
|
|
"bounding": [
|
|
2276.978759765625,
|
|
1345.860595703125,
|
|
782.6866455078125,
|
|
570.35400390625
|
|
],
|
|
"color": "#a1309b",
|
|
"font_size": 24,
|
|
"flags": {}
|
|
},
|
|
{
|
|
"id": 3,
|
|
"title": "3. Render & save",
|
|
"bounding": [
|
|
2964.30224609375,
|
|
1426.6483154296875,
|
|
722.80126953125,
|
|
566.046875
|
|
],
|
|
"color": "#8A8",
|
|
"font_size": 24,
|
|
"flags": {}
|
|
}
|
|
],
|
|
"config": {},
|
|
"extra": {
|
|
"ds": {
|
|
"scale": 1.083470594338842,
|
|
"offset": [
|
|
-1328.4875281402603,
|
|
-1380.0248413907814
|
|
]
|
|
},
|
|
"frontendVersion": "1.18.9",
|
|
"camera_comfyui_rev": 1
|
|
},
|
|
"version": 0.4
|
|
}
|