🔷 Gaussian Splat to Mesh
Your HY-World 2.0 splats aren't a mesh yet — this node fixes that
- ply_data
- trimesh
Gaussian Splatting output is gorgeous and useless. You can spin it around and it looks photorealistic, but a splat cloud is not a mesh - no faces, no topology, nothing Blender, Unity, or a 3D printer can chew on. That's the hole this node fills.
It sits at the end of the HY-World 2.0 pipeline. Tencent's world model, released publicly in April 2026, shipped only the Gaussian Splatting half of the demo - the part that reconstructs a 3D scene as a point cloud from a flat image. In ComfyUI, AHEKOT's ComfyUI_HYWorld2 pack wraps that in a VNCCS_WorldMirrorV2_3D node that outputs a PLY_DATA object. GaussianSplatToMesh is the one-node companion that turns that PLY_DATA into a real triangle mesh (TRIMESH), which you then hand to Hy3DExportMesh to write out GLB/OBJ/PLY/STL. One image in, splat cloud in the middle, exportable model out.
Why this pack exists at all is worth knowing: Open3D - the usual tool for point-cloud-to-mesh work - has no wheels for Python 3.13, and that's the Python more and more ComfyUI installs run now. So the author reimplemented surface reconstruction with scipy + trimesh, no Open3D dependency. That's the whole pitch, and it's a good one.
How it works
The node does three things in sequence. First it extracts points and colors from the PLY_DATA dict, trying a handful of key layouts (splats.means, pts3d_filtered, pts3d) and color sources (spherical-harmonic coefficients, source images, features_dc). v2.1 fixed a real bug here where the pts3d_filtered path came out color-less - if your export shows up gray, this is the code that used to be broken.
Then it cleans the cloud: optional statistical outlier removal, a density filter for sparse stragglers, and voxel downsampling if you're over max_points (200k default). Voxel downsampling keeps the spatial structure, unlike naive random thinning, so you don't lose much by trimming. Finally it reconstructs a surface with one of four methods:
marching_cubes(default) - voxelizes the cloud into a density field, Gaussian-smooths it, extracts the iso-surface. Smooth and recommended, but it needs scikit-image.poisson_like- estimates normals, splats signed distances into a grid, extracts at level zero. Best quality, slowest. Also needs scikit-image.alpha_shape- Delaunay triangulation filtered by circumradius. Fast, but expect holes;alpha=0gives a convex hull.ball_pivoting- an approximate version using multi-scale edge-length filtering.
Last, it transfers color from the source points onto the mesh vertices with KNN interpolation (color_knn) and fixes normals so your export isn't a lighting disaster.
Inputs and outputs that matter
The only required input is ply_data. Everything else has sane defaults, and you'll mostly touch two knobs:
method- the four-way pick above. Leave it onmarching_cubesunless you're chasing speed (alpha_shape) or quality (poisson_like).max_points- how many points the pipeline keeps. Lower it if the node is grinding; the voxel downsampler preserves structure, so you won't lose much.
Switch methods and the matching controls appear: alpha (0 = convex hull, ~1–5 typical), resolution (the voxel grid for marching_cubes/poisson_like, 256 default), radius_factor for ball pivoting, plus the cleanup knobs (outlier_std_ratio, density_percentile, smooth_sigma). One output, trimesh - wire it straight into Hy3DExportMesh.
Install
ComfyUI Manager: search "ComfyUI_GaussianSplatToMesh" and install. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/toriumi/ComfyUI_GaussianSplatToMesh.git
Then restart ComfyUI. No requirements.txt ships, because numpy/torch/scipy/trimesh are already in your ComfyUI environment. The one gotcha: the default marching_cubes (and poisson_like) import scikit-image. Most desktop installs have it, but if you hit an ImportError, pip install scikit-image and restart.
Common issues
- "Alpha shape produced no faces" - your alpha is too aggressive for the point density. Lower it, or switch to marching_cubes.
- Mesh comes out flat gray - colors weren't found in the
PLY_DATA. Reinstall the upstreamComfyUI_HYWorld2for a current output layout; v2.1 of this pack fixed thepts3d_filteredcolor path, so update this one too. - It's slow - that's usually the upstream node, honestly. HY-World 2.0 itself wants a big GPU (the author of the ComfyUI integration tests at 16 GB VRAM and up). This node is the cheap part of the chain.
That's the whole thing. If you're already running HY-World 2.0 splats and want something you can drop into Blender or a game engine, this is the missing step - and the only pack that does it without fighting Open3D on Python 3.13.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| ply_data | PLY_DATA | — | |
| methodopt | COMBO | marching_cubes | Surface reconstruction method: - marching_cubes: Volumetric reconstruction (recommended, smooth) - poisson_like: Normal-based surface reconstruction (best quality, slower) - alpha_shape: Delaunay-based alpha shape (fast) - ball_pivoting: Approximate ball pivoting (good edge filtering) |
| alphaopt | FLOAT | 2.00–100 | Alpha for alpha_shape (0=convex hull, larger=more detail). Typical: 1.0-5.0 |
| resolutionopt | INT | 25664–512 | Voxel grid resolution for marching_cubes/poisson_like |
| radius_factoropt | FLOAT | 2.00.5–10 | Radius multiplier for ball_pivoting method |
| max_pointsopt | INT | 20000010000–1000000 | Maximum number of points (voxel-downsampled if exceeded) |
| remove_outliersopt | BOOLEAN | true | Remove statistical outlier points before reconstruction |
| outlier_std_ratioopt | FLOAT | 2.00.5–5 | Std dev ratio for outlier removal (lower = more aggressive) |
| density_filteropt | BOOLEAN | true | Remove sparse/isolated points based on local density |
| density_percentileopt | FLOAT | 50–30 | Percentile threshold for density filter (higher = more aggressive) |
| color_knnopt | INT | 51–20 | Number of nearest neighbors for vertex color interpolation |
| smooth_sigmaopt | FLOAT | 1.50.5–5 | Gaussian smoothing sigma for marching_cubes density field |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| trimesh | TRIMESH | — |