Skip to main content

Image to Gaussian splat, from a single photo

Every generation here returns two files. The one people come for is the mesh. The other is a 3D Gaussian splatting .ply — a few hundred thousand coloured, oriented, semi-transparent ellipsoids that reproduce how the subject looks rather than what shape it is. Same run, same credits, no extra step.

Is this the file you want?

Probably not, and it is cheaper to find out here: a splat has no surface. You cannot slice it, print it or retopologise it, and you can only animate one through an experimental proxy-mesh transfer. If the plan is a physical object, the mesh is the file you want and the STL route is the page you want. A splat earns its size when the goal is to show the thing — on a page, in a pitch, inside a viewer someone can spin.

How to tell a Gaussian splat .ply from a mesh .ply

This is the trap in the format, and it catches people long before they reach any particular product. .ply is a container, not a content type. A mesh exported from Blender and a splat trained from photographs share the extension and share nothing else, so "I downloaded a .ply" tells you almost nothing about what you have.

The header settles it. Open the file in a text editor — the first couple of kilobytes are ASCII even when the body is binary — and look at the property lines before end_header. In the standard, uncompressed layout — which is what you get from us, and from a training run — four of them decide it:

f_dc_0
The DC term of the spherical harmonics — the base colour of that one splat before any view-dependent shading is added.
opacity
How solid the splat is. A mesh has faces that are simply there; a splat fades, and this is the number that fades it.
scale_0
The first of three axis scales. Each splat is an ellipsoid, not a point, and this is how wide it is on one axis.
rot_0
The first component of the rotation quaternion that orients that ellipsoid in space.

A mesh .ply has none of the four; an uncompressed splat has all four, plus a long tail of f_rest_* harmonics for view-dependent colour.

One trap inside the trap. A splat saved through PlayCanvas's compressed PLY — what SuperSplat's "Compressed Ply File" export writes, and therefore what you will have if you clean your splat there — keeps the extension and keeps none of those four names. It quantises everything into packed_position, packed_rotation, packed_scale, packed_color against a chunk element that stores the ranges. So the honest rule is: either set of names means splat, and only a file with neither is a mesh. We got this wrong at first — our own splat viewer called a compressed splat a mesh until 2026-09-10, which is a strange thing to do to a file produced by the tool we recommend two sections below.

The check the viewer runs is the one described here, from the same list of names this page is rendered from. It refuses only on positive evidence that neither layout is present; when it cannot tell, it lets the file through, because a viewer that rejects a valid file is a worse failure than one that renders nothing.

Make one

Upload a photo. The mesh appears first; the splat is fetched afterwards and shows up as a second download in the same result panel.

Generator

Every model exports as GLB, OBJ, STL and PLY — you pick the format after it is done, not before.

Or try a real example:
Example · one photo in · 22,002 triangles · 1024px texture
Violet flexi dragon · 1024px texture · GLB
The source image: a purple and teal cartoon dragon figure seen from the front
Input

A real Sculptly output from our benchmark run — your result appears here once you upload an image.

What actually lands in your downloads

  • One file, about 25 MB. The mesh from the same run is around a megabyte. A splat carries colour, opacity, scale and rotation for every one of several hundred thousand points, and that is where the difference goes.
  • It is a bonus, not a guarantee. The splat is requested alongside the mesh and fetched only after the mesh is safely stored. If it does not come back, the generation still succeeded — and the download button simply is not rendered, because a button that 404s is worse than no button.
  • Older generations have none. Anything made before the option was switched on has a mesh and nothing else. Regenerating produces both.

Where to open it

Your operating system's 3D preview will not do it. Neither will most "PLY viewers", which predate the format's second life. These will (all checked 2026-09-10):

  • Our browser viewer — drag the file in, nothing uploads, no account. It runs GaussianSplats3D on three.js.
  • SuperSplat — PlayCanvas's editor, MIT-licensed and browser-based: "a free and open source tool for inspecting, editing, optimizing and publishing 3D Gaussian Splats". Use this one when you want to crop or clean the result, not just look at it.
  • 3DGS Render for Blender — a free add-on whose stated job is to "import and view 3DGS .ply files in Blender", if the splat has to sit in a scene you are already lighting.

What one photograph cannot know

A splat trained from twenty photographs shot around a subjectmeasures the back of it. A splat inferred from one image guesses. The difference shows up the moment you orbit past about forty-five degrees: geometry the camera never saw gets softer, vaguer, and occasionally invents a detail that was never there. Thin structures — wire, hair, chain, anything the width of a few pixels — fare worst, because there was never enough evidence to place them in depth.

This is worth stating plainly because it is the honest boundary of single-image work generally, ours included. If you need a splat that holds up from every angle, shoot the subject properly and use a multi-view pipeline. If you need one good angle from one photo you already have, this is a minute's work instead of an afternoon's.

Among the tools we compare on the comparison page, none returned a Gaussian splat from a single image at the last check — the ones that export .ply at all export a point-mesh container, and Rodin's site does not mention splatting anywhere as of 2026-09-10. That is a statement about what we found on their own pages, not a claim about their roadmaps.

Questions people actually ask

Can I 3D print a Gaussian splat?

No. A splat has no surface — nothing for a slicer to compute a shell from. Printing needs the mesh, which the same generation already gave you as a .glb, and which the STL route converts. The splat is for looking at, not for making.

Does every generation produce a splat?

Almost always, but not by contract. The splat is a second file from the same model run, and the code treats a missing one as a normal outcome rather than a failure — so the download button only appears when the file actually exists. Anything generated before the option was switched on has no splat at all.

How big is the file?

Around 25 MB, against roughly one megabyte for the mesh from the same run. A splat stores dozens of numbers per point and there are hundreds of thousands of points; that is where the size goes.

Why does my .ply open as a grey blob?

Because the viewer read it as a point cloud or a mesh. Almost every generic .ply viewer does. Open it in something that renders 3D Gaussian Splatting specifically, and check the header for either set of property names listed above before blaming the file.

Is this the same as photogrammetry or a NeRF capture?

No, and the difference is the input. Photogrammetry and most splat pipelines want twenty or more photographs shot around the subject. This one starts from a single image, so everything the camera never saw is inferred rather than measured.

Do I need an account?

The first generation runs without one. The splat download sits with the mesh download in the result panel afterwards.

Next: open a splat · get a printable STL instead · work out which route your photos need · what a generation costs