Files
Alexankharin-camera-comfyUI/workflows/pointcloud_walker.json
T
Alexander KharinandClaude Fable 5 d77af07189 Apply workflow improvements: runnable defaults, templates, dep trim, CI
- 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>
2026-07-16 18:49:14 +03:00

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
}