Nodes/ComfyUI_GaussianSplatToMesh/🔷 Gaussian Splat to Mesh
ComfyUI Node

🔷 Gaussian Splat to Mesh

Your HY-World 2.0 splats aren't a mesh yet — this node fixes that

By toriumi·Created 3 months ago·Updated 3 months ago· 0
🔷 Gaussian Splat to Mesh
  • ply_data
  • trimesh
methodmarching_cubes
alpha2.0
resolution256
radius_factor2.0
max_points200000
remove_outlierstrue
outlier_std_ratio2.0
density_filtertrue
density_percentile5
color_knn5
smooth_sigma1.5

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=0 gives 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 on marching_cubes unless 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 upstream ComfyUI_HYWorld2 for a current output layout; v2.1 of this pack fixed the pts3d_filtered color 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.

Category3D/mesh

Inputs (12)

NameTypeDefaultDescription
ply_dataPLY_DATA
methodoptCOMBOmarching_cubesSurface 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)
alphaoptFLOAT2.00–100Alpha for alpha_shape (0=convex hull, larger=more detail). Typical: 1.0-5.0
resolutionoptINT25664–512Voxel grid resolution for marching_cubes/poisson_like
radius_factoroptFLOAT2.00.5–10Radius multiplier for ball_pivoting method
max_pointsoptINT20000010000–1000000Maximum number of points (voxel-downsampled if exceeded)
remove_outliersoptBOOLEANtrueRemove statistical outlier points before reconstruction
outlier_std_ratiooptFLOAT2.00.5–5Std dev ratio for outlier removal (lower = more aggressive)
density_filteroptBOOLEANtrueRemove sparse/isolated points based on local density
density_percentileoptFLOAT50–30Percentile threshold for density filter (higher = more aggressive)
color_knnoptINT51–20Number of nearest neighbors for vertex color interpolation
smooth_sigmaoptFLOAT1.50.5–5Gaussian smoothing sigma for marching_cubes density field

Outputs (1)

NameTypeDescription
trimeshTRIMESH