{ "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 }