
I'm not a 3D artist. I'm a landscape photographer who spent 22 days walking the John Muir Trail with one camera and one wide-angle lens - and a machine-learning engineer the rest of the year. This is a story about what happened when those two halves finally talked to each other: today, every photograph in my portfolio has a "View in 3D" button, and the gaussian splat behind it was generated from the photograph alone.
The problem flat images have
Photographers spend enormous effort compressing a three-dimensional experience into two dimensions, and the compression is lossy in a way that never stops hurting. I stood at Precipice Lake, high on Sequoia's High Sierra Trail, in the morning, with granite walls rising out of dark water in three distinct planes of depth. The photograph is good. The depth is gone.
Radiance fields felt like the obvious answer, except for one practical detail: I shoot photographs, not captures. On a three-week thru-hike there is no orbiting a subject for a multi-view dataset - you get one frame, in one moment of light, and then you keep walking because you have twelve more miles before camp. If 3D was going to happen for this work at all, it had to come from single images, after the fact.
The pipeline
Monocular splat generation crossed the "good enough to ship" line for me with Apple's SHARP. My production pipeline is deliberately boring:
1. SHARP runs on the full-size JPEG of each photo (it resizes internally to 1536px, so feeding it more resolution than that buys nothing).
2. The raw splats go through a 50% pairwise-merge decimation, then compress to .sog via @plaach photo lands at roughly 6 MB.
3. The same pass rasterizes a 768×768 grayscale depth map (60–110 KB) from the splat's geometry - more on why below.
4. Everything is incremental: one Python command finds photos missing their 3D assets and pr a new gallery to the site costs one command and a coffee.
The whole portfolio - a couple hundred photographs - is about 1.1 GB of `.sog`. It runs this way because I refuse to maintain a pipeline that needs babysitting; if generating the 3D asset required per-image fiddling, this feature would have died in a week.
The trick that makes it feel like magic
The splat viewer runs on the PlayCanvas engine, and the single most important decision in the whole project has nothing to do with ML: the camera initializes at the photograph's actual capture field of view, computed from the EXIF focal length, so the first frame of the 3D view is pixel-aligned with the flat photo you were just looking at. Then you move the mouse, and the photograph becomes a space.
That alignment is the entire experience. A splat presented as "a 3D scene" invites you to judge it as 3D - and a monocular splat will lose that judgment, because the occluded regions are guesses. A splat presented as a photograph that yields when you lean into it gets judged as photography, and there it wins. The medium works when you frame it as depth added to an image, not geometry reconstructed from one.
There's a cheaper sibling for browsing: in gallery grids, hovering any photo gets depth-displaced parallax driven by that 768×768 depth map, rendered on a single shared WebGL canvas rather than per-tile contexts. It's a whisper of the full effect at 1% of the bandwidth, and it teaches visitors that the photos here have depth before they ever open the lightbox.
What doesn't work (yet)
Honesty section. Mobile is unsupported entirely. Splat rendering is expensive in both compute and memory, mobile hardware spans an enormous performance range, and 6 MB per view over a cellular connection is a miserable first impression - rather than ship a degraded version of the effect, I gate it to desktop until I have a real answer. That six megabytes per view is my largest UX cost on desktop too, and I have no progressive-loading story for `.sog` yet.
Long lenses are a compromise. SHARP can't build convincing geometry from telephoto frames - telephoto compression strips out the depth cues it needs, and the resulting splats fall apart. After testing across my catalog's focal lengths I found the threshold where reconstruction stays trustworthy, and the viewer clamps there; telephoto images naturally carry little parallax to recover anyway.
And SHARP has failure modes every photographer will recognize on sight. Out-of-focus regions sometimes land at the wrong depth - the model reads bokeh as geometry. Non-literal scenes confuse it: a star-trail frame has no sane depth interpretation, and it shows. Mist and transparent surfaces do what mist and glass have always done to depth estimation. And there's an irony built into the physics: deep-depth-of-field ultra-wide frames produce the strongest 3D effect - which means they also invite you to lean furthest into the scene, where you discover the medium's honest limit. Look "behind" a foreground boulder and there's nothing there but median-colored noise, because the photograph never knew what was behind it either.
Why I think this matters beyond my website
Every working photographer is sitting on an archive of thousands of single images. None of them will ever be re-captured as multi-view datasets - the moments are gone. Monocular splat generation means that the entire body of existing photography is now addressable as a 3D display medium, with a pipeline a single person can run. The capture side of radiance fields gets most of the attention; I'd argue the archive side is the bigger audience, and it's photographers - not 3D artists - who will walk through that door.
See it live (desktop): danilzanozin.com - any photo, "View in 3D." The John Muir Trail gallery at danilzanozin.com/jmt is where I'd start.

Written by Danil Zanozin
Danil Zanozin is a landscape photographer and machine-learning engineer in California. His portfolio at danilzanozin.com pairs long-trail photo essays - the John Muir Trail, the High Sierra Trail, the Grand Canyon - with a self-built pipeline that gives every photograph a gaussian-splat depth view.
New to Gaussian Splatting? Start here




