<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>PlayCanvas Blog Blog</title>
        <link>https://blog.playcanvas.com/</link>
        <description>PlayCanvas Blog Blog</description>
        <lastBuildDate>Wed, 09 Sep 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[New in SuperSplat: Editor 3.0 Rebuilt on WebGPU]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu</guid>
            <pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped the Publishing API, opening superspl.at up to the wider splat ecosystem. Today is a bigger day. SuperSplat Editor 3.0 is here — the biggest release since 2.0 — and the headline is the editor itself, rebuilt from the ground up on WebGPU. It loads far larger scenes in a fraction of the memory, stays responsive when they get heavy, and comes with a new way to select, color grading for selections and a brand new Appearance panel.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api">the Publishing API</a></strong>, opening superspl.at up to the wider splat ecosystem. Today is a bigger day. <strong>SuperSplat Editor 3.0</strong> is here — the biggest release since 2.0 — and the headline is the editor itself, <strong>rebuilt from the ground up on WebGPU</strong>. It loads far larger scenes in a fraction of the memory, stays responsive when they get heavy, and comes with a new way to select, color grading for selections and a brand new Appearance panel.</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/hayWiaOuddA" title="SuperSplat 3.0: Rebuilt on WebGPU" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-the-editor-rebuilt-on-webgpu">⚡ The Editor, Rebuilt on WebGPU<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-the-editor-rebuilt-on-webgpu" class="hash-link" aria-label="Direct link to ⚡ The Editor, Rebuilt on WebGPU" title="Direct link to ⚡ The Editor, Rebuilt on WebGPU" translate="no">​</a></h3>
<p>Back in June, the SuperSplat Viewer got a <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins">compute-based WebGPU renderer</a></strong> and a big jump in frame rate. SuperSplat 3.0 brings that same philosophy to the editor and goes a lot further. It's a ground-up rewrite of both the renderer and the editor's data model, and the editor is now <strong>WebGPU only</strong>:</p>
<ul>
<li class=""><strong>Projection, frustum culling, compaction, depth sorting and draw submission</strong> for every Gaussian in the scene run on the GPU every frame — a compute projector, a GPU radix sort and indirect drawing. The CPU sort worker is gone.</li>
<li class=""><strong>Splat data lives in chunked GPU storage</strong>, with a small per-Gaussian instance list holding the editable state. The editor no longer keeps full copies of the scene in JavaScript.</li>
<li class=""><strong>Histograms, range selection, color matching, bounds and every selection pass</strong> run as GPU compute, so the tools keep up with scenes of any size.</li>
<li class=""><strong>Exports are streamed</strong> chunk by chunk through splat-transform, so PLY, compressed PLY, SOG, SPZ, <code>.ssproj</code> and Publish no longer materialize the whole scene before writing.</li>
</ul>
<p>The payoff is a dramatic drop in memory use. Here's peak JavaScript heap on a 4.4 million splat scene (a 990 MB PLY), 2.x against 3.0:</p>
<table><thead><tr><th>Operation</th><th>SuperSplat 2.x</th><th>SuperSplat 3.0</th></tr></thead><tbody><tr><td>Scene loaded, idle</td><td>1,557 MB</td><td>105 MB</td></tr><tr><td>Save PLY</td><td>1,722 MB</td><td>623 MB</td></tr><tr><td>Save compressed PLY</td><td>2,982 MB</td><td>1,759 MB</td></tr><tr><td>Save <code>.ssproj</code></td><td>1,723 MB</td><td>790 MB</td></tr><tr><td>Publish</td><td>1,934 MB</td><td>741 MB</td></tr><tr><td>Render 1080p video</td><td>1,673 MB</td><td>142 MB</td></tr></tbody></table>
<p>Scenes that used to exhaust the browser now load and edit comfortably. And because the whole scene is projected and sorted as one on the GPU, you can drop one capture into another and work on them together:</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat3-webgpu-editor.mp4" style="width:100%;height:auto"></video>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p><strong>SuperSplat 3.0 requires WebGPU.</strong> It runs in current Chrome and Edge, Safari 26 or later and Firefox where WebGPU is enabled. On a browser without it (or with hardware acceleration disabled) the editor shows a clear startup message instead of loading. The 2.x editor is preserved on the <a href="https://github.com/playcanvas/supersplat/tree/v2" target="_blank" rel="noopener noreferrer" class="">v2 branch</a>, whose last release is <a href="https://github.com/playcanvas/supersplat/releases/tag/v2.32.5" target="_blank" rel="noopener noreferrer" class="">v2.32.5</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-stochastic-alpha-responsive-at-any-scale">🎲 Stochastic Alpha: Responsive at Any Scale<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-stochastic-alpha-responsive-at-any-scale" class="hash-link" aria-label="Direct link to 🎲 Stochastic Alpha: Responsive at Any Scale" title="Direct link to 🎲 Stochastic Alpha: Responsive at Any Scale" translate="no">​</a></h3>
<p>Sorting tens of millions of Gaussians every frame is the expensive part of rendering a splat. With 3.0, you don't have to pay for it while you're interacting. The new <strong>Stochastic Alpha</strong> mode renders Gaussians opaque and depth-tested with per-fragment coverage — a sort-free, order-independent technique — so orbiting, flying and editing stay fluid no matter how heavy the scene. The moment the scene settles, a fully sorted, blended frame is drawn, so what you see at rest is exact.</p>
<p>You'll find it under <code>Preferences</code> &gt; <code>Rendering</code> &gt; <code>Stochastic Alpha</code>, with four options: <code>Disabled</code>, <code>Enabled</code>, <code>Movement</code> and the new default, <code>Auto</code>. In <code>Auto</code>, the editor keeps rendering fully sorted frames until a sorted frame proves slow on your GPU. Only then does it switch to stochastic rendering during movement, and it drops straight back to sorted rendering when the view gets lighter again. Light scenes never see a difference. Heavy scenes stay responsive. Rings mode works in stochastic frames too.</p>
<p>Here it is on a botanical garden scan of around <strong>20 million Gaussians</strong>:</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat3-stochastic-alpha.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-sphere-brush-selection">🖌️ Sphere Brush Selection<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#%EF%B8%8F-sphere-brush-selection" class="hash-link" aria-label="Direct link to 🖌️ Sphere Brush Selection" title="Direct link to 🖌️ Sphere Brush Selection" translate="no">​</a></h3>
<p>Selecting the parts of a scene you care about is most of the work of editing a splat, so 3.0 adds a new tool for it. The <strong>Sphere Brush</strong> (<code>Shift+B</code>) lets you paint a selection directly onto surfaces in 3D. Every point of your stroke is depth-picked to a world position, forming a path that Gaussians are tested against on the GPU. The brush radius maps to a real-world size at the surface you're painting, and strokes split automatically across depth discontinuities — so the brush follows the surface rather than selecting straight through the scene. You get the object you painted, not everything behind it.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat3-sphere-brush.mp4" style="width:100%;height:auto"></video>
<p>Brush size is shared with the 2D brush (<code>[</code> and <code>]</code>, or <code>Alt</code> + mouse wheel) and the usual add, remove and intersect modifiers apply. The rest of selection has been redesigned around it. The old surface/through toggle is replaced by two independent switches on the bottom toolbar: <strong>Selection Depth</strong> (<code>N</code>) picks only splats on the visible surface, and <strong>Selection Footprint</strong> (<code>M</code>) tests whole Gaussian footprints instead of centers. Every 2D and 3D selection tool honors both, and footprint selection runs on a GPU intersect pass. Zero-alpha splats are now selectable too. Lasso and polygon, and flood and eyedropper, are grouped into <strong>press-and-hold</strong> buttons that remember the last tool you used, with refreshed icons for the brush, box and sphere tools.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-color-adjustments-on-selections">🎨 Color Adjustments on Selections<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-color-adjustments-on-selections" class="hash-link" aria-label="Direct link to 🎨 Color Adjustments on Selections" title="Direct link to 🎨 Color Adjustments on Selections" translate="no">​</a></h3>
<p>Color grading has moved home. The <strong>Colors</strong> section now lives in the Scene Manager on the left, right under Transform, because that's where the rest of your current splat's state is. More importantly, color edits now <strong>apply to your selection</strong> — not just the whole scene. Select the part you want to change, adjust <strong>Tint</strong>, <strong>Temperature</strong>, <strong>Saturation</strong>, <strong>Brightness</strong>, <strong>Black Point</strong>, <strong>White Point</strong> or <strong>Transparency</strong>, and watch the result preview live in the viewport. When you're happy, hit <code>Apply</code> to bake it in, or <code>Reset</code> to start over. With nothing selected, the grade applies to the whole splat as before.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat3-color-selection.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-the-new-appearance-panel">👁️ The New Appearance Panel<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#%EF%B8%8F-the-new-appearance-panel" class="hash-link" aria-label="Direct link to 👁️ The New Appearance Panel" title="Direct link to 👁️ The New Appearance Panel" translate="no">​</a></h3>
<p>How you <em>see</em> a splat while editing it matters as much as how you edit it. The new <strong>Appearance</strong> panel in the right toolbar puts all of that in one place. Under <strong>Display</strong>, toggle <strong>Gaussians</strong>, <strong>Centers</strong> and <strong>Rings</strong> on and off, set the center size and ring thickness, and choose how strongly unselected and selected Gaussians are tinted on each surface. Under <strong>Selection</strong>, pick the selection color and choose whether selected Gaussians show centers, rings and an outline. Every option has a help tooltip with its shortcut.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat3-appearance-panel.mp4" style="width:100%;height:auto"></video>
<p>One behavior change to know about: <strong>display overlays are now off by default</strong>, so a freshly loaded scene shows the real render. Press <code>Tab</code> to toggle every overlay on and off without touching your settings, or turn on any Display toggle to bring them back. This replaces the old Centers/Rings mode switch and the Show/Hide Splats button.</p>
<p>Viewport state has a new home too. The eye button in the right toolbar opens <strong>Overlays</strong> — grid and planes, bounding box and dimensions, camera poses, camera info and a <strong>Frame Timings</strong> diagnostic that graphs live GPU frame time with min, median and p95 over the last second. That leaves <code>Preferences</code> (formerly <code>Settings</code>) for what it should be: application preferences.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-and-more">🧰 And More<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-and-more" class="hash-link" aria-label="Direct link to 🧰 And More" title="Direct link to 🧰 And More" translate="no">​</a></h3>
<p>3.0 is a big release and there's plenty more in it:</p>
<ul>
<li class=""><strong>A reworked grid.</strong> Each grid plane (XZ, XY and YZ) can be toggled independently and the choice is saved with your preferences and your document. Grid levels adapt to the view — large scenes get 100 m and 1000 m lines, close-ups never flood with sub-pixel ones — and analytic antialiasing removes the horizon artifacts and the dither where the grid crossed splats.</li>
<li class=""><strong>A faster orient tool.</strong> Points are now picked on the GPU, like the measure tool. On a 2.4 million Gaussian scene a click dropped from about 8.5 seconds of frozen UI to under 25 ms. <code>F</code> now frames the active sphere, box, measure or orient tool.</li>
<li class=""><strong>Logarithmic histogram controls</strong> in the data panel — separate <strong>Log Counts</strong> and <strong>Log Bins</strong> with signed logarithmic binning and accurate raw-value labels.</li>
<li class=""><strong>Faster camera pose imports</strong> from JSON and COLMAP, batched so the spline and timeline rebuild once.</li>
<li class=""><strong>Orthographic rendering and depth picking</strong> are now correct when the camera is inside the scene bounds.</li>
<li class=""><strong>An installable app that opens your files.</strong> The manifest registers file handlers for <code>.ply</code>, <code>.splat</code>, <code>.sog</code>, <code>.spz</code>, <code>.ksplat</code> and <code>.ssproj</code>.</li>
<li class="">A <strong>complete keyboard shortcuts popup</strong>, a refreshed set of toolbar icons and a long list of stability fixes across selection, drag tools, the data panel and publishing.</li>
<li class="">Built on <strong>PlayCanvas Engine 2.22.0</strong> and <strong>splat-transform 3.3.3</strong>.</li>
</ul>
<p>The full list is in the <strong><a href="https://github.com/playcanvas/supersplat/releases/tag/v3.0.0" target="_blank" rel="noopener noreferrer" class="">3.0.0 release notes</a></strong>.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Upgrading from 2.x</div><div class="admonitionContent_BuS1"><ul>
<li class=""><strong>Hard-refresh once.</strong> The old service worker and offline cache are gone; the first load of 3.0 unregisters them, but if you still see an old build, refresh again.</li>
<li class=""><strong>Overlays are off by default.</strong> Press <code>Tab</code> or enable them in the Appearance panel.</li>
<li class=""><strong>Preferences carry over</strong>, only their homes changed: view toggles are in the Overlays popup, Colors is in the Scene Manager and Stochastic Alpha defaults to <code>Auto</code>.</li>
<li class=""><strong>Projects saved by 3.0</strong> use document version 1, so open them with 3.0 or later. Projects from 2.x still open fine.</li>
</ul></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat and the PlayCanvas Engine are <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone — and the best way to make them better is together. Report an issue, open a pull request or just star the repo to show your support. ⭐</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<p>New to Gaussian splatting on PlayCanvas? Our <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">Gaussian Splatting documentation</a> is the best place to get started, and the <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/editing/supersplat/" target="_blank" rel="noopener noreferrer" class="">SuperSplat user guide</a> covers every tool in the editor.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-editor-3-0-rebuilt-on-webgpu#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>Open <strong><a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">superspl.at/editor</a></strong>, drop in your heaviest scene and tell us how it feels. What should 3.1 bring? Come and find us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> or <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
            <category>webgpu</category>
            <category>performance</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: Introducing the New Publishing API]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api</guid>
            <pubDate>Mon, 17 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped Vibe Code Splat Apps, 360° Video and splat-transform 3.0 — everything you need to turn a splat into a real, shippable app. Today we're opening SuperSplat up to the rest of the ecosystem. A new publishing API lets any capture app, scanner or training pipeline upload straight to superspl.at, and three launch partners are live with it today: Teleport by Varjo, XGRIDS LCC Studio and LichtFeld Studio. If you build splat software, you can ship the same thing.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps">Vibe Code Splat Apps, 360° Video and splat-transform 3.0</a></strong> — everything you need to turn a splat into a real, shippable app. Today we're opening SuperSplat up to the rest of the ecosystem. A new <strong>publishing API</strong> lets any capture app, scanner or training pipeline upload straight to superspl.at, and <strong>three launch partners are live with it today</strong>: <strong>Teleport by Varjo</strong>, <strong>XGRIDS LCC Studio</strong> and <strong>LichtFeld Studio</strong>. If you build splat software, you can ship the same thing.</p>
<div style="display:flex;flex-wrap:wrap;justify-content:center;align-items:flex-start;gap:2rem 3rem;padding:2.25rem 1.5rem;margin-bottom:2rem;background:#16161a;border-radius:12px;border:1px solid rgba(255, 255, 255, 0.08)"><a href="https://superspl.at/explore/software/teleport-by-varjo" target="_blank" rel="noopener" style="display:flex;flex-direction:column;align-items:center;gap:0.85rem;text-decoration:none;color:#fff"><img src="https://blog.playcanvas.com/img/logo-teleport.png" alt="Teleport by Varjo" width="60" height="60" style="border-radius:10px"><span style="font-size:0.9rem;font-weight:600">Teleport by Varjo</span></a><a href="https://superspl.at/explore/software/lcc-studio" target="_blank" rel="noopener" style="display:flex;flex-direction:column;align-items:center;gap:0.85rem;text-decoration:none;color:#fff"><img src="https://blog.playcanvas.com/img/logo-lcc-studio.png" alt="XGRIDS LCC Studio" width="60" height="60"><span style="font-size:0.9rem;font-weight:600">XGRIDS LCC Studio</span></a><a href="https://superspl.at/explore/software/lichtfeld-studio" target="_blank" rel="noopener" style="display:flex;flex-direction:column;align-items:center;gap:0.85rem;text-decoration:none;color:#fff"><img src="https://blog.playcanvas.com/img/logo-lichtfeld-studio.svg" alt="LichtFeld Studio" width="60" height="60"><span style="font-size:0.9rem;font-weight:600">LichtFeld Studio</span></a></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-the-publishing-api">🔌 The Publishing API<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-the-publishing-api" class="hash-link" aria-label="Direct link to 🔌 The Publishing API" title="Direct link to 🔌 The Publishing API" translate="no">​</a></h3>
<p>Until now, getting a splat onto SuperSplat meant exporting a file from whatever tool you trained it in, then uploading it by hand. For a large scene that's a multi-gigabyte round trip — and it's the least interesting part of anyone's workflow.</p>
<p>The <strong>SuperSplat API</strong> removes that step entirely. It's a REST API that lets an application publish a splat directly to superspl.at on behalf of a signed-in user, and inspect the scenes they already own. A few things worth knowing:</p>
<ul>
<li class=""><strong>Authentication</strong> uses a <strong>PlayCanvas access token</strong>, sent as a bearer token. Users generate one from the API Tokens section of their account page and paste it into the integration once. Some apps label the field "API key" or "API token" — it's the same thing.</li>
<li class=""><strong>Uploads are resumable.</strong> The API uses multipart uploads — a client opens a session, requests signed URLs for each part, pushes those parts straight to storage and then completes the upload. A dropped connection halfway through a 2 GB scene is no longer fatal.</li>
<li class=""><strong>Scenes arrive unlisted</strong> by default, so nothing goes public until the creator decides it should.</li>
<li class=""><strong>Metadata comes along for the ride</strong> — title, description and the <code>softwareTools</code> field that records which tools made the scene. Integrations can identify <em>themselves</em> separately through the optional <code>uploadClient</code> field.</li>
</ul>
<p>It's all documented in the new <strong><a href="https://developer.playcanvas.com/user-manual/supersplat/api-integrations/" target="_blank" rel="noopener noreferrer" class="">API &amp; Integrations guide</a></strong>, with complete endpoint and schema detail in the <strong><a href="https://developer.playcanvas.com/user-manual/api/supersplat/" target="_blank" rel="noopener noreferrer" class="">SuperSplat API reference</a></strong>.</p>
<p>Now for the fun part — three tools that already use it.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-teleport-by-varjo">🥽 Teleport by Varjo<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-teleport-by-varjo" class="hash-link" aria-label="Direct link to 🥽 Teleport by Varjo" title="Direct link to 🥽 Teleport by Varjo" translate="no">​</a></h3>
<p><strong><a href="https://get.teleport.varjo.com/" target="_blank" rel="noopener noreferrer" class="">Teleport</a></strong> is Varjo's 3D reconstruction platform. It takes phone images, 360 video or up to 10,000 drone images, and trains georeferenced Gaussian splats up to 100 million splats. It's API-first, so teams wire it into their own pipelines. Finished scenes publish directly to SuperSplat.</p>
<p>You connect the integration once, under <strong>Settings → Integrations</strong>: paste in your access token and hit <strong>Save</strong>. From then on, every capture gets a <strong>Publish capture</strong> option — pick <strong>SuperSplat</strong> as the destination, give the scene a title and description, and hit publish.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-from-teleport.mp4" style="width:100%;height:auto"></video>
<p>And here's what Teleport manages with nothing but an iPhone. This is Turun Ekotori, a large second-hand and recycling center in Turku, Finland — captured with the Teleport iOS app and published straight to SuperSplat:</p>
<div class="iframe-container"><iframe loading="lazy" src="https://superspl.at/s?id=8fa2ded1" title="SuperSplat Viewer - Ekotori" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"></iframe></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>No lidar rig, no drone — just a phone. Splat by <a href="https://superspl.at/user/jjames" target="_blank" rel="noopener noreferrer" class="">jjames</a>.</p></div></div>
<p>Browse everything the community is making with it in the <strong><a href="https://superspl.at/explore/software/teleport-by-varjo" target="_blank" rel="noopener noreferrer" class="">Teleport by Varjo collection</a></strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-xgrids-lcc-studio">📡 XGRIDS LCC Studio<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-xgrids-lcc-studio" class="hash-link" aria-label="Direct link to 📡 XGRIDS LCC Studio" title="Direct link to 📡 XGRIDS LCC Studio" translate="no">​</a></h3>
<p><strong><a href="https://www.xgrids.com/" target="_blank" rel="noopener noreferrer" class="">XGRIDS</a></strong> builds handheld lidar scanners, and <strong>Lixel CyberColor Studio</strong> — LCC Studio — is the desktop software that turns those scans into splats. Publishing is now built right in.</p>
<p>Open <strong>My Models</strong>, pick a model and publish it to <strong>SuperSplat</strong>. Paste your access token, choose a format and hit <strong>Share</strong>. <strong>LCC2 (SOG)</strong> is the recommended option, which hands you SuperSplat's compressed streaming format straight out of the box. When the upload finishes, a dialog gives you the live viewer link.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-from-xgrids.mp4" style="width:100%;height:auto"></video>
<p>See what LCC Studio users are publishing in the <strong><a href="https://superspl.at/explore/software/lcc-studio" target="_blank" rel="noopener noreferrer" class="">LCC Studio collection</a></strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-lichtfeld-studio">💡 LichtFeld Studio<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-lichtfeld-studio" class="hash-link" aria-label="Direct link to 💡 LichtFeld Studio" title="Direct link to 💡 LichtFeld Studio" translate="no">​</a></h3>
<p><strong><a href="https://lichtfeld.io/" target="_blank" rel="noopener noreferrer" class="">LichtFeld Studio</a></strong> is a fast, open source Gaussian splat trainer — and this integration is one we built ourselves. The <strong><a href="https://github.com/playcanvas/supersplat-lichtfeld-plugin" target="_blank" rel="noopener noreferrer" class="">SuperSplat plugin for LichtFeld Studio</a></strong> is developed and maintained by the PlayCanvas team, MIT licensed and open source like everything else we ship.</p>
<p>The plugin adds a <strong>SuperSplat</strong> tab alongside Rendering and Training. Sign in once — your credentials are stored securely — then pick which splats to upload, set a title and description and hit <strong>Upload to SuperSplat</strong>. It exports to PLY or SOG, reports live progress and resumes if the connection drops.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-from-lichtfeld.mp4" style="width:100%;height:auto"></video>
<p>Have a look at the <strong><a href="https://superspl.at/explore/software/lichtfeld-studio" target="_blank" rel="noopener noreferrer" class="">LichtFeld Studio collection</a></strong> to see what it's producing. And because we wrote it, the plugin doubles as the <strong>reference implementation</strong> of the API — if you're building your own integration, that repo is the fastest way to see the entire flow working end to end.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-why-build-a-supersplat-integration">🤝 Why Build a SuperSplat Integration?<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-why-build-a-supersplat-integration" class="hash-link" aria-label="Direct link to 🤝 Why Build a SuperSplat Integration?" title="Direct link to 🤝 Why Build a SuperSplat Integration?" translate="no">​</a></h3>
<p>If you make a capture app, a scanner, a trainer or a reconstruction pipeline, here's the case for wiring SuperSplat publishing into it.</p>
<ul>
<li class=""><strong>You don't have to build a viewer.</strong> Your users get a hosted, production-grade <a class="" href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins">WebGPU splat renderer</a> with shareable links and embeds. No renderer to write, no bandwidth to serve, no mobile GPU matrix to chase.</li>
<li class=""><strong>You get a gallery that fills itself.</strong> Every scene published through your integration carries your tool in its <code>softwareTools</code> metadata, which puts your logo chip on the scene page and files the scene into your own collection. Our launch partners already have collections filling up — <a href="https://superspl.at/explore/software/teleport-by-varjo" target="_blank" rel="noopener noreferrer" class="">Teleport by Varjo</a>, <a href="https://superspl.at/explore/software/lcc-studio" target="_blank" rel="noopener noreferrer" class="">LCC Studio</a> and <a href="https://superspl.at/explore/software/lichtfeld-studio" target="_blank" rel="noopener noreferrer" class="">LichtFeld Studio</a> — and those pages grow every time one of your users hits publish.</li>
<li class=""><strong>Permanent attribution in front of exactly the right audience.</strong> That logo chip is a clickable credit on every scene your users share, seen by the people already out looking for splat tools. See <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram">Software Attribution</a></strong> for how it works.</li>
<li class=""><strong>You finish your users' workflow instead of dead-ending it.</strong> Capture, train, publish, share. Nobody has to export a multi-gigabyte PLY and re-upload it by hand.</li>
<li class=""><strong>Your output inherits everything SuperSplat can do.</strong> SOG compression, streamed LOD, walk mode, Studio editing, 360° video and one-click starter projects all apply to scenes that arrive through the API.</li>
<li class=""><strong>The integration itself is small.</strong> A REST API, a bearer token and a resumable upload — with our LichtFeld Studio plugin as a complete working example to crib from.</li>
</ul>
<p>Start with the <strong><a href="https://developer.playcanvas.com/user-manual/supersplat/api-integrations/" target="_blank" rel="noopener noreferrer" class="">API &amp; Integrations guide</a></strong>. And if you're building an integration, come and tell us about it on <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a> — we'll help you get it shipped.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<p>New to Gaussian splatting on PlayCanvas? Our <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">Gaussian Splatting documentation</a> is the best place to get started.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-introducing-the-new-publishing-api#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
            <category>api</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Building the Grace Cathedral Experience]]></title>
            <link>https://blog.playcanvas.com/building-the-grace-cathedral-experience</link>
            <guid>https://blog.playcanvas.com/building-the-grace-cathedral-experience</guid>
            <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A look at how we built the Grace Cathedral experience using streamed SOG, WebGPU-first rendering and custom shader effects.]]></description>
            <content:encoded><![CDATA[<p><a href="https://gracecathedral.org/" target="_blank" rel="noopener noreferrer" class="">Grace Cathedral</a> is a San Francisco landmark on Nob Hill.</p>
<p>After seeing <a href="https://vincentwoo.com/" target="_blank" rel="noopener noreferrer" class="">Vincent Woo's</a> high-quality capture of the cathedral and its surrounding streets as 3D Gaussian splats, we jumped at the chance to collaborate with him. Together, we turned his splats into <a href="https://vincentwoo.com/3d/grace_cathedral/" target="_blank" rel="noopener noreferrer" class="">a browser-based, interactive experience</a>. You can see the finished app below:</p>
<div class="embed_vtT5"><iframe class="frame_NbKe" src="https://vincentwoo.com/3d/grace_cathedral/" title="Grace Cathedral" allow="fullscreen; xr-spatial-tracking; accelerometer; gyroscope" allowfullscreen=""></iframe></div>
<p>This article explores how I built this app. Let's dive in.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="under-the-hood">Under the Hood<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#under-the-hood" class="hash-link" aria-label="Direct link to Under the Hood" title="Direct link to Under the Hood" translate="no">​</a></h2>
<p>The <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> was the perfect runtime on which to build, thanks to its WebGPU hybrid renderer and streamed SOG format.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="webgpu-hybrid-renderer">WebGPU Hybrid Renderer<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#webgpu-hybrid-renderer" class="hash-link" aria-label="Direct link to WebGPU Hybrid Renderer" title="Direct link to WebGPU Hybrid Renderer" translate="no">​</a></h3>
<p>The exterior view renders around 3.5 million Gaussian splats at a time. Because they must be sorted back to front, moving the camera means repeatedly sorting millions of splats in real time.</p>
<p>Our first-generation Gaussian splat renderer used WebGL 2, which only provides vertex and fragment shaders. They are well suited to drawing the splats but not to sorting them, so a worker sorted the Gaussians on the CPU and uploaded the results to the GPU. Sorting and uploading could fall behind rendering, making artifacts visible as the camera moved.</p>
<p>WebGPU lets us divide that work more effectively. Compute shaders cull, project and sort the active splat set on the GPU every frame, then vertex and fragment shaders render the result. Keeping the data on the GPU avoids the transfer bottleneck and makes the pipeline <a class="" href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins">dramatically faster</a> than the worker-based WebGL 2 renderer.</p>
<p>The experience uses this WebGPU pipeline whenever the browser supports it and falls back to the WebGL 2 renderer automatically. To support both rendering paths, the cutout, flag animation and transition shaders each have WGSL and GLSL implementations so the experience looks the same on both backends.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="streamed-sog">Streamed SOG<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#streamed-sog" class="hash-link" aria-label="Direct link to Streamed SOG" title="Direct link to Streamed SOG" translate="no">​</a></h3>
<p>The splat data is delivered as <a class="" href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins">streamed SOG</a> — our open <a class="" href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting">compressed splat format</a>, extended with chunked levels of detail that the engine fetches on demand.</p>
<p>The experience contains separate splat sets for the exterior and interior. The exterior combines a streamed LOD set covering everything within 400 meters with a static, low-detail set for the landscape beyond it. Each mode loads only its own set and evicts the other, so device memory holds one view at a time.</p>
<p>Startup is tuned for time-to-first-pixel. On load, each streamed splat set starts at a single coarse LOD, so only a small fraction of the data needs to arrive before the loading screen lifts. From there, the engine streams in detail progressively within a per-device budget: 3.5 million rendered splats on desktop and 1.4 million on mobile. Mode switches are covered by a short freeze-fade: the last frame is held and faded down while the next splat set loads its coarse LOD, then the new view fades in and refines.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="optimized-to-run-everywhere">Optimized to Run Everywhere<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#optimized-to-run-everywhere" class="hash-link" aria-label="Direct link to Optimized to Run Everywhere" title="Direct link to Optimized to Run Everywhere" translate="no">​</a></h3>
<p>Beyond streaming and per-device splat budgets, a few things keep the experience smooth on modest hardware — and cool and quiet on phones:</p>
<ul>
<li class=""><strong>On-demand rendering.</strong> The app only renders when something changes: camera movement, LOD chunks arriving, a cutout animating, cars driving by. When you stop moving, it stops drawing.</li>
<li class=""><strong>Resolution caps.</strong> Device pixel ratio is capped on high-DPI displays, with a further render-scale reduction on mobile, where the extra pixels cost more than they show.</li>
<li class=""><strong>Depth pre-pass occlusion.</strong> The interior collision mesh doubles as an occluder: rendered depth-only before the splats, it lets early-Z reject splat fragments hidden behind walls.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bringing-the-scene-to-life">Bringing the Scene to Life<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#bringing-the-scene-to-life" class="hash-link" aria-label="Direct link to Bringing the Scene to Life" title="Direct link to Bringing the Scene to Life" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-peek-effect">The Peek Effect<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#the-peek-effect" class="hash-link" aria-label="Direct link to The Peek Effect" title="Direct link to The Peek Effect" translate="no">​</a></h3>
<p>While orbiting outside, the Peek toggle carves away the section of wall nearest the camera so you can look inside. A thin, glowing rim outlines the cut edge.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/grace-peek.mp4" style="width:100%;height:auto"></video>
<p>It is built on the engine's gsplat shader chunk system, which lets a project replace the <code>gsplatModifyVS</code> and <code>gsplatModifyPS</code> chunks to modify every splat and every fragment. The cutouts themselves are just box entities in the Editor, grouped under trigger volumes. As the camera moves, the trigger closest to it eases its cutout open while the others ease closed.</p>
<p>The shader works in two stages to keep it cheap. A per-splat stage — a compute pass on WebGPU — tests each splat's center against the cutout boxes with a signed distance function. Splats fully inside an open box are culled outright and only those near a cut surface are flagged for further processing. The fragment stage then runs a pixel-exact version of the same test for flagged splats. It reconstructs each fragment's world position from depth, fades alpha inside the box and draws a rim that maintains a constant on-screen width at any distance. The rim color is written as an HDR value so bloom picks it up. The chunks are installed only while the exterior view is active, so walk mode pays nothing for the effect.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-hidden-flag">A Hidden Flag<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#a-hidden-flag" class="hash-link" aria-label="Direct link to A Hidden Flag" title="Direct link to A Hidden Flag" translate="no">​</a></h3>
<p>The same chunk also animates a flag hidden somewhere in the scene. Splats inside an authored box ride a traveling wave, with amplitude ramping up from the pole edge and each splat tilting to follow the displaced cloth surface. Can you find it? 🔍</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="cars">Cars<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#cars" class="hash-link" aria-label="Direct link to Cars" title="Direct link to Cars" translate="no">​</a></h3>
<p>We created the moving traffic by isolating and duplicating parked cars from the original capture in the SuperSplat Editor:</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/grace-cars2.mp4" style="width:100%;height:auto"></video>
<p>Three car splats spawn at randomized intervals and travel past the cathedral at slightly different speeds. They are disabled indoors, returning their splats to the interior's rendering budget.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="camera-navigation">Camera Navigation<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#camera-navigation" class="hash-link" aria-label="Direct link to Camera Navigation" title="Direct link to Camera Navigation" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="exterior-orbit-controller">Exterior Orbit Controller<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#exterior-orbit-controller" class="hash-link" aria-label="Direct link to Exterior Orbit Controller" title="Direct link to Exterior Orbit Controller" translate="no">​</a></h4>
<p>The exterior orbit controller moves around a rounded-box envelope fitted to the cathedral. Horizontal and vertical motion are parameterized by arc length along the walls, corners and roof, producing uniform camera speed without discontinuities. Zoom adjusts the camera's standoff from the surface, while damped input adds momentum after release.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/grace-orbit.mp4" style="width:100%;height:auto"></video>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="camera-flights">Camera Flights<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#camera-flights" class="hash-link" aria-label="Direct link to Camera Flights" title="Direct link to Camera Flights" translate="no">​</a></h4>
<p>Camera flights use authored waypoint graphs to route around the cathedral's architecture. Inside, routing uses the collision mesh to select visible nodes; outside, it tests clearance against the cathedral's orbit envelope. A shortest-path search produces a route that is converted into a cubic spline, interpolating position, orientation, focus distance and field of view. Closing the annotation rewinds the flight to the previous camera state.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/grace-fly.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="sound-and-other-touches">Sound and Other Touches<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#sound-and-other-touches" class="hash-link" aria-label="Direct link to Sound and Other Touches" title="Direct link to Sound and Other Touches" translate="no">​</a></h3>
<p>A layered soundscape follows the camera. Outside, two city loops crossfade based on altitude. Inside, cathedral ambience takes over, with footsteps playing only while you walk. Even the loading screen follows the theme with a rose window drawn in CSS.</p>
<p>Together, these details turn the cathedral capture into a living, explorable place.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-source-foundations">Open Source Foundations<a href="https://blog.playcanvas.com/building-the-grace-cathedral-experience#open-source-foundations" class="hash-link" aria-label="Direct link to Open Source Foundations" title="Direct link to Open Source Foundations" translate="no">​</a></h2>
<p>Everything beneath the Grace Cathedral experience is built on open source foundations. The <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> renders the scene in the browser, <a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> provides the tools to edit and optimize the captures and the open <a class="" href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting">SOG format</a> makes them compact enough to stream. These are the same technologies we develop in the open for anyone to use, inspect and improve.</p>
<p>Want to build an experience of your own? Start with our <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">Gaussian splatting guide</a> for the complete workflow from capture to delivery. You can prepare your capture in the <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a>, then follow the <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/building/your-first-app/" target="_blank" rel="noopener noreferrer" class="">Your First Splat App</a> tutorial to choose the approach that best fits you, whether that is the Engine API, the PlayCanvas Editor, React or Web Components. 🚀</p>
<p>If you have questions, want to share what you build or simply want to meet other creators, join the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas and SuperSplat community on Discord</a>. We'd love to see you there! 👋</p>
<p><a href="https://vincentwoo.com/3d/grace_cathedral/" target="_blank" rel="noopener noreferrer" class="">Experience Grace Cathedral for yourself</a> and see what the open web can do.</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>playcanvas</category>
            <category>webgpu</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: Vibe Code Splat Apps, 360° Video and splat-transform 3.0]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps</guid>
            <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped a new WebGPU renderer and automatic streaming — a huge leap in how fast splats load and render. Today's update is all about what you can do with your splats. We're rolling out a way to vibe code an entire app around any splat, plus 360° video rendering and SPZ export in SuperSplat Editor 2.29.0, and a major new release of splat-transform.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins">a new WebGPU renderer and automatic streaming</a></strong> — a huge leap in how fast splats load and render. Today's update is all about what you can <em>do</em> with your splats. We're rolling out a way to <strong>vibe code an entire app around any splat</strong>, plus <strong>360° video rendering</strong> and <strong>SPZ export</strong> in SuperSplat Editor 2.29.0, and a major new release of <strong>splat-transform</strong>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-vibe-code-splat-apps">🤖 Vibe Code Splat Apps<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-vibe-code-splat-apps" class="hash-link" aria-label="Direct link to 🤖 Vibe Code Splat Apps" title="Direct link to 🤖 Vibe Code Splat Apps" translate="no">​</a></h3>
<p>Turning a Gaussian splat into a real, interactive web app used to mean wiring up an engine, a build tool and a viewer by hand. Not any more. Every <strong>downloadable splat</strong> on SuperSplat now comes with a one‑click <strong>starter project</strong> download.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-vibe-coding.mp4" style="width:100%;height:auto"></video>
<p>Open any downloadable scene, hit <strong>Download</strong> and choose the <strong>Vite project</strong> option. You'll get a complete, ready‑to‑run web app — <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> + <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer" class="">Vite</a> + TypeScript — with the splat itself bundled in and the camera pose you set in SuperSplat preserved. Unzip it, run <code>npm install</code> and <code>npm run dev</code>, and you're looking at your splat running live in the browser.</p>
<p>Here's the fun part. The project is deliberately <strong>minimal and fully typed</strong>: the viewer logic lives in a single <code>src/main.ts</code>, and everything you'd want to change sits in one clearly named <code>src/splat-config.ts</code>. That makes it the perfect thing to hand to your favorite AI coding assistant — Cursor, Claude Code, whatever you like — and <strong>vibe code</strong> the app you actually want. Add hotspots, build a product configurator, drop in a character controller… it's the fastest path we've found from a raw scan to a shippable web app.</p>
<p>Here's one we vibe-coded earlier: an interactive <strong>snow globe</strong> built from a single <a href="https://superspl.at/scene/7e1bd643" target="_blank" rel="noopener noreferrer" class="">Le Mont Saint-Michel splat</a> by Mykhailo Moroz. Hit play to launch the live app — it's a hefty splat, so it only loads when you ask:</p>
<div class="embed_vtT5"><button type="button" class="facade_XV8S" aria-label="Launch Le Mont Saint-Michel Snow Globe"><span class="play_nWGh" aria-hidden="true">▶</span><span class="title_hAQC">Le Mont Saint-Michel Snow Globe</span><span class="subtitle_AS_S">Vibe-coded from a single Gaussian splat</span><span class="note_W6bq">Click to launch · ~80 MB</span></button></div>
<p>The whole thing is a small Vite + TypeScript project — <a href="https://github.com/willeastcott/snowglobe" target="_blank" rel="noopener noreferrer" class="">browse the source on GitHub</a> to see exactly how it's put together.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-360-video-rendering">🎬 360° Video Rendering<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-360-video-rendering" class="hash-link" aria-label="Direct link to 🎬 360° Video Rendering" title="Direct link to 🎬 360° Video Rendering" translate="no">​</a></h3>
<p>Today also brings <strong><a href="https://github.com/playcanvas/supersplat/releases/tag/v2.29.0" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor 2.29.0</a></strong>, and its headline feature is <strong>360° video rendering</strong>. You can now render your animated splat scenes straight to <strong>equirectangular 360° video</strong> — ready to upload to YouTube 360, view in a VR headset or share as immersive social content. Here's how it works:</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-360-video.mp4" style="width:100%;height:auto"></video>
<p>And here's the payoff — a 360° video rendered straight out of SuperSplat and uploaded to YouTube. Open it there and drag to look around, or view it on your phone or in a headset for the full immersive effect:</p>
<div style="text-align:center;margin-bottom:2rem"><a class="button button--primary button--lg" href="https://www.youtube.com/watch?v=6oGjT8eubMc" target="_blank" rel="noopener">▶&nbsp;&nbsp;Look around in 360° on YouTube</a></div>
<p>And we didn't stop at video. SuperSplat can now also export <strong>360° equirectangular images</strong>, and regular image export has switched to <strong>WebP</strong> for smaller files at higher quality.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-spz-export">📦 SPZ Export<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-spz-export" class="hash-link" aria-label="Direct link to 📦 SPZ Export" title="Direct link to 📦 SPZ Export" translate="no">​</a></h3>
<p>SuperSplat Editor 2.29.0 also adds export to <strong>SPZ</strong>, the open, compressed splat format created by Niantic Labs for Scaniverse. SPZ files are roughly <strong>10× smaller than the equivalent PLY</strong> with virtually no perceptible loss in quality.</p>
<p>With SPZ export, your SuperSplat scenes drop straight into Scaniverse and any other SPZ‑compatible app or pipeline.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-spz-export.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-splat-transform-30">⚡ splat-transform 3.0<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-splat-transform-30" class="hash-link" aria-label="Direct link to ⚡ splat-transform 3.0" title="Direct link to ⚡ splat-transform 3.0" translate="no">​</a></h3>
<p><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">splat-transform</a> is our open source command‑line tool and library for converting and optimizing Gaussian splats — it's the same tool that produces SuperSplat's super‑compressed <a class="" href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting">SOG</a> and Streamed SOG output. Today it gets its biggest upgrade yet: <strong>version 3.0</strong>.</p>
<p>The 3.0 release is a ground‑up <strong>streaming rewrite</strong>. Instead of loading an entire scene into memory, splat-transform now streams data through in bounded chunks, so <strong>memory use scales with chunk size, not scene size</strong>. In practice that means you can process <strong>scenes of 100M+ Gaussians on standard hardware</strong> — and it's dramatically faster too: a 10M‑Gaussian filter pass runs about <strong>7× faster while using roughly a fifth of the peak memory</strong> of the 2.x line.</p>
<p>Because so much changed under the hood, 3.0 is a major release with some breaking API and CLI changes, and it targets <strong>Node.js 22+</strong>. Give it a spin with <code>npx @playcanvas/splat-transform</code>; the <strong><a href="https://github.com/playcanvas/splat-transform/releases/tag/v3.0.0" target="_blank" rel="noopener noreferrer" class="">3.0 release notes</a></strong> and <a href="https://github.com/playcanvas/splat-transform/pull/276" target="_blank" rel="noopener noreferrer" class="">this pull request</a> have the full details and migration notes.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<p>New to Gaussian splatting on PlayCanvas? Our <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">Gaussian Splatting documentation</a> is the best place to get started.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-vibe-code-splat-apps#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
            <category>splat-transform</category>
            <category>ai</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: WebGPU and Streaming Bring Huge Performance Wins]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins</guid>
            <pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped Software Attribution, Collision Generation and GPU-Powered Histogram. Today we're announcing some of the most significant upgrades to the SuperSplat platform yet — a brand new high-performance WebGPU renderer and automatic, high-quality levels of detail for streamed scenes. Together they make splats load faster and render smoother than ever, from phones right through to high-end desktops.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram">Software Attribution, Collision Generation and GPU-Powered Histogram</a></strong>. Today we're announcing some of the most significant upgrades to the SuperSplat platform yet — a brand new high-performance <strong>WebGPU renderer</strong> and <strong>automatic, high-quality levels of detail</strong> for streamed scenes. Together they make splats load faster and render smoother than ever, from phones right through to high-end desktops.</p>
<p>The scene below (a stunning scan of Lokwelt Freilassing, a Bavarian railway museum) shows both upgrades in action — explore it right here in your browser.</p>
<div class="iframe-container"><iframe loading="lazy" src="https://superspl.at/s?id=71a8c8aa" title="SuperSplat Viewer - Bavarian Railway Museum" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"></iframe></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Click or tap anywhere in the scene above to walk there! Splat by <a href="https://www.linkedin.com/in/guy-middleton-3d/" target="_blank" rel="noopener noreferrer" class="">Guy Middleton</a>.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-a-turbo-charged-webgpu-renderer">🚀 A Turbo-Charged WebGPU Renderer<a href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins#-a-turbo-charged-webgpu-renderer" class="hash-link" aria-label="Direct link to 🚀 A Turbo-Charged WebGPU Renderer" title="Direct link to 🚀 A Turbo-Charged WebGPU Renderer" translate="no">​</a></h3>
<p>Today marks the release of <strong><a href="https://github.com/playcanvas/engine/releases/tag/v2.19.0" target="_blank" rel="noopener noreferrer" class="">version 2.19.0</a></strong> of the open source <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> — also rolling out now in the <strong>PlayCanvas Editor</strong> — and it's a landmark release for Gaussian splatting. It ships a brand new <strong>compute-based WebGPU renderer</strong> for 3D Gaussian splats.</p>
<p>Instead of sorting splats on a worker thread, the new WebGPU renderer hands the heavy lifting to compute shaders — culling invisible splats, projecting the rest, and sorting them with a fast GPU radix sort. The final rasterization still uses vertex and fragment shaders, but they're now lightweight, drawing from pre-projected data. The payoff is a dramatic jump in frame rates.</p>
<p>How dramatic? Here's the new WebGPU renderer measured against our existing WebGL 2 renderer on desktop:</p>
<div class="card__sb9"><div class="cardHead_aBbZ"><span class="title_chDC">Apple M4 Max</span><span class="meta_Buzj">Metal-3 · 1298 × 962</span></div><div class="legend__ANQ"><span><i class="swatch_IPj7" style="background:#f7768e" aria-hidden="true"></i>WebGL 2 Renderer</span><span><i class="swatch_IPj7" style="background:#4cc9f0" aria-hidden="true"></i>WebGPU Renderer</span></div><div class="chartBox_Obhy"><canvas aria-hidden="true"></canvas></div><div class="tableWrap_i3bH"><table class="fps_Uhe8"><thead><tr><th scope="col">Metric</th><th scope="col">1M</th><th scope="col">2M</th><th scope="col">3M</th><th scope="col">4M</th><th scope="col">6M</th><th scope="col">8M</th><th scope="col">10M</th><th scope="col">15M</th><th scope="col">20M</th><th scope="col">25M</th><th scope="col">30M</th><th scope="col">35M</th></tr></thead><tbody><tr class="gl_JRmw"><th scope="row">WebGL 2 <span class="unit_UPme">fps</span></th><td class="val_QG_3">137.2</td><td class="val_QG_3">140.4</td><td class="val_QG_3">124.8</td><td class="val_QG_3">113.6</td><td class="val_QG_3">86.8</td><td class="val_QG_3">71.3</td><td class="val_QG_3">48.1</td><td class="val_QG_3">28.9</td><td class="val_QG_3">22.3</td><td class="val_QG_3">18.6</td><td class="val_QG_3">15.6</td><td class="val_QG_3">13.3</td></tr><tr class="gpu_JIm8"><th scope="row">WebGPU <span class="unit_UPme">fps</span></th><td class="val_QG_3">138.7</td><td class="val_QG_3">153.6</td><td class="val_QG_3">135.5</td><td class="val_QG_3">146</td><td class="val_QG_3">140.3</td><td class="val_QG_3">125</td><td class="val_QG_3">124.1</td><td class="val_QG_3">105.9</td><td class="val_QG_3">97.8</td><td class="val_QG_3">89.4</td><td class="val_QG_3">85</td><td class="val_QG_3">75.8</td></tr><tr class="spd_ZsYt"><th scope="row">WebGPU speedup</th><td>1×</td><td>1.1×</td><td>1.1×</td><td>1.3×</td><td>1.6×</td><td>1.8×</td><td>2.6×</td><td>3.7×</td><td>4.4×</td><td>4.8×</td><td>5.4×</td><td>5.7×</td></tr></tbody></table></div></div>
<p>And on mobile:</p>
<div class="card__sb9"><div class="cardHead_aBbZ"><span class="title_chDC">iPhone 13 Pro Max</span><span class="meta_Buzj">Apple GPU · 642 × 1126</span></div><div class="legend__ANQ"><span><i class="swatch_IPj7" style="background:#f7768e" aria-hidden="true"></i>WebGL 2 Renderer</span><span><i class="swatch_IPj7" style="background:#4cc9f0" aria-hidden="true"></i>WebGPU Renderer</span></div><div class="chartBox_Obhy"><canvas aria-hidden="true"></canvas></div><div class="tableWrap_i3bH"><table class="fps_Uhe8"><thead><tr><th scope="col">Metric</th><th scope="col">1M</th><th scope="col">2M</th><th scope="col">3M</th><th scope="col">4M</th></tr></thead><tbody><tr class="gl_JRmw"><th scope="row">WebGL 2 <span class="unit_UPme">fps</span></th><td class="val_QG_3">38.1</td><td class="val_QG_3">35.5</td><td class="val_QG_3">25.5</td><td class="val_QG_3">20.4</td></tr><tr class="gpu_JIm8"><th scope="row">WebGPU <span class="unit_UPme">fps</span></th><td class="val_QG_3">77.6</td><td class="val_QG_3">73.2</td><td class="val_QG_3">52.7</td><td class="val_QG_3">42.4</td></tr><tr class="spd_ZsYt"><th scope="row">WebGPU speedup</th><td>2×</td><td>2.1×</td><td>2.1×</td><td>2.1×</td></tr></tbody></table></div></div>
<p>WebGPU is now available to roughly <strong>85% of end users</strong> according to <a href="https://caniuse.com/webgpu" target="_blank" rel="noopener noreferrer" class="">caniuse.com</a>, and that number keeps climbing. For everyone else, SuperSplat automatically <strong>falls back to the WebGL 2 renderer</strong> — and because both paths are built to render identically, your scene looks exactly the same either way. No configuration, no compromises.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-automatic-streaming-for-near-instant-load-times">📡 Automatic Streaming for Near-Instant Load Times<a href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins#-automatic-streaming-for-near-instant-load-times" class="hash-link" aria-label="Direct link to 📡 Automatic Streaming for Near-Instant Load Times" title="Direct link to 📡 Automatic Streaming for Near-Instant Load Times" translate="no">​</a></h3>
<p>Big scenes deserve to load fast. SuperSplat now <strong>automatically processes every upload into a streamed format</strong> the moment it lands — no extra steps and no command line. The payoff is near-instant load times and high frame rates, even on older devices.</p>
<p>We call this format <strong>Streamed SOG</strong> — an extension of our super-compressed <a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">SOG (Spatially Ordered Gaussians)</a> format. It's generated by our open source <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">splat-transform</a> tool, which does two things. First, it <strong>decimates</strong> the scene several times over to produce a series of high-quality levels of detail (LODs). Then it <strong>chunks</strong> those LODs into small, streamable pieces the viewer can fetch on demand.</p>
<p>Here's the clever part. The <strong>SuperSplat Viewer</strong> starts by downloading the <strong>lowest LODs first</strong>, putting a stable, complete image on screen almost immediately. From there it <strong>progressively refines</strong> the scene, streaming in higher levels of detail according to an overall Gaussian <strong>budget</strong> tuned to your device — a generous budget on desktop, a leaner one on mobile. You get the best your hardware can handle, automatically, and you start seeing the scene right away instead of watching a loading bar.</p>
<p>The Bavarian railway museum scene at the top of this post is a perfect example: its top level of detail packs a staggering <strong>24 million Gaussians</strong> — far more than any phone could hold in memory at once — yet it appears almost instantly and sharpens as you explore.</p>
<p>This pairs perfectly with the new WebGPU renderer: streaming keeps the Gaussian count right-sized for your device, and WebGPU renders what's on screen faster than ever.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<p>New to Gaussian splatting on PlayCanvas? Our <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">Gaussian Splatting documentation</a> is the best place to get started.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-webgpu-and-streaming-bring-huge-performance-wins#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
            <category>webgpu</category>
            <category>performance</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: Software Attribution, Collision Generation and GPU-Powered Histogram]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram</guid>
            <pubDate>Thu, 14 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped Downloadable Splats, Licenses and Social Links — giving creators more control over how their work is shared and credited. Today we're back with three more upgrades that span the whole SuperSplat experience: from how splats are tagged and discovered, to how they're made walkable, to how they're edited.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links">Downloadable Splats, Licenses and Social Links</a></strong> — giving creators more control over how their work is shared and credited. Today we're back with three more upgrades that span the whole SuperSplat experience: from how splats are tagged and discovered, to how they're made walkable, to how they're edited.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-software-attribution">🛠️ Software Attribution<a href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram#%EF%B8%8F-software-attribution" class="hash-link" aria-label="Direct link to 🛠️ Software Attribution" title="Direct link to 🛠️ Software Attribution" translate="no">​</a></h3>
<p>No two splat creators work quite the same way — our community draws on an ever-growing ecosystem of capture rigs, reconstruction pipelines and post-processing tools, each leaving its own fingerprint on the final scene. With <strong>Software Attribution</strong>, you can now <strong>tag your splats with the tools you used to make them</strong>, so other creators can learn from your workflow and discover the tools shaping the field.</p>
<p>Open the <strong>Manage</strong> page for any of your splats and head to the new <strong>Software Used</strong> card. Search the curated catalog — including <strong>Brush</strong>, <strong>Postshot</strong>, <strong>LichtFeld Studio</strong>, <strong>RealityScan</strong>, <strong>KIRI Engine</strong>, <strong>COLMAP</strong>, <strong>Luma</strong>, <strong>Nerfstudio</strong>, <strong>Scaniverse</strong>, <strong>Polycam</strong>, <strong>Agisoft Metashape</strong> and more — and add up to <strong>six</strong> entries. Drag to reorder them. Don't see your favorite tool? Search for it and the picker will offer a quick way to <strong>request</strong> it — or just give us a shout on <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a>.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-software-attribution.mp4" style="width:100%;height:auto"></video>
<p>Once tagged, the software you used appears as a row of <strong>logo chips</strong> on your scene page. <strong>Click any chip</strong> to browse other splats made with the same tool — a great way to find new creators, learn techniques and see how each tool shines in different hands.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-collision-generation">🧱 Collision Generation<a href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram#-collision-generation" class="hash-link" aria-label="Direct link to 🧱 Collision Generation" title="Direct link to 🧱 Collision Generation" translate="no">​</a></h3>
<p>Last month we launched <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload">Walk Mode</a></strong>, which relies on voxel collision data generated by <strong><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform 2.0</a></strong>. Until now, producing that collision data meant running SplatTransform locally on your splat. Today we've wired the SplatTransform 2.0 pipeline directly into the <strong>SuperSplat Studio</strong> backend — so you can generate collision for any of your splats with a single click, no command line required.</p>
<p>Open your splat in <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat Studio</a>, head to the <strong>Assets</strong> panel and hit <strong>Generate</strong> in the <strong>Collision</strong> section. Three simple presets — <strong>Indoor</strong>, <strong>Outdoor</strong> and <strong>Object</strong> — tune the generation for the kind of scene you have. The algorithm also needs a <strong>seed position</strong> to know where the navigable space begins, and Studio takes that automatically from your <strong>initial camera position</strong> — so as long as you're framing the scene from inside the walkable area, you're good to go.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-collision-generation.mp4" style="width:100%;height:auto"></video>
<p>Browse the <a href="https://superspl.at/?features=walkable&amp;time=all" target="_blank" rel="noopener noreferrer" class="">walkable gallery</a> to see what the community has been building.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-gpu-powered-histogram">📊 GPU-Powered Histogram<a href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram#-gpu-powered-histogram" class="hash-link" aria-label="Direct link to 📊 GPU-Powered Histogram" title="Direct link to 📊 GPU-Powered Histogram" translate="no">​</a></h3>
<p>The <strong>SuperSplat Editor's Data Panel</strong> has had a major upgrade. The histogram is now <strong>GPU-driven</strong>, computing per-property statistics across <strong>millions of Gaussians in milliseconds</strong> — even on modest hardware.</p>
<p>Even better, you can now <strong>select splats by dragging a range directly on the histogram</strong>. Drag to set a selection, hold <strong>Shift</strong> to add to the current selection or <strong>Ctrl</strong> to subtract from it. Locked and deleted splats are protected automatically.</p>
<p>The list of properties you can analyze and select against has grown too. Slice your data by:</p>
<ul>
<li class=""><strong>Position</strong> — world coordinates and distance from the origin</li>
<li class=""><strong>Depth</strong> — distance from the active camera</li>
<li class=""><strong>Color</strong> — R / G / B and H / S / V (with a fix for HDR scenes pushing values out of range)</li>
<li class=""><strong>Geometry</strong> — scale, volume and surface area</li>
<li class=""><strong>Orientation</strong> — quaternion components</li>
<li class=""><strong>Raw values</strong> — <code>f_dc</code> and per-coefficient <code>f_rest</code> spherical harmonics</li>
</ul>
<p>New <strong>Visible Splats Only</strong>, <strong>Log Scale</strong> and <strong>All Properties</strong> toggles let you focus the histogram on exactly what you care about.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-histogram.mp4" style="width:100%;height:auto"></video>
<p>This makes editing huge scenes dramatically faster — isolate the splats you care about with a single drag instead of nudging sliders.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-software-attribution-collision-generation-and-histogram#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[Turning a Gaussian Splat Into a Videogame]]></title>
            <link>https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame</link>
            <guid>https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame</guid>
            <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[How I turned a photogrammetric 3D Gaussian Splat scene into a playable browser FPS - with collision, pre-baked lighting, navmesh-driven NPCs and behavior-tree AI, all in PlayCanvas.]]></description>
            <content:encoded><![CDATA[<p>Gaussian Splatting gives you <em>photorealistic</em> environments for free. The catch: a splat is just a cloud of oriented blobs - no triangles, no colliders, no navmesh, no lights. Drop a character in and they'll float through walls looking like they belong in a different universe.</p>
<p>This post walks through the demo I built to fix all of that:</p>
<ul>
<li class="">👉 <strong><a href="https://playcanv.as/p/qxGSuzYq/" target="_blank" rel="noopener noreferrer" class="">Play it in your browser</a></strong> - WASD, mouse to aim, left-click to fire.</li>
<li class="">👉 <strong><a href="http://playcanvas.com/project/1480299" target="_blank" rel="noopener noreferrer" class="">Check the project</a></strong> - the full PlayCanvas project is public. Every script mentioned in this post lives inside it, ready to read, fork, or remix.</li>
</ul>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/gaussian-splat-fps.mp4" style="width:100%;height:auto"></video>
<p>The scene is a gorgeous indoor scan of a real abandoned place by <a href="https://superspl.at/user?id=schindelar3d" target="_blank" rel="noopener noreferrer" class="">Christoph Schindelar</a>. Christoph is one of the best artists working with Gaussian Splats out there, so when he proposed to scan a real place for me, I jumped at the opportunity. On top of that splat I bolted a physics collider, a grid of baked lighting probes, a Recast navmesh, eight personality-driven NPCs and a classic FPS loop. Everything runs in a browser tab.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-the-build">🏗️ The Build<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#%EF%B8%8F-the-build" class="hash-link" aria-label="Direct link to 🏗️ The Build" title="Direct link to 🏗️ The Build" translate="no">​</a></h2>
<p>Here's how I built it, step by step.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-1-download-a-splat-from-supersplat">📥 Step 1: Download a Splat from SuperSplat<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-1-download-a-splat-from-supersplat" class="hash-link" aria-label="Direct link to 📥 Step 1: Download a Splat from SuperSplat" title="Direct link to 📥 Step 1: Download a Splat from SuperSplat" translate="no">​</a></h3>
<p>Before any code, you need a scene. Any splat on <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> tagged <strong>Downloadable</strong> has been published under Creative Commons by its author - grab the <code>.ply</code> or <code>.sog</code> and drop it straight into your own PlayCanvas project. The lighting, clutter and scale of the scan I picked were already cinematic, so I didn't have to art-direct anything.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>Jump straight to the <a href="https://superspl.at/search?features=downloadable" target="_blank" rel="noopener noreferrer" class="">pre-filtered downloadable view</a> and pick one.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-2-convert-the-splat-to-streamed-sog-format">📡 Step 2: Convert the Splat to Streamed SOG Format<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-2-convert-the-splat-to-streamed-sog-format" class="hash-link" aria-label="Direct link to 📡 Step 2: Convert the Splat to Streamed SOG Format" title="Direct link to 📡 Step 2: Convert the Splat to Streamed SOG Format" translate="no">​</a></h3>
<p>The Swiss Army knife for everything that follows is <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class=""><code>splat-transform</code></a> - PlayCanvas's open-source CLI for converting splats. We'll lean on it for streamed LOD here and for a collision mesh in the next step.</p>
<p>My scene is a few million Gaussians - big enough that shipping it as a single <code>.sog</code> asset would punish anyone on a phone or a slow connection. The fix is <a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-streamed-level-of-detail" target="_blank" rel="noopener noreferrer" class=""><strong>Streamed LOD</strong></a>: instead of one monolithic file, <code>splat-transform</code> writes out a <strong>folder of SOG chunks</strong> plus a <code>lod-meta.json</code> manifest. The runtime loads chunks on demand based on the camera's viewpoint and the device's capability - high-end desktop pulls full detail around the player, a phone pulls a lighter subset, and neither of them stalls waiting for the whole file.</p>
<p><code>Scripts/streaming-lod.mjs</code> hooks into the camera and asks the runtime to keep the chunks around the player fully loaded before the game starts - so you never see pop-in mid-firefight.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>If your splat is over a few million Gaussians, bundle it into streamed LOD with <code>splat-transform</code> - write out your detail levels, then combine them into a <code>lod-meta.json</code> (the <a href="https://developer.playcanvas.com/user-manual/splat-transform/streamed-sog/" target="_blank" rel="noopener noreferrer" class="">Generating Streamed SOG guide</a> walks through both steps) - and let the viewer stream it. Your mobile players will thank you.<br>
<a href="https://www.npmjs.com/package/@playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class=""><code>npm install -g @playcanvas/splat-transform</code></a></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-3-generate-a-collision-mesh">🧱 Step 3: Generate a Collision Mesh<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-3-generate-a-collision-mesh" class="hash-link" aria-label="Direct link to 🧱 Step 3: Generate a Collision Mesh" title="Direct link to 🧱 Step 3: Generate a Collision Mesh" translate="no">​</a></h3>
<p>This used to be the hard part. A splat has no surfaces, so physics is blind to it. You can't walk on it, shoot through it, or path around it. That's where <code>splat-transform</code> earns its keep again - the flag you want is <code>--collision-mesh</code>. Aim the output at a <code>.voxel.json</code> file and it voxelizes the splat, seals the shell, flood-fills the navigable interior from a seed position, and writes out a <code>.collision.glb</code> that you can import straight into PlayCanvas as a <code>mesh</code> collider.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform scene.ply \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --seed-pos 0,1,0 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --voxel-size 0.05 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --voxel-opacity 0.1 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --voxel-external-fill \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --voxel-carve 1.6,0.2 \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  --collision-mesh \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  scene.voxel.json</span><br></div></code></pre></div></div>
<p>That's a separate run from the SOG conversion in Step 2 - <code>splat-transform</code> writes one output file per invocation, and the collision mesh only comes out of a <code>.voxel.json</code> output. It gives me:</p>
<ul>
<li class=""><code>scene.voxel.json</code> + <code>scene.voxel.bin</code> - a sparse voxel octree of the scene, handy for raycasts.</li>
<li class=""><code>scene.collision.glb</code> - a voxel-derived mesh that hugs the real geometry.</li>
</ul>
<p>Two knobs worth knowing: <code>--voxel-external-fill</code> is the one for interior scans like mine (use <code>--voxel-floor-fill</code> for outdoor scenes instead), and <code>--collision-mesh</code> defaults to a smoothed marching-cubes mesh - pass <code>--collision-mesh faces</code> if you'd rather have a watertight mesh that matches the voxel volume exactly. The <a href="https://developer.playcanvas.com/user-manual/splat-transform/collision/" target="_blank" rel="noopener noreferrer" class="">Collision Mesh Generation guide</a> walks through every stage and stays current with the CLI.</p>
<p>I dropped the GLB into the PlayCanvas project and attached it to an invisible entity with a <strong>Collision</strong> component (mesh) and a <strong>Rigid Body</strong> component (static). Suddenly the player has a floor, the bullets can collide with walls, and the NPCs have something to walk on. No modeling, no clean-up.</p>
<p><img decoding="async" loading="lazy" alt="Voxel-derived collision mesh overlaid on the splat" src="https://blog.playcanvas.com/assets/images/gs-fps-demo-collision-a78a39fc9aa9b05f565e0bdab013f7a1.jpg" width="3834" height="1916" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>One command turns a pretty splat into a playable one - run <code>splat-transform scene.ply --collision-mesh scene.voxel.json</code> and drop the resulting <code>.collision.glb</code> into your project as a static mesh rigidbody.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-4-bake-a-lightness-grid-from-the-splat">💡 Step 4: Bake a Lightness Grid from the Splat<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-4-bake-a-lightness-grid-from-the-splat" class="hash-link" aria-label="Direct link to 💡 Step 4: Bake a Lightness Grid from the Splat" title="Direct link to 💡 Step 4: Bake a Lightness Grid from the Splat" translate="no">​</a></h3>
<p>Splats carry their lighting baked into every Gaussian. That means the scene looks <em>amazing</em> and unchanging. But my player's weapon model, the NPC soldiers and the pickups are ordinary lit PBR meshes - they'd stand out like cardboard cutouts under gym lighting unless they somehow inherited the splat's lighting.</p>
<p>I didn't want to re-light the splat. I wanted a cheap way to ask "how bright is it here?" at any point in the map, at runtime, for my regular meshes.</p>
<p>How <code>Scripts/probes.js</code> works:</p>
<ol>
<li class="">
<p>Grab the AABB of a designated floor entity and build a <strong>1-metre grid of probe positions</strong> 1 metre above the ground.</p>
</li>
<li class="">
<p>Create a tiny 16×16 offscreen <code>RenderTarget</code> and a 90° FOV camera that renders only the <code>World</code> layer (i.e. the splat - no characters, no HUD, no viewmodel).</p>
</li>
<li class="">
<p>For each probe, render <strong>6 faces</strong> of a cube (+X, -X, +Y, -Y, +Z, -Z), <code>readPixels</code> the 16×16 RGBA output, and compute luminance using the standard Rec. 601 weights:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">_faceLuminance</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.299</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> r </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.587</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> g </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.114</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> b</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// ... after all 6 faces:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">var</span><span class="token plain"> lightness </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">_faceLuminance</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1536</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">// 6 faces * 256 pixels</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>Stash the value in a <code>gridDepth × gridWidth</code> 2D array and spawn a tiny debug sphere at the probe position with <code>emissive = lightness</code> so you can <em>see</em> the light field floating in the scene.</p>
</li>
<li class="">
<p>When all probes are done, <code>console.log(JSON.stringify(this.probeJSON))</code>. I copy that out once, save it as <code>lightness.json</code>, attach it as a JSON asset, and delete the probes entity.</p>
</li>
</ol>
<p>Here's the bake in action - each debug sphere pops in as its cube of faces is rendered and its luminance is averaged. Bright spheres mark a well-lit spot on the floor; dim ones sit in corners and under cover. By the end you can read the scene's lighting as a dotted heatmap before a single byte of JSON is written.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/gs-fps-light-probes.mp4" style="width:50%;height:auto;display:block;margin:0 auto 1.5em"></video>
<p>At runtime, every dynamic character script (weapon, NPC, pickup) loads <code>lightness.json</code>, bilinearly samples the grid at its world position, remaps it to a sensible exposure range and calls <code>meshInstance.setParameter('exposure', value)</code>. Step from a bright atrium into a dim corridor and your hands darken smoothly. Fire your weapon and the pulsating omni-light bounces off the splat around you.</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">─── Probes: baking 392 probes (28 x 14) ───</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Probe 1/392   lightness: 0.4821</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Probe 2/392   lightness: 0.4733</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">...</span><br></div></code></pre></div></div>
<p>The whole bake takes ~15 seconds once, then the JSON is ~40 KB. No expensive runtime probes, no deferred relighting, just a lookup table.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-step-5-vibe-code-with-the-playcanvas-vs-code-extension">🛠️ Step 5: Vibe Code with the PlayCanvas VS Code Extension<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#%EF%B8%8F-step-5-vibe-code-with-the-playcanvas-vs-code-extension" class="hash-link" aria-label="Direct link to 🛠️ Step 5: Vibe Code with the PlayCanvas VS Code Extension" title="Direct link to 🛠️ Step 5: Vibe Code with the PlayCanvas VS Code Extension" translate="no">​</a></h3>
<p>I didn't write any of this in the PlayCanvas web editor's code panel. I used the <a href="https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension" target="_blank" rel="noopener noreferrer" class=""><strong>PlayCanvas extension for VS Code</strong></a> - which also works inside <a href="https://cursor.com/" target="_blank" rel="noopener noreferrer" class="">Cursor</a>, so I could pair-program with Claude while editing.</p>
<p>Save the file → the editor picks up the change → reload the launch tab → test. That round-trip is measured in seconds.</p>
<p>Most of the gameplay logic in this demo - <code>character-controller.js</code>, <code>anim-states.js</code>, <code>npc-ai.js</code>, <code>probes.js</code> - was iterated on entirely from Cursor.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>Install the <a href="https://marketplace.visualstudio.com/items?itemName=playcanvas.playcanvas" target="_blank" rel="noopener noreferrer" class="">PlayCanvas VS Code extension</a>. If you live in VS Code or Cursor, it turns PlayCanvas into a normal dev environment.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-6-version-your-project-with-playcanvas--github">🔄 Step 6: Version Your Project with PlayCanvas + GitHub<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-6-version-your-project-with-playcanvas--github" class="hash-link" aria-label="Direct link to 🔄 Step 6: Version Your Project with PlayCanvas + GitHub" title="Direct link to 🔄 Step 6: Version Your Project with PlayCanvas + GitHub" translate="no">​</a></h3>
<p>"What did I change yesterday, and how do I roll back?" PlayCanvas ships a first-party <a href="https://developer.playcanvas.com/user-manual/editor/version-control/" target="_blank" rel="noopener noreferrer" class=""><strong>version control</strong></a> that answers exactly that. You can also use GitHub at the root of your locally synced PlayCanvas project (via the VS Code extension). Don't forget to add a <code>.pcignore</code> so the <code>.git</code> folder isn't synced to the cloud.</p>
<p>Combined with the VS Code extension, this is about as close to "I'm working in a normal repo" as I've ever had in a browser-first engine. If I break the NPC AI, I'm one <code>git revert</code> away from last night's working build.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>Link a GitHub repo to your PlayCanvas project before you start. You'll thank yourself the first time an AI coding agent commits a bad refactor at 1 AM.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-7-generate-a-navmesh-from-the-collision-mesh">🧭 Step 7: Generate a Navmesh from the Collision Mesh<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-7-generate-a-navmesh-from-the-collision-mesh" class="hash-link" aria-label="Direct link to 🧭 Step 7: Generate a Navmesh from the Collision Mesh" title="Direct link to 🧭 Step 7: Generate a Navmesh from the Collision Mesh" translate="no">​</a></h3>
<p>NPCs can't path on a splat either - they need a navmesh. For the runtime, I use <a href="https://github.com/isaac-mason/recast-navigation-js" target="_blank" rel="noopener noreferrer" class=""><strong>recast-navigation</strong></a>, loaded straight from <code>esm.sh</code> with dynamic import - zero bundler, just:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> recast </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">import</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'https://esm.sh/recast-navigation'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword control-flow" style="color:#00009f">await</span><span class="token plain"> recast</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">init</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> imported </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> recast</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">importNavMesh</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Uint8Array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">navmeshBuffer</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>To <em>produce</em> the <code>navmesh.bin</code> binary, I feed the same <code>scene.collision.glb</code> from Step 3 into a small offline Recast-based generator. The collision mesh already represents "solid floor you can walk on", so Recast just has to rasterize it, filter walkable spans and build the nav polygons - takes a few seconds.</p>
<p>I'm cleaning up the generator into a standalone library and will publish it on GitHub shortly - drop-in collision-GLB-to-navmesh-binary for any PlayCanvas project. Follow my <a href="https://x.com/yak32" target="_blank" rel="noopener noreferrer" class="">X account</a> if you want the drop.</p>
<p>Want to see the navmesh in-game? Press <strong>N</strong> in the demo to toggle the debug overlay - the walkable polygons, agent positions and current paths all light up on top of the splat.</p>
<p><img decoding="async" loading="lazy" alt="Recast navmesh debug overlay on the splat, toggled with the N key" src="https://blog.playcanvas.com/assets/images/gs-fps-nav-mesh-8556f03f3ab49c06e740de2ef287129d.jpg" width="3830" height="1908" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Coming soon</div><div class="admonitionContent_BuS1"><p>Once the library is live, it'll be a one-liner:<br>
<code>npx glb-to-navmesh scene.collision.glb navmesh.bin</code></p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-step-8-give-npcs-a-brain-with-behavior-trees-and-personalities">🧠 Step 8: Give NPCs a Brain with Behavior Trees and Personalities<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-step-8-give-npcs-a-brain-with-behavior-trees-and-personalities" class="hash-link" aria-label="Direct link to 🧠 Step 8: Give NPCs a Brain with Behavior Trees and Personalities" title="Direct link to 🧠 Step 8: Give NPCs a Brain with Behavior Trees and Personalities" translate="no">​</a></h3>
<p>The NPCs are the part I had the most fun with. Every soldier in the demo is driven by a classic <a href="https://www.gamedeveloper.com/programming/behavior-trees-for-ai-how-they-work" target="_blank" rel="noopener noreferrer" class=""><strong>behavior tree</strong></a> - the same abstraction Halo 2 popularized two decades ago and that's still the default for AAA AI in 2026.</p>
<p><code>Scripts/npc-ai.js</code> exposes four primitives:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">children</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// all must succeed</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">selector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token spread operator" style="color:#393A34">...</span><span class="token plain">children</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">   </span><span class="token comment" style="color:#999988;font-style:italic">// first non-failure wins</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">condition</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">pred</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">         </span><span class="token comment" style="color:#999988;font-style:italic">// leaf: true/false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">action</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">fn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">              </span><span class="token comment" style="color:#999988;font-style:italic">// leaf: 'success' | 'failure' | 'running'</span><br></div></code></pre></div></div>
<p>…and then every NPC's brain is built by composing those, parameterised by a <strong>personality</strong>:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">selector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isDead</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> autoRespawn</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        isAlive</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token function" style="color:#d73a49">selector</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">isReloading</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> stopShooting</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ammoEmpty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> doReload</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">traits</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">healPriority</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.4</span><span class="token plain">   </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">hpBelow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hpRetreatPct</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> hasPickupsNearby</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> goToPickup</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">traits</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">lootPriority</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.7</span><span class="token plain">   </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hasPickupsNearby</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> goToPickup</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">traits</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">retreatThreshold</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.3</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">hpBelow</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">hpRetreatPct</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> retreat</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token spread operator" style="color:#393A34">...</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">traits</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">aggression</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token plain">     </span><span class="token operator" style="color:#393A34">?</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token function" style="color:#d73a49">sequence</span><span class="token punctuation" style="color:#393A34">(</span><span class="token function" style="color:#d73a49">hasEnemiesInRange</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">attackRange</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> engageEnemy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            guard</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Spawn eight NPCs with eight different personalities - <strong>Sgt. Havoc</strong> (aggressive, pushes), <strong>Ghost</strong> (cautious, heals), <strong>Captain Valor</strong> (heroic), <strong>Strategist</strong> (tactical), <strong>Chaos</strong> (randomness 0.8, impossible to read), <strong>Loot Goblin</strong> (greedy, will run across the map for a pickup), <strong>Chicken</strong> (cowardly, retreats at 80% HP), <strong>Grumps</strong> (grumpy) - and they already feel distinct, because the <em>same</em> tree collapses to wildly different priority orders based on traits.</p>
<p>Each agent's <code>position</code>, <code>aimAngle</code>, <code>animBits</code> is updated every tick. The PlayCanvas side - <code>npc-controller.js</code> - is just a dumb bridge that reads those fields, sets the entity transform, picks an anim state, fires a muzzle-flash ray, triggers sounds. The AI itself has <strong>zero PlayCanvas dependencies</strong> except <code>pc.Vec3</code>; it could be lifted into Three.js, Babylon, a headless sim, whatever.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Try it now</div><div class="admonitionContent_BuS1"><p>If you've been nervous about behavior trees, read <a href="https://www.gamedeveloper.com/programming/behavior-trees-for-ai-how-they-work" target="_blank" rel="noopener noreferrer" class="">Chris Simpson's primer</a> and then copy my four-function implementation. It's 20 lines of code and it unlocks production-grade AI.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-what-you-need-to-build-one-of-these">🎮 What You Need to Build One of These<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-what-you-need-to-build-one-of-these" class="hash-link" aria-label="Direct link to 🎮 What You Need to Build One of These" title="Direct link to 🎮 What You Need to Build One of These" translate="no">​</a></h2>
<p>To recap the full stack:</p>
<ul>
<li class="">📥 <strong>Environment</strong> - any downloadable splat from <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a>, or your own capture.</li>
<li class="">📡 <strong>Streaming</strong> - convert with <code>splat-transform</code> to a streamed SOG folder so phones and slow connections don't stall.</li>
<li class="">🧱 <strong>Collider</strong> - <code>splat-transform --collision-mesh</code> → <code>.collision.glb</code>, dropped into PlayCanvas as a static mesh rigidbody.</li>
<li class="">💡 <strong>Lighting</strong> - bake a <code>lightness.json</code> grid with <code>probes.js</code>, sample it per-mesh-instance at runtime.</li>
<li class="">🛠️ <strong>Authoring</strong> - <a href="https://marketplace.visualstudio.com/items?itemName=playcanvas.playcanvas" target="_blank" rel="noopener noreferrer" class="">PlayCanvas VS Code extension</a> for a normal save-and-reload dev loop.</li>
<li class="">🔄 <strong>Versioning</strong> - <a href="https://developer.playcanvas.com/user-manual/editor/version-control/" target="_blank" rel="noopener noreferrer" class="">PlayCanvas version control</a> and/or GitHub via the VS Code extension.</li>
<li class="">🧭 <strong>Pathfinding</strong> - <a href="https://github.com/isaac-mason/recast-navigation-js" target="_blank" rel="noopener noreferrer" class="">recast-navigation</a> from <code>esm.sh</code>, fed a pre-baked <code>navmesh.bin</code> (generator library coming soon).</li>
<li class="">🧠 <strong>AI</strong> - <a href="https://www.gamedeveloper.com/programming/behavior-trees-for-ai-how-they-work" target="_blank" rel="noopener noreferrer" class="">behavior trees</a> + personality-driven traits.</li>
</ul>
<p>Every one of those pieces is free and open source. The whole thing ships as static files to a CDN. My build is 68 MB (splats environment streamed separately from AWS S3) and cold-loads in a few seconds.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h2>
<p>SuperSplat, <code>splat-transform</code>, recast-navigation and the PlayCanvas Engine are all open source. And so is <a href="http://playcanvas.com/project/1480299" target="_blank" rel="noopener noreferrer" class=""><strong>this demo</strong></a> - the whole PlayCanvas project is public. Sign up for a free PlayCanvas account, fork the project, and every script mentioned above (<code>probes.js</code>, <code>npc-ai.js</code>, <code>npc-controller.js</code>, the navmesh wrapper, and the rest) is yours to read or remix. If you take them somewhere cool, I want to see it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-try-it-break-it-tell-me">👂 Try It, Break It, Tell Me<a href="https://blog.playcanvas.com/turning-a-gaussian-splat-into-a-videogame#-try-it-break-it-tell-me" class="hash-link" aria-label="Direct link to 👂 Try It, Break It, Tell Me" title="Direct link to 👂 Try It, Break It, Tell Me" translate="no">​</a></h2>
<p><strong><a href="https://playcanv.as/p/qxGSuzYq/" target="_blank" rel="noopener noreferrer" class="">Play the demo</a></strong>. Stand in a bright room and watch an NPC walk into the shadow. Fire your weapon next to a wall and watch the splat flash. Crouch into a corner and notice the footsteps go quiet.</p>
<p>Then go build your own. If you have questions, find me and the rest of the splat-creator community on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> - that's where all the interesting splats-into-games conversations are happening right now.</p>
<p>See you in there.</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
            <category>playcanvas</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: Downloadable Splats, Licenses and Social Links]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links</guid>
            <pubDate>Thu, 16 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we shipped Walk Mode, Streamed LOD and Easy Upload — three huge upgrades for exploring and publishing splats. Today we're rolling out another set of features that make SuperSplat an even better home for the 3D Gaussian Splatting community.]]></description>
            <content:encoded><![CDATA[<p>Last month we shipped <strong><a class="" href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload">Walk Mode, Streamed LOD and Easy Upload</a></strong> — three huge upgrades for exploring and publishing splats. Today we're rolling out another set of features that make SuperSplat an even better home for the 3D Gaussian Splatting community.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-downloadable-splats">📥 Downloadable Splats<a href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links#-downloadable-splats" class="hash-link" aria-label="Direct link to 📥 Downloadable Splats" title="Direct link to 📥 Downloadable Splats" translate="no">​</a></h3>
<p>Splat owners can now make their scenes <strong>downloadable</strong>. Open the Manage page for any of your published splats, flip the toggle and your audience can grab the files directly from the scene page. You can download the <strong>source file</strong> we host or, when you need maximum compatibility with other software, download it as a <strong>PLY</strong>. Each scene tracks its <strong>download count</strong> so you can see how popular your work is.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Why make your splats downloadable?</div><div class="admonitionContent_BuS1"><p>Because it gets your work in front of more people. Downloadable scenes show up in filtered searches, get used in blog posts, research papers and apps — and every use requires <strong>attribution back to you</strong>. The more your work is shared, the more your name travels with it. Think of it as free marketing powered by the community.</p></div></div>
<p>Want to find downloadable splats? Head to the <a href="https://superspl.at/?features=downloadable&amp;time=all" target="_blank" rel="noopener noreferrer" class="">Explore</a> page to browse scenes that are available for download.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-download-splat.mp4" style="width:100%;height:auto"></video>
<p>Downloaded splats can be used anywhere — in your own apps, research projects or creative tools. A great option is to load them into your <strong>PlayCanvas</strong> projects via the <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> or the <a href="https://playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Editor</a>.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-to-playcanvas.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-creative-commons-licenses">📜 Creative Commons Licenses<a href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links#-creative-commons-licenses" class="hash-link" aria-label="Direct link to 📜 Creative Commons Licenses" title="Direct link to 📜 Creative Commons Licenses" translate="no">​</a></h3>
<p>Sharing your splats is great — but you should be able to decide <em>how</em> they're used. You can now assign a <strong>Creative Commons license</strong> to any downloadable splat, choosing from six CC 4.0 variants:</p>
<ul>
<li class=""><strong>CC BY</strong> — Attribution</li>
<li class=""><strong>CC BY-ND</strong> — Attribution, No Derivatives</li>
<li class=""><strong>CC BY-SA</strong> — Attribution, ShareAlike</li>
<li class=""><strong>CC BY-NC</strong> — Attribution, NonCommercial</li>
<li class=""><strong>CC BY-NC-ND</strong> — Attribution, NonCommercial, No Derivatives</li>
<li class=""><strong>CC BY-NC-SA</strong> — Attribution, NonCommercial, ShareAlike</li>
</ul>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-license-picker.mp4" style="width:100%;height:auto"></video>
<p>The download dialog displays official <strong>CC icons</strong> alongside a ready-to-copy <strong>credit line</strong>, making it easy for anyone who downloads your work to give proper attribution. A <strong>machine-readable license link</strong> is also embedded in the published scene so tools and search engines can pick it up automatically.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-social-profile-links">🔗 Social Profile Links<a href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links#-social-profile-links" class="hash-link" aria-label="Direct link to 🔗 Social Profile Links" title="Direct link to 🔗 Social Profile Links" translate="no">​</a></h3>
<p>Let the community know who you are. You can now add social links to your profile — <strong>Website</strong>, <strong>X</strong>, <strong>LinkedIn</strong> and <strong>YouTube</strong> — from your <a href="https://playcanvas.com/account" target="_blank" rel="noopener noreferrer" class="">PlayCanvas account settings</a>.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-social-links.mp4" style="width:100%;height:auto"></video>
<p>Your social icons will appear on your <strong>SuperSplat user page</strong> right alongside your published splats, making it easy for visitors to follow your work across the web.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-downloadable-splats-licenses-and-social-links#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[New in SuperSplat: Walk Mode, Streamed LOD and Easy Upload]]></title>
            <link>https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload</link>
            <guid>https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload</guid>
            <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Last month we launched SuperSplat Studio, giving creators the power to add annotations and cinematic post effects to their published splats. Today, we're back with the next wave of improvements - and this one's a big one.]]></description>
            <content:encoded><![CDATA[<p>Last month we launched <strong><a class="" href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio">SuperSplat Studio</a></strong>, giving creators the power to add annotations and cinematic post effects to their published splats. Today, we're back with the next wave of improvements - and this one's a big one.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-walk-mode">🚶 Walk Mode<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-walk-mode" class="hash-link" aria-label="Direct link to 🚶 Walk Mode" title="Direct link to 🚶 Walk Mode" translate="no">​</a></h3>
<p>You can now explore splats from a first-person perspective with the all-new <strong>Walk Mode</strong>. Step inside your scenes and experience them the way they were meant to be seen.</p>
<div class="iframe-container"><iframe loading="lazy" src="https://superspl.at/s?id=8429e5e2&amp;noanim" title="SuperSplat Viewer - URBEX: Sanatorium Inside - Part01" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"></iframe></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Click or tap anywhere in the scene above to walk there! Splat by <a href="https://www.linkedin.com/in/christoph-schindelar-79515351/" target="_blank" rel="noopener noreferrer" class="">Christoph Schindelar</a>.</p></div></div>
<p>The viewer defaults to a <strong>click-to-walk</strong> mode — just click or tap where you want to go and the camera will smoothly glide there. On desktop, press <strong>WASD</strong> at any time to switch to FPS-style controls. On mobile, open <strong>Settings</strong> to enable a <strong>pinch-to-move</strong> mode for full touchscreen navigation.</p>
<p>Check out the <a href="https://superspl.at/?features=walkable&amp;time=all" target="_blank" rel="noopener noreferrer" class="">full gallery of walkable splats</a> to explore many more scenes.</p>
<p>Walk Mode is powered by a new <strong>voxel-based collision</strong> system. When collision data is present in a scene, the viewer automatically enables first-person navigation.</p>
<p><img decoding="async" loading="lazy" alt="Voxel collision overlay" src="https://blog.playcanvas.com/assets/images/supersplat-viewer-voxels-62d4452ffb3fd531adc5345a03951233.jpg" width="3806" height="2157" class="img_ev3q"></p>
<p><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a> has been updated to generate this new voxel collision format. Collision generation is currently in <strong>developer preview</strong> — we're working closely with a select group of splat creators to dial it in. Expect to see more and more walkable splats appear in the coming days and we'll open the feature up to everyone once it's stable.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-streamed-level-of-detail">📡 Streamed Level of Detail<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-streamed-level-of-detail" class="hash-link" aria-label="Direct link to 📡 Streamed Level of Detail" title="Direct link to 📡 Streamed Level of Detail" translate="no">​</a></h3>
<p>Ever since we enabled splat publishing on SuperSplat, we've noticed a trend: your splats are getting <em>bigger</em>. While a typical desktop machine handles around 4 million Gaussians at high frame rates, we're now regularly seeing scenes published with over 10 million. That's a lot of Gaussians.</p>
<p>To make sure any device can render even the most ambitious scenes, we've introduced <strong>streamed LOD</strong>. Built on the highly capable <a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">SOG (Spatially Ordered Gaussians)</a> format, it slices scenes into small streamable chunks that load dynamically on demand. The viewer fetches only what's needed for the current viewpoint and device capability — so a phone and a high-end desktop both get the best experience they can handle.</p>
<p>LCC scenes captured on <a href="https://xgrids.com/" target="_blank" rel="noopener noreferrer" class="">XGRIDS</a> devices already ship with high-quality LODs built in. For everyone else, <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a> can generate streamed SOG from user-created PLYs representing different detail levels.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-easy-upload">📤 Easy Upload<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-easy-upload" class="hash-link" aria-label="Direct link to 📤 Easy Upload" title="Direct link to 📤 Easy Upload" translate="no">​</a></h3>
<p>Until now, the only way to publish a splat on SuperSplat was through the Editor. Today, we're introducing a brand new <strong>Easy Upload</strong> flow — just hit the <strong>Upload Splat</strong> button on the <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> homepage, drag and drop a PLY, SOG, Streamed SOG or LCC file and go live in seconds.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-publishing-easy.mp4" style="width:100%;height:auto"></video>
<p>We've also updated the existing <strong>Editor publishing flow</strong> to share the same new details dialog. When you publish from the <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a>, you'll now be redirected to your Manage page to fill in your splat's details while it's being prepared to go live.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-publishing-editor.mp4" style="width:100%;height:auto"></video>
<p>The new details dialog is just the beginning — expect more fields to appear soon covering license type, capture hardware and software and even geolocation. Stay tuned!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-playcanvas-engine-2170">⚡ PlayCanvas Engine 2.17.0<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-playcanvas-engine-2170" class="hash-link" aria-label="Direct link to ⚡ PlayCanvas Engine 2.17.0" title="Direct link to ⚡ PlayCanvas Engine 2.17.0" translate="no">​</a></h3>
<p>All of the above is powered by the open source <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a>, and this week sees the release of <strong>version 2.17.0</strong>. This release is laser-focused on splat rendering performance:</p>
<ul>
<li class=""><strong>Major frame rate gains</strong> for both WebGL2 and WebGPU</li>
<li class=""><strong>Refined LOD selection</strong> that dramatically improves visual quality</li>
<li class=""><strong>Device-aware optimizations</strong> carefully tuned for everything from phones to high-end desktops</li>
</ul>
<p>Check out the full <a href="https://github.com/playcanvas/engine/releases/tag/v2.17.0" target="_blank" rel="noopener noreferrer" class="">release notes on GitHub</a>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-free-and-open-source">💚 Free and Open Source<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-free-and-open-source" class="hash-link" aria-label="Direct link to 💚 Free and Open Source" title="Direct link to 💚 Free and Open Source" translate="no">​</a></h3>
<p>SuperSplat, SplatTransform and the PlayCanvas Engine are all <strong>free and open source</strong> under the MIT license. We believe the best tools for 3D on the web should be accessible to everyone.</p>
<p>If you're building a splat-based application, we'd love for you to build it on PlayCanvas. Check out our repos on GitHub:</p>
<ul>
<li class=""><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a></li>
<li class=""><a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a></li>
<li class=""><a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-we-want-to-hear-from-you">👂 We Want to Hear from You<a href="https://blog.playcanvas.com/new-in-supersplat-walk-mode-streamed-lod-and-easy-upload#-we-want-to-hear-from-you" class="hash-link" aria-label="Direct link to 👂 We Want to Hear from You" title="Direct link to 👂 We Want to Hear from You" translate="no">​</a></h3>
<p>What do you think of the new features? What would you like to see next? Come and join us on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord</a> — it's where the world's best splat creators hang out and we'd love to have you there.</p>
<p>See you in there!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[Build Gaussian Splat Experiences with SuperSplat Studio]]></title>
            <link>https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio</link>
            <guid>https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio</guid>
            <pubDate>Wed, 11 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are thrilled to announce the launch of SuperSplat Studio — a brand new application for authoring interactive Gaussian splat-based experiences. Built on the SuperSplat platform, Studio takes your published splats to the next level, letting you craft rich, engaging presentations that tell a story.]]></description>
            <content:encoded><![CDATA[<p>Today, we are thrilled to announce the launch of <strong>SuperSplat Studio</strong> — a brand new application for authoring interactive Gaussian splat-based experiences. Built on the <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> platform, Studio takes your published splats to the next level, letting you craft rich, engaging presentations that tell a story.</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/tiKw_VGytq8" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-annotations-and-hotspots">📌 Annotations and Hotspots<a href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio#-annotations-and-hotspots" class="hash-link" aria-label="Direct link to 📌 Annotations and Hotspots" title="Direct link to 📌 Annotations and Hotspots" translate="no">​</a></h3>
<p>SuperSplat Studio lets you place informational hotspots directly onto your splat. Each annotation consists of a title, a description and a camera viewpoint. When a viewer clicks a hotspot, the camera smoothly transitions to the saved viewpoint and reveals the annotation content.</p>
<p>This makes it easy to build educational walkthroughs, product showcases or guided tours of your 3D scenes. Simply position your camera, click to place a hotspot and fill in the details. You can add up to 25 annotations per scene and reorder them however you like.</p>
<p>The SuperSplat Viewer features a new <strong>annotation navigation bar</strong> that lets viewers cycle through all annotations in sequence. It's a great way to guide your audience through the key points of interest in your scene.</p>
<p>Check out this interactive honeybee by SuperSplat community member <a href="https://superspl.at/user?id=danylyon" target="_blank" rel="noopener noreferrer" class="">Dany Bittel</a> to see the new annotations in action:</p>
<div class="iframe-container"><iframe loading="lazy" src="https://superspl.at/s?id=3ae6a716" title="SuperSplat Viewer - Bumblebee" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; fullscreen"></iframe></div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>Click the hotspot markers or use the navigation bar at the top to explore each annotation!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-post-effects">✨ Post Effects<a href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio#-post-effects" class="hash-link" aria-label="Direct link to ✨ Post Effects" title="Direct link to ✨ Post Effects" translate="no">​</a></h3>
<p>Want your splats to really pop? SuperSplat Studio gives you access to a comprehensive set of post effects powered by the <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a>. Apply cinematic polish to your scenes with just a few clicks:</p>
<ul>
<li class=""><strong>Bloom</strong> — Add a soft glow to bright areas for a dreamy, cinematic look.</li>
<li class=""><strong>Sharpen</strong> — Crisp up fine details and make your splats look razor sharp.</li>
<li class=""><strong>Vignette</strong> — Darken the edges of the frame to draw the viewer's eye to the center.</li>
<li class=""><strong>Color Grading</strong> — Fine-tune brightness, contrast, saturation and tint.</li>
<li class=""><strong>Chromatic Fringing</strong> — Add a subtle lens fringing effect for extra realism.</li>
</ul>
<p>All effects update in real time as you tweak the sliders, so you can dial in the perfect look instantly.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-tonemapping-and-background">🎨 Tonemapping and Background<a href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio#-tonemapping-and-background" class="hash-link" aria-label="Direct link to 🎨 Tonemapping and Background" title="Direct link to 🎨 Tonemapping and Background" translate="no">​</a></h3>
<p>SuperSplat Studio also gives you control over tonemapping and background color. Choose from a range of tonemapping operators including Linear, Filmic, ACES, ACES 2.0, Hejl and Neutral to get the tonal response you want. And set a custom background color to complement your scene or match your brand.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Bloom and other HDR-dependent effects require <strong>High Precision Rendering</strong> to be enabled. Toggle it on in the Scene settings panel to unlock the full range of post effects.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-get-started">🚀 Get Started<a href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio#-get-started" class="hash-link" aria-label="Direct link to 🚀 Get Started" title="Direct link to 🚀 Get Started" translate="no">​</a></h3>
<p>Ready to create your first interactive splat experience? Upload and publish your splat via the <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a>, then visit your <a href="https://superspl.at/manage" target="_blank" rel="noopener noreferrer" class="">Manage page</a> and select the <strong>Edit</strong> icon to open it in SuperSplat Studio. From there, add annotations, apply post effects and make your splat shine. It's never been easier to build compelling 3D content for the web.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/build-gaussian-splat-experiences-with-supersplat-studio#-your-feedback-matters" class="hash-link" aria-label="Direct link to 👂 Your Feedback Matters" title="Direct link to 👂 Your Feedback Matters" translate="no">​</a></h3>
<p>We're incredibly excited to bring SuperSplat Studio to the community and we can't wait to see what you create with it!</p>
<p>What features would you like to see next? Let us know on the <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a>!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[AI-Powered 3DGS Product Visualization - Developer Spotlight on Voxelo]]></title>
            <link>https://blog.playcanvas.com/ai-powered-3dgs-product-visualization-developer-spotlight-on-voxelo</link>
            <guid>https://blog.playcanvas.com/ai-powered-3dgs-product-visualization-developer-spotlight-on-voxelo</guid>
            <pubDate>Thu, 22 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to the sixth edition of Developer Spotlight, a series of blog articles where we talk to developers about how they use PlayCanvas and showcase the fantastic work they are doing on the web.]]></description>
            <content:encoded><![CDATA[<p>Welcome to the sixth edition of Developer Spotlight, a series of blog articles where we talk to developers about how they use PlayCanvas and showcase the fantastic work they are doing on the web.</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/ERnS5agXBkk" title="Voxelo.ai - AI-Powered 3DGS Product Visualization" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<p>Today, we are excited to be joined by Vladimir, Roman and Ben from <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo</a> as they celebrate the beta release of <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a> 2.0.</p>
<p><strong>Welcome to our Developer Spotlight! Tell us a bit about yourselves.</strong></p>
<p><em>Vlad</em>: We’re the team behind a new solution - <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class=""><strong>Voxelo.ai</strong></a> - an ambitious group of engineers and product builders with backgrounds spanning 3D, AI, e-commerce and marketing. We’ve spent years working across web-based 3D, product visualization, and content production, and Voxelo.ai grew out of a shared frustration: e-commerce product experiences haven’t evolved nearly enough, and traditional 3D production is still too slow, expensive, and specialist-heavy.</p>
<p><img decoding="async" loading="lazy" alt="Voxelo Team" src="https://blog.playcanvas.com/assets/images/voxelo-team-6b5aa12f7a7be82c0c1ca42682a3585e.png" width="1600" height="900" class="img_ev3q"><br>
<em>Left to right: Ben McKay, COO (ex-WPP agency and product leader); Vladimir Mulhem, CEO (ex-founder of 3D agency Creative Content Works); Roman Bromidge, CTO (ex-founder of Kaedim, a 3D AI start-up)</em></p>
<p><strong>How did you first discover PlayCanvas?</strong></p>
<p><em>Roman</em>: PlayCanvas kept coming up whenever we looked at high-performance, production-grade 3D viewers. As soon as we started testing real-time viewers for high-fidelity 3D assets, it became clear that PlayCanvas was setting the benchmark for performance and advanced features.</p>
<p><em>Vlad</em>: It wasn’t just about the technical merits of the platform today. Having met with Will Eastcott a few times, we were excited by the alignment in ambition and direction. That kind of shared mindset really matters when choosing long-term partners.</p>
<p><strong>What made you choose PlayCanvas instead of other web technologies?</strong></p>
<p><em>Ben</em>: Customers are king. That’s always the starting point. Our customers are e-commerce businesses where CX and web performance directly impact sales, so we have to maximize visual fidelity without compromising performance. Anything less than industry-leading simply isn’t good enough.</p>
<p><em>Roman</em>: We tested plenty of alternatives, but PlayCanvas consistently delivered better frame rates, lower memory usage, and a more robust engine-level architecture. For a commercial platform like <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a>, that reliability is critical. Add to that its open-source nature and flexibility - it fits perfectly with our ambitious roadmap and avoids locking us into rigid development models.</p>
<p><strong>Let’s talk about Voxelo.ai. In your own words, what is Voxelo.ai and what problem does it solve?</strong></p>
<p><img decoding="async" loading="lazy" alt="Voxelo Platform" src="https://blog.playcanvas.com/assets/images/voxelo-platform-19c01900acedb337517f2f2dfd19a114.png" width="2048" height="1173" class="img_ev3q"></p>
<p><em>Ben</em>: <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a> is building a new type of AI content studio, with 3D at its heart. Our goal is to close the buyer confidence gap by bringing people closer to a product’s features and benefits through better product content.</p>
<p>We start by turning simple product videos and images into ultra-realistic 3D digital twins - optimised Gaussian splats. We listened closely to e-commerce businesses and designed a user-generated 3D workflow that lets them access the benefits of 3D without expensive equipment, specialist skills, long timelines, or big budgets. That’s a huge unlock for e-commerce. We refer to it as <a href="https://www.voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">UG3D®</a> to underline the accessibility of this new format.</p>
<p>This serves two major needs.</p>
<p>First, consumers consistently say they want 3D because it increases confidence when buying - which means businesses increasingly <em>need</em> 3D. We make that accessible.</p>
<p>Second, it’s about operational efficiency. Once you have a 3D digital twin, almost anything becomes possible in product content - and that’s what we’re rolling out now.</p>
<p>With a digital twin, customers can create interactive 3D models, AR experiences, lifestyle imagery, and on-brand product visuals - all within an end-to-end platform. With PlayCanvas’ help, Voxelo delivers this at high impact, high speed, and low cost.</p>
<p><strong>3D and AI-driven 3D is evolving fast - what excites you most about this space?</strong></p>
<p><em>Roman</em>: The shift from handcrafted 3D to data-driven 3D is huge. AI makes it possible to generate rich spatial content from everyday inputs like video. That fundamentally changes who can create 3D, and how often it can evolve.</p>
<p><em>Vlad</em>: There’s a real 3D wave coming. It’s been building for years, but falling compute costs and better infrastructure mean businesses can finally deliver truly immersive shopping experiences at scale. Voxelo is right at the forefront of this. With support from Innovate UK, we’re investing heavily in R&amp;D to make 3D’s value accessible to far more people.</p>
<p><strong>How does Voxelo.ai make 3D content more accessible for non-technical users?</strong></p>
<p><em>Ben</em>: We obsess over workflow simplicity. Users don’t need to understand meshes, textures, or rendering pipelines. They upload a 3–4 minute video, Voxelo processes it, and they get a web-ready 3D + AR experience straight out of the box.</p>
<p>Creation, processing, and publishing are all just a few clicks. We want solo entrepreneurs wearing multiple hats to feel just as comfortable as global retailers.</p>
<p><strong>Could you walk us through the process of creating a 3D asset with Voxelo.ai?</strong></p>
<p><em>Roman</em>: The pipeline is intentionally simple:</p>
<ul>
<li class="">Shoot a 3–4 minute product video (most people use mobile phones, but DSLRs are great too)</li>
<li class="">Upload it to <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a></li>
<li class="">Publish your product in 3D and AR</li>
</ul>
<p>More advanced AI features are on the way. From there, we can also generate classic e-commerce imagery and lifestyle shots, all powered by the same 3D digital twin.</p>
<p><strong>Can you give an example of how Voxelo.ai is being used effectively today?</strong></p>
<p><em>Ben</em>: We’re seeing strong traction in e-commerce product visualization, especially in categories where detail and realism matter—fashion, footwear, furniture, and homeware.</p>
<p>Early customers include major brands and retailers like Cosatto and SportShoes.com that are looking for scalability without compromising on the quality.</p>
<div class="iframe-container"><iframe loading="lazy" src="https://app.voxelo.ai/viewer/md7aja12f2x9csfkjkdamc1sdh7z6cv2" title="Voxelo.ai 3D Product Viewer" allow="fullscreen; xr-spatial-tracking"></iframe></div>
<p>We see the greatest need, though, with mid-sized companies who are looking for a customer experience edge but haven’t had the budgets for costly 3D production previously. These have included emerging fashion designers like BEPO, who turn military parachutes into designer clothing, or Recondition, who make jeans for people with mobility challenges. Or manufacturers, like Eden Play, who need help showcasing the quality of their hand-crafted playground equipment. Each has a story to tell and 3D can help.</p>
<p>And the applications keep expanding. From cars to cushions, pottery to plants, sofas to shoes - when cost, complexity, and time drop this much, 3D is no longer reserved for only big-ticket items.</p>
<p><strong>How did PlayCanvas help you deliver a smooth experience across desktop and mobile?</strong></p>
<p><em>Roman</em>: PlayCanvas gives us a consistent rendering layer across devices. The same asset works smoothly on desktop and mobile, with intelligent handling of performance constraints. That consistency is absolutely crucial for e-commerce customers.</p>
<p><strong>Were there any technical challenges integrating PlayCanvas, and how did you overcome them?</strong></p>
<p><em>Roman</em>: The main challenge was integrating PlayCanvas effectively into our React application while still extracting maximum performance. The biggest surprise was how, once we embraced PlayCanvas as a web-based game engine, many of our integration hurdles dissolved. Initially, we started with PlayCanvas React for rapid prototyping, which was great for verifying our concepts. However, we sometimes struggled with mapping specific functionalities not directly exposed by the wrapper, requiring us to write custom scripts to interface with the underlying engine systems.</p>
<p>For some of the more involved functionalities, like our AR viewer and splat editor, we found building them as native PlayCanvas applications and then linking or embedding them within our existing React app significantly improved both performance and development speed. This approach helped us minimize dependencies and side effects, allowing us to get the most out of the engine.</p>
<p><strong>Can you share any interesting performance optimizations you’ve implemented?</strong></p>
<p><em>Roman</em>: The greatest satisfaction came from the enormous performance gains we achieved over our previous 3D viewer implementation. We more than doubled the frame rate, and by leveraging PlayCanvas' <a class="" href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting">SOG format</a>, our 3D files are now a third of the size of our already compressed previous format. We've seen a 95%+ reduction in file size for the SOG file versus the raw PLY output from our 3D AI reconstruction process. It's amazing how a few simple, often overlooked things can dramatically improve performance; it just goes to show that thoroughly reading the documentation is always worthwhile. For instance, turning off anti-aliasing for our PlayCanvas app significantly boosts performance when rendering Gaussian splats—one little flag made a huge difference!</p>
<div class="iframe-container"><iframe loading="lazy" src="https://app.voxelo.ai/viewer/md7fq8htbf3j32vvan94xv36p17vr4vn" title="Voxelo.ai 3D Product Viewer" allow="fullscreen; xr-spatial-tracking"></iframe></div>
<p><strong>Voxelo.ai has recently launched - how has the feedback been so far?</strong></p>
<p><em>Ben</em>: The feedback has been really encouraging. We’ve been open and transparent with users from day one, building <em>with</em> them rather than just <em>for</em> them. That partnership approach has been invaluable - it’s helped us effectively map out the next three years of product features and value (on top of plenty of ideas we already had ourselves).</p>
<p>Some of the early feedback has been usability-focused - things like making the capture process more intuitive, or improving guidance and help resources. But the most exciting feedback has been around our direction and ambition: users are asking for even more features, recognizing the recent performance gains (especially since deploying PlayCanvas), and calling out the jump in visual fidelity - in many cases comparable to high-quality e-commerce product photography.</p>
<div class="iframe-container"><iframe loading="lazy" src="https://app.voxelo.ai/viewer/md74wqcrsvfmp5055jthr3dy397xgkjq" title="Voxelo.ai 3D Product Viewer" allow="fullscreen; xr-spatial-tracking"></iframe></div>
<p><strong>Who do you see as the ideal audience or customer for Voxelo.ai?</strong></p>
<p><em>Ben</em>: Our initial hypothesis was that SME retailers - particularly in footwear, fashion, furniture, and homeware - would benefit most from <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a>. That’s still very much true. But the biggest surprise has been the level of enterprise interest.</p>
<p>Large brands are wrestling with the same questions: <em>How do we create gold-standard PDPs (product detail pages)?</em> <em>How do we elevate our product experience and give us a competitive edge?</em></p>
<p>We’re building a new type of AI content studio powered by 3D - but designed to be genuinely easy to use and ready to scale across existing and emerging AI-powered workflows.</p>
<p><strong>What are your plans for upcoming features or improvements?</strong></p>
<p><em>Roman</em>: Tons! More to come, but as a teaser - yes, we’re leaning hard into AI (I mean, who isn’t?). The goal is to make the product as easy and scalable as possible. We're rolling out a wave of new features in Q1, and a key focus will be refining and streamlining the onboarding experience - it’s a critical area we don’t want to overlook.</p>
<p>More broadly, we're optimizing to become ultra-native to e-commerce teams - embedding more deeply into their workflows, tools, and day-to-day operations.</p>
<p><em>Vlad</em>: Thanks in part to support from Innovate UK and our partnership with the University of Manchester, we’ve built a strong R&amp;D pipeline. Some aspects of the roadmap are still exploratory, but we’re not flying blind - we’re backing our ideas with a strong team and grounded market insight. A big theme is reducing the inputs required to create 3D while expanding what customers can do creatively, especially with AI. There’s a lot of potential here, and we’re excited for both the team and our users to push into these next frontiers.</p>
<p><strong>How can the PlayCanvas community try Voxelo.ai or get involved?</strong></p>
<p><em>Ben</em>: We’re actively onboarding early users and collaborators. The PlayCanvas community is ace, and we’re always keen to hear feedback from developers building real-world 3D products.</p>
<p>Whilst we’re building for non-technical users, we’re also hearing that technical specialists might well value simplified workflow. If any of the community want to create an account or partner in some way, <a href="https://v2.voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">please register here</a> or email the team at <a href="mailto:hello@voxelo.ai" target="_blank" rel="noopener noreferrer" class="">hello@voxelo.ai</a>.</p>
<p><strong>Where do you see web-based photorealistic 3D content heading in the next few years?</strong></p>
<p><em>Vlad</em>: We believe 3D will become <strong>as standard as images and video</strong>, especially in commerce. AI will continue to reduce costs and friction, while engines like PlayCanvas make delivery seamless across devices.</p>
<p><em>Roman</em>: In the future, I believe it will become standard to have a 3D digital twin of your products, available at any time for you to leverage to make new content and help understand your buyers. No more messy management of ten different content pipelines, no more figuring out which warehouse your stock is in so you can ship it to the photographer, no more lost sales because you couldn't quite realize your vision for how the product can be shown. Furthermore, with embedded 3D on your product page, you can understand your customer better than ever before: what exactly do customers look at on your product before they click buy? What do they spend the most time examining? With <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a>, we're really excited because having a realistic 3D representation of your product enables so many more opportunities to improve buyer confidence and gain deeper understanding of your customers.</p>
<p><em>Ben</em>: I hope to see it across all web platforms...at least in the context of social commerce. It feels odd that the technology now exists, consumers want it and businesses need it. It has the potential to increase consumers' product comprehension, increase growth and reduce returns (and with it, reduce carbon footprint)...and yet. Surely, it’s just around the corner. Surely.</p>
<p><strong>Any advice for developers looking to build commercial products on PlayCanvas?</strong></p>
<p><em>Roman</em>: Build with real users early. PlayCanvas is incredibly capable, but the biggest wins come from pairing strong performance with simple, opinionated, constructive and collaborative user experiences. Don't be afraid to ask questions, read the docs thoroughly, and think of it more like a game engine than a traditional web dependency.</p>
<p><strong>What’s been the most rewarding part of building Voxelo.ai so far?</strong></p>
<p><em>Vlad</em>: I’ve spent the vast majority of my career obsessed with 3D, because in e-commerce the limitations of a flat, 2D screen are felt more acutely than anywhere else. We ask customers to make purchase decisions without touch, weight, scale, or presence - and then wonder why confidence drops and returns go up.</p>
<p>Turning a 2D screen into a 3D experience fundamentally changes that equation. 3D allows products to be explored rather than imagined. It gives shoppers clarity around form, proportion, detail, and quality - the same cues they rely on in the physical world. When done well, 3D doesn’t just look impressive; it reduces uncertainty, builds trust, and helps people buy with confidence.</p>
<p>What excites me most today is that 3D is finally becoming viable at e-commerce scale. Historically, it’s been too expensive, too slow, and too specialist-driven to deploy across large catalogues. With real-time web engines and AI-driven 3D creation, we’re reaching an inflection point where 3D can be produced as naturally as images or video.</p>
<p>That shift unlocks a future where 3D isn’t a novelty or a campaign asset, but a core layer of product content - helping every shopper better understand what they’re buying, and helping brands convert more confidently at scale.</p>
<p><em>Roman</em>: The most rewarding part has been building all the exciting ways for users to leverage their 3D digital twin. From my background as co-founder of Kaedim, I understood that 3D is critical for so many industries, yet so underutilized because of its cost and difficulty. Now, I'm really excited to enable new generations of creatives to transform their products into 3D and from there into anything they can imagine.</p>
<p><em>Ben</em>: Just to add…seeing users create compelling 3D experiences without needing to become 3D experts. That moment when something complex suddenly feels easy is exactly why we built <a href="https://voxelo.ai/" target="_blank" rel="noopener noreferrer" class="">Voxelo.ai</a>…and will continue to build in a way that grows buyer confidence.</p>
<p><strong>What’s one message you want to leave with our readers?</strong></p>
<p><em>Ben</em>: 3D has tried to break through before - but this time, it feels a little different. The tech is ready, costs are dropping dramatically and growing numbers of communities are rallying. And now, AI has blown the doors open on creative potential. Interactive, ultra-real 3D and AI is no longer coming - it’s here - and Voxelo is all in on re-imagining how this impacts new digital experiences. Huge thanks to the community for the support!</p>
<p><strong>Thanks for chatting with us, Vlad, Roman and Ben!</strong></p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>spotlight</category>
        </item>
        <item>
            <title><![CDATA[New PlayCanvas Visual Studio Extension]]></title>
            <link>https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension</link>
            <guid>https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension</guid>
            <pubDate>Tue, 25 Nov 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today we are unveiling our new PlayCanvas VSCode Extension!]]></description>
            <content:encoded><![CDATA[<p>Today we are unveiling our new <a href="https://github.com/playcanvas/vscode-extension" target="_blank" rel="noopener noreferrer" class="">PlayCanvas VSCode Extension</a>!</p>
<p><img decoding="async" loading="lazy" alt="VSCode Extension" src="https://blog.playcanvas.com/assets/images/vscode-demo-7911ab7deebb2be9303879248a482d76.webp" width="1920" height="1080" class="img_ev3q"></p>
<p>The PlayCanvas VS Code Extension is a realtime editing environment for text-based assets from the <a href="https://github.com/playcanvas/editor" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Editor</a> platform.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Open Source</div><div class="admonitionContent_BuS1"><p>The PlayCanvas VS Code Extension is <a href="https://github.com/playcanvas/vscode-extension" target="_blank" rel="noopener noreferrer" class="">open-sourced under an MIT license on GitHub</a></p></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-overview">🚀 Overview<a href="https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension#-overview" class="hash-link" aria-label="Direct link to 🚀 Overview" title="Direct link to 🚀 Overview" translate="no">​</a></h3>
<p>This release represents a major step forward from the previous version of the PlayCanvas VS Code Extension — bringing <strong>deeper integration, improved collaboration, and stronger developer tooling</strong>.</p>
<p>Here’s what’s new:</p>
<ul>
<li class=""><strong>Realtime Asset Syncing:</strong> Text-based assets now update instantly between VS Code and the PlayCanvas Editor, allowing seamless editing without manual uploads or refreshes.</li>
<li class=""><strong>Live File Collaborators:</strong> See who’s working in the same file at any given time, helping teams avoid conflicts and improve coordination.</li>
<li class=""><strong>Full Type Checking for Scripts:</strong> Enjoy comprehensive TypeScript support with inline error detection and autocomplete for all PlayCanvas script types.</li>
<li class=""><strong>Disk-Mapped File System:</strong> The extension now mirrors your PlayCanvas project structure locally on disk, unlocking improved integration with external tools — including <strong>AI-powered agents and code assistants</strong>.</li>
</ul>
<p>These upgrades make the extension faster, smarter, and better aligned with modern development workflows.</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-getting-started">🧰 Getting Started<a href="https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension#-getting-started" class="hash-link" aria-label="Direct link to 🧰 Getting Started" title="Direct link to 🧰 Getting Started" translate="no">​</a></h3>
<ol>
<li class=""><a href="https://marketplace.visualstudio.com/items?itemName=playcanvas.playcanvas" target="_blank" rel="noopener noreferrer" class="">Install the extension</a> from the VS Code Marketplace.</li>
<li class="">Sign in with your PlayCanvas account when prompted.</li>
<li class="">Open the Command Palette (<code>Ctrl</code>/<code>Cmd</code> + <code>P</code>) and run <code>PlayCanvas: Open Project</code>.</li>
<li class="">Start editing — your changes appear instantly in the PlayCanvas Editor.</li>
</ol>
<table><thead><tr><th>Editor</th><th>Supported</th></tr></thead><tbody><tr><td>VS Code</td><td>✅</td></tr><tr><td>Cursor</td><td>✅</td></tr></tbody></table>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-contribute">🛠️ Contribute<a href="https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension#%EF%B8%8F-contribute" class="hash-link" aria-label="Direct link to 🛠️ Contribute" title="Direct link to 🛠️ Contribute" translate="no">​</a></h3>
<p>We welcome contributions from the community!
To set up your local development environment, check out the <a href="https://github.com/playcanvas/vscode-extension/blob/main/README.md" target="_blank" rel="noopener noreferrer" class="">README</a> for more information.</p>
<p>We’ve made major improvements for contributors, including:</p>
<ul>
<li class="">Clearer code organization</li>
<li class="">Stronger TypeScript support</li>
<li class="">Streamlined debugging</li>
<li class="">Comprehensive testing suite</li>
</ul>
<p>Be part of shaping the PlayCanvas VS Code Extension’s future — share feedback, contribute improvements, or show your support by starring <a href="https://github.com/playcanvas/vscode-extension" target="_blank" rel="noopener noreferrer" class="">our GitHub repository</a>! ⭐</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-join-the-community">💬 Join the Community<a href="https://blog.playcanvas.com/new-playcanvas-visual-studio-code-extension#-join-the-community" class="hash-link" aria-label="Direct link to 💬 Join the Community" title="Direct link to 💬 Join the Community" translate="no">​</a></h3>
<p>We’re incredibly excited about this new phase for the PlayCanvas ecosystem, and your feedback plays a vital role in shaping its future. Whether you’re contributing code, sharing ideas, or showcasing your projects, we’d love to hear from you.</p>
<p>Connect with the PlayCanvas community and be part of our open-source journey:</p>
<ul>
<li class="">💬 <a href="https://discord.gg/RSaMRzg" target="_blank" rel="noopener noreferrer" class="">Discord</a> — Chat with other PlayCanvas developers in real time</li>
<li class="">🌐 <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">Forum</a> — Join in-depth technical discussions</li>
<li class="">🧵 <a href="https://www.reddit.com/r/PlayCanvas" target="_blank" rel="noopener noreferrer" class="">Reddit</a> — Share your projects and experiences</li>
<li class="">🐦 <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">X (Twitter)</a> — Follow for the latest updates and announcements</li>
</ul>
<p>Your insights help us make PlayCanvas better for everyone. What features are you most excited about, or what would you love to see next? Join the conversation and help us define the future of web-based interactive development.</p>]]></content:encoded>
            <category>editor</category>
            <category>vscode</category>
            <category>scripting</category>
        </item>
        <item>
            <title><![CDATA[PlayCanvas Open Sources SOG: The WebP of Gaussian Splatting]]></title>
            <link>https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting</link>
            <guid>https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting</guid>
            <pubDate>Wed, 17 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Goodbye SOGS. Hello SOG! 👋]]></description>
            <content:encoded><![CDATA[<p>Goodbye SOGS. Hello SOG! 👋</p>
<p>Back in May, <a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression" target="_blank" rel="noopener noreferrer" class="">PlayCanvas announced support for SOGS</a>, a revolutionary super-compressed format for 3D Gaussian splats. While SOGS was a huge leap beyond other compression techniques, we were still not satisfied! So we set about designing a new and improved iteration of the format.</p>
<p>Today, we are proud to introduce <strong>SOG: Spatially Ordered Gaussians</strong>.</p>
<div class="iframe-container"><iframe id="viewer" width="800" height="500" allow="fullscreen; xr-spatial-tracking" src="https://superspl.at/s?id=964b09c1"></iframe></div>
<p><em>The Skate Park above is not a video!</em> Navigate around the scene and explore! The splat was scanned by <a href="https://www.linkedin.com/in/christoph-schindelar-79515351/" target="_blank" rel="noopener noreferrer" class="">Christoph Schindelar</a>. It has 4 million Gaussians but is compressed to a mere 42MB with SOG. The original PLY was 1GB, meaning a <strong>~95% reduction</strong> in file size.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-sog">What is SOG<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#what-is-sog" class="hash-link" aria-label="Direct link to What is SOG" title="Direct link to What is SOG" translate="no">​</a></h3>
<p>SOG shares a great deal in common with its predecessor. It is still a <code>meta.json</code> file that references multiple <code>.webp</code> images. So what's new and why is it better?</p>
<p>📦 <strong>More convenient:</strong> Your SOG splats can now also be written to a single <code>.sog</code> file<br>
<!-- -->⚡ <strong>Faster to load:</strong> SOG stores splat data in Morton order meaning it's 'GPU-ready' and doesn't require processing on load<br>
<!-- -->🗜️ <strong>Easier to compress:</strong> SOGS compression required CUDA but SOG only needs WebGPU so it runs anywhere<br>
<!-- -->🎯 <strong>More precision:</strong> SOG minimizes compression artifacts by making smarter use of the same number of bits</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="converting-to-sog-with-splattransform">Converting to SOG with SplatTransform<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#converting-to-sog-with-splattransform" class="hash-link" aria-label="Direct link to Converting to SOG with SplatTransform" title="Direct link to Converting to SOG with SplatTransform" translate="no">​</a></h3>
<p>To create <code>.sog</code> files (or unbundled <code>.json</code> + <code>.webp</code> files), we provide the open source <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a> CLI tool. To install it, just issue this command:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npm install -g @playcanvas/splat-transform</span><br></div></code></pre></div></div>
<p>And to convert, do:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform input.ply output.sog</span><br></div></code></pre></div></div>
<p>What could be easier? 🎉</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="engine-support-for-sog">Engine Support for SOG<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#engine-support-for-sog" class="hash-link" aria-label="Direct link to Engine Support for SOG" title="Direct link to Engine Support for SOG" translate="no">​</a></h3>
<p>As you might expect, the open source <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> is the first graphics runtime to support SOG. Support was introduced in the <a href="https://github.com/playcanvas/engine/releases/tag/v2.11.0" target="_blank" rel="noopener noreferrer" class="">2.11.0 release</a> and we have thoroughly tested and stabilized it with a number of subsequent patches.</p>
<p><a href="https://github.com/playcanvas/react" target="_blank" rel="noopener noreferrer" class="">PlayCanvas React</a> and <a href="https://github.com/playcanvas/web-components" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Web Components</a> have also been updated to support SOG.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="editor-support-for-sog">Editor Support for SOG<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#editor-support-for-sog" class="hash-link" aria-label="Direct link to Editor Support for SOG" title="Direct link to Editor Support for SOG" translate="no">​</a></h3>
<p>Bundled SOG files (<code>.sog</code>) are now natively supported in the PlayCanvas Editor! Simply drag and drop a <code>.sog</code> file into your ASSETS panel to create a new <code>gsplat</code> asset.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/editor-sog-import.mp4" style="width:100%;height:auto"></video>
<p>Dragging the <code>gsplat</code> asset into the viewport triggers the creation of a new <code>Entity</code> with the asset assigned to a <code>GSplatComponent</code>.</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Unbundled SOG scenes (<code>.json</code> + <code>.webp</code>) are not natively supported in the Editor. Stick to <code>.sog</code>!</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="supersplat-support-for-sog">SuperSplat Support for SOG<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#supersplat-support-for-sog" class="hash-link" aria-label="Direct link to SuperSplat Support for SOG" title="Direct link to SuperSplat Support for SOG" translate="no">​</a></h3>
<p><a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a>, the #1 platform for publishing 3D Gaussian Splats, has been updated to compress your scans with SOG. Since it provides around <strong>2-3x</strong> the compression of Compressed PLY, your creations will load much faster and will load on more memory constrained devices.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-sourcing-sog">Open Sourcing SOG<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#open-sourcing-sog" class="hash-link" aria-label="Direct link to Open Sourcing SOG" title="Direct link to Open Sourcing SOG" translate="no">​</a></h3>
<p>Today, we are officially open sourcing the <a href="https://developer.playcanvas.com/user-manual/gaussian-splatting/formats/sog/" target="_blank" rel="noopener noreferrer" class="">specification for SOG</a>. <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">SplatTransform</a> provides a reference writer for the format. And the <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> provides a reference implementation for loading and rendering SOG.</p>
<p>We encourage other engine and tools developers to integrate support for SOG into your products/projects. And we invite the open source community to join our open source effort and contribute to PlayCanvas' codebases in any way that you can.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="credits">Credits<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#credits" class="hash-link" aria-label="Direct link to Credits" title="Direct link to Credits" translate="no">​</a></h3>
<p>We would like to recognize the work of some incredible people from the open source community that made all of this possible:</p>
<ul>
<li class=""><a href="https://wieland.morgenst.de/" target="_blank" rel="noopener noreferrer" class="">Wieland Morgenstern</a> from <a href="https://www.hhi.fraunhofer.de/en/index.html" target="_blank" rel="noopener noreferrer" class="">Fraunhofer HHI</a> who developed the original SOGS format.</li>
<li class=""><a href="https://vincentwoo.com/" target="_blank" rel="noopener noreferrer" class="">Vincent Woo</a> who did the original integration of SOGS into PlayCanvas.</li>
</ul>
<p>Let's continue this tradition and work together to keep 3DGS technology free and open source.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="come-and-meet-us-today">Come and Meet Us Today<a href="https://blog.playcanvas.com/playcanvas-open-sources-sog-format-for-gaussian-splatting#come-and-meet-us-today" class="hash-link" aria-label="Direct link to Come and Meet Us Today" title="Direct link to Come and Meet Us Today" translate="no">​</a></h3>
<p>If you want to chat about SOG, SuperSplat or 3D Gaussian Splatting in general, then you <em>have</em> to join the <a href="https://discord.gg/RSaMRzg" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Discord Server</a>. Some of the world's premier splat creators hang out there, so come and join the conversation!</p>]]></content:encoded>
            <category>gaussian-splats</category>
        </item>
        <item>
            <title><![CDATA[Gaussian Splatting for E-Commerce - Developer Spotlight on Reflct]]></title>
            <link>https://blog.playcanvas.com/gaussian-splatting-for-e-commerce-developer-spotlight-on-reflct</link>
            <guid>https://blog.playcanvas.com/gaussian-splatting-for-e-commerce-developer-spotlight-on-reflct</guid>
            <pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Welcome to the fifth edition of Developer Spotlight, a series of blog articles where we talk to developers about how they use PlayCanvas and showcase the fantastic work they are doing on the web.]]></description>
            <content:encoded><![CDATA[<p>Welcome to the fifth edition of Developer Spotlight, a series of blog articles where we talk to developers about how they use PlayCanvas and showcase the fantastic work they are doing on the web.</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/SBNza9uwiXo" title="Reflct is Live: 20× Smaller Files, 2× FPS, Shopify Support - A better 3DGS viewer." allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<p>Today, we are excited to be joined by In Ha and Willie from <a href="https://reflct.app/" target="_blank" rel="noopener noreferrer" class="">Reflct</a>.</p>
<p><strong>Welcome to our Developer Spotlight! Tell us a bit about yourselves.</strong></p>
<p><em>Willie</em>: I'm Willie, I co-founded Reflct with In Ha. I’ve been working in and around 3D and web development since my University days, where I dropped out to try my hand at a game development startup. It failed, but I learned a lot and developed a fixation with interactive tech. That first experience is what really drove my career, afterwards I worked for a few years in VR, and then into creative web and product development. I’m more of a creative technologist type, In Ha is the sole developer of the main Reflct application. I just work on our side things, like <a href="https://sharp-frames.reflct.app/" target="_blank" rel="noopener noreferrer" class="">Sharp Frames</a>, and handle the 3DGS production side for our direct clients.</p>
<p><em>In Ha</em>: I'm In Ha, I studied computer graphics and have spent my career so far in web 3D and front-end development. I am a huge enthusiast of 3D graphics and rendering technologies on the web.</p>
<p><strong>How did you first discover PlayCanvas?</strong></p>
<p><em>Willie</em>: It was through the 3DGS community, PlayCanvas really is the biggest name in the space, and you can’t be into 3DGS without hearing about PlayCanvas at some point.</p>
<p><em>In Ha</em>: Yeah, that's about right. When I was quite new to 3DGS, Willie showed me there was a tool to modify the splats, and it worked very well. It was SuperSplat by PlayCanvas. It was the very first tool I heard of when I entered the realm of 3DGS.</p>
<p><strong>What made you choose PlayCanvas for Reflct instead of other web technologies?</strong></p>
<p><em>Willie</em>: Well, we didn't at first. We were using Mark Kellogg’s three.js plugin for a long time. We made that decision early on when his project was the only one that had second-degree spherical harmonics. Over time, though, we saw what the PlayCanvas team was doing and ultimately made the decision to switch over. It’s open source, reliable, performant, and just really, really good. You guys are doing great work — I wish we had made the shift sooner.</p>
<p><em>In Ha</em>: It's fast and simple to use.</p>
<p><strong>Let’s talk about Reflct. In your own words, what is Reflct and what problem does it solve?</strong></p>
<p><em>Willie</em>: We built Reflct to enable commercial use cases for 3DGS assets. 3DGS is this amazing technology; photorealistic 3D at real-time frame rates in the browser. It’s as mind-blowing to me now as it was when the Inria paper first dropped. But most ‘normal’ people don’t know how to navigate a 3D space in the browser, particularly on mobile, and you can really get lost in a 3DGS scene. We let creators control what a user sees in their scene by setting specific viewpoints, with orbit limits that control how much the user is able to move around. Each viewpoint can carry metadata which can be used for commerce integrations or custom features. Rich tools and features for creators, with a super simple viewer that non-technical people can navigate.</p>
<p><em>In Ha</em>: It is also important to mention that we provide tools to help users implement their 3DGS assets on their websites, with the same navigation configured in our dashboard. This makes the whole integration process a lot easier. Our React library is one, and our Shopify component is another. We aim to keep expanding those tools to increase coverage.</p>
<div class="iframe-container"><iframe id="viewer" width="800" height="500" allow="fullscreen; xr-spatial-tracking" src="https://www.reflct.app/embed/ZW1iZWQ6OWQ2MmM0MjAtNTUzOS00ZGQxLWE2ZjQtMzNiZmMwZmU1MWMyOjdoVWM0MVB0elVQa0R1Q3pKbW0zbWQ="></iframe></div>
<p><strong>3D Gaussian Splatting (3DGS) is still a new technology — what excites you most about it?</strong></p>
<p><em>In Ha</em>: When I first heard what it is and saw some examples of it, it seemed to me that the way splats work resembles the idea of “pixels” on the screen. In this case, they are pixels in 3D, not 2D. Each splat in 3D space has color and other attributes, just like 2D pixels, which have coordinates and color.</p>
<p>I was amazed by the idea and concept behind the technique. I am very excited about what people could do with 3DGS in the future.</p>
<p><em>Willie</em>: I'm excited for the future of the technology. There are a lot of smart people around the world pushing the boundaries, making it smaller, faster, more realistic. SOGs are a good example. And it’s so new, we’re only a couple of years in.</p>
<p><strong>How does Reflct make navigating and exploring 3DGS content easier for non-technical users?</strong></p>
<p><em>Willie</em>: We just make it simple. We wanted something that we could give to our parents and they’d be able to figure out how it works. There are three big buttons at the bottom: left and right arrows, and a play button. If you drag the screen, the camera orbits a single point. No WASD, no free-roaming movement. Easy, but behind the scenes the creator has a bunch of features to help curate the experience for users.</p>
<p>The creator can manage ‘views’ in the Reflct dashboard. These are coordinates to which we move the camera when the user presses one of the arrow buttons. Each view has some data attached to it: position and focal point, as well as orbit limits, zoom, transition animation details, and product metadata. The orbit limits are important since they give the creator control over the movement of the camera, which means they can direct the user’s attention to the best parts of the scene without letting them see the ‘rough edges’ you get in 3DGS.</p>
<p>All these little bits add up to a powerful feature set for curating the experience of navigating the 3DGS space, but all the end user sees is three buttons.</p>
<p><strong>Could you walk us through the process of curating a scene in the Reflct dashboard?</strong></p>
<p><em>Willie</em>: Sure, when you drag in your <code>.ply</code> we’ll automatically compress it, then you just move around like you would in any 3D viewer. Once you find a viewpoint you like, you click ‘Add view’. You can edit the details for that view, set the orbit limits, change the focal point, configure the transition animations. There are also features to add hotspots or annotations.</p>
<p>You just do that a few times to set all the points in your scene where you want to direct the user's attention. Then you create a shareable link, or integrate it with your site using our React library or Shopify app. If you’re using our Shopify app, you can add the <code>productHandle</code> to the view metadata and it will automatically pull the product details into the side panel.</p>
<p><strong>Orbit limits and managed views sound like powerful tools — can you give an example of how they’ve been used effectively?</strong></p>
<p><em>Willie</em>: The Shopify app is a good example. Brands can capture a showroom or a staged space with their products, then each product can have its own set of views. Setting the views gives the creator a way to guide the user through the space, and the orbit limits ensure that they only see the products from the best angles.</p>
<p>When this is integrated with Shopify, the end user is able to explore a ‘shoppable’ 3DGS environment. Each time they move to a new product, the product details are displayed in the application. It’s quite exciting - we haven’t seen that type of e-commerce experience before. We’re working with a few different brands here in New Zealand to take this to the next level.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/developer-spotlight-reflct-shopify-app.mp4" style="width:100%;height:auto"></video>
<p><strong>Let’s dive into some technical details. How did PlayCanvas help you deliver a smooth experience across desktop and mobile?</strong></p>
<p><em>In Ha</em>: We were using the GaussianSplats3D viewer by mkkellogg before we made the switch. We decided on the viewer very early on in our journey; at the time, we felt it was the best choice. Over time, though, we saw the PlayCanvas team releasing amazing features while the support for the viewer we were using slowly faded away. When PlayCanvas released the SOGs demo, it was the last nail in the coffin and we started the refactor.</p>
<p><img decoding="async" loading="lazy" alt="Reflct Memory Savings" src="https://blog.playcanvas.com/assets/images/developer-spotlight-reflct-memory-389491c6e7ce21498aa9bb16fe16e6cf.png" width="1979" height="1180" class="img_ev3q"></p>
<p>The performance gains have been massive. If you load the same <code>.ply</code> in PlayCanvas versus our original viewer, the frame rate nearly doubles, and memory usage is reduced by 80%. If you compare SOGs to our previously most optimized format, the SOGs bundle is half the size with 3SH compared to 2SH and uses 88% less memory. Some critical resources consume over 95% less memory. So, yeah, we’re happy we made the switch.</p>
<p><strong>Were there any technical challenges you faced integrating PlayCanvas with 3DGS, and how did you overcome them?</strong></p>
<p><em>In Ha</em>: Well, we had to refactor the core of the application. We were moving a three.js-based application to a PlayCanvas-based application. We essentially had to rebuild every feature that was related to the viewer since the previous application was based on three.js - which is a common library that is used for 3D rendering on the web, and because we were using open source libraries built on top of three.js, a lot of refactoring was needed to adapt functionality to PlayCanvas and remove those external dependencies.</p>
<p>But we realized that essentially, the fundamentals are the same. They provide 3D renderers, which means they have 3D spaces, a camera, and some 3D objects (in this case, splats). PlayCanvas provides simple ways to control cameras and assets, and if we can read and write them, it doesn’t make much difference.</p>
<p>So we first detached every piece of the UI and event listeners, then replaced the core renderers, then everything followed naturally.</p>
<p><strong>Can you share any interesting performance optimizations you’ve implemented in Reflct?</strong></p>
<p><em>In Ha</em>: We had done a reasonable amount of optimization work with the previous viewer, but the impact of those changes was trivial compared to moving to PlayCanvas.</p>
<p><em>Willie</em>: One thing that seems minor is the size of the viewer. A smaller viewer means fewer pixels to move around and less resource usage. People want big viewers, though, so we spent some time looking for the right balance between performance and visual impact.</p>
<p><strong>Reflct just launched after being in open beta — how has the feedback been so far?</strong></p>
<p><em>Willie</em>: The feedback has been quite positive, which is validating. Now that we are using the PlayCanvas engine, I think it will be even better. The performance improvement makes the application far more accessible.</p>
<p><strong>Who do you see as the ideal audience or customer for Reflct?</strong></p>
<p><em>Willie</em>: It's 3DGS capture pros who want to find a better way to commercialize their work, brands that want to elevate their product visualization, real-estate startups, or companies that are looking for an edge.</p>
<p><strong>What are your plans for upcoming features or improvements?</strong></p>
<p><em>Willie</em>: First thing will be some improvements for mobile, just to improve consistency across devices. Then it’s integrations, viewer features, FTUX improvements, and building on our recent update for custom transition animations.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/developer-spotlight-reflct-custom-animation.mp4" style="width:100%;height:auto"></video>
<p><strong>How can the PlayCanvas community try out Reflct or get involved?</strong></p>
<p><em>Willie</em>: It's free for up to 15 scenes on <a href="https://reflct.app/" target="_blank" rel="noopener noreferrer" class="">https://reflct.app</a>, so just jump in and try it out. If you have any ideas for improving the platform or seeing what we’re cooking up next, join the Discord; we’d love to hear from the community.</p>
<p><strong>Where do you see 3DGS and web-based photorealistic content heading in the next few years?</strong></p>
<p><em>Willie</em>: The pace of innovation in 3DGS and other similar technologies is wild, but the trends seem to be around increasing quality, decreasing file sizes, and making the capture process simpler. Generative AI will also start to play a more significant role I’m sure, some of the recent experiments with generating 3DGS scenes using outputs from world models like Genie have been very impressive. I’d like to see some progress towards solving some of the drawbacks, like reflective surfaces.</p>
<p><em>In Ha</em>: I can see 3DGS becoming a general way of displaying rich, interactive, and impactful content.</p>
<p><strong>Any advice for developers looking to build commercial products on PlayCanvas?</strong></p>
<p><em>In Ha</em>: It is always important to just try things out. See what works and what doesn’t. Gather metrics and list out pros and cons. See if it solves your problem. Eventually, you will learn what is possible with PlayCanvas.</p>
<p><em>Willie</em>: Yeah, just get stuck in. PlayCanvas’ approach to open source is admirable.</p>
<p><strong>What’s been the most rewarding part of building Reflct so far?</strong></p>
<p><em>In Ha</em>: As we've been rolling out Reflct to the world, the most rewarding part has been the users and the community. When I see a user’s strikingly realistic content on Reflct, that’s the most rewarding for me.</p>
<p><em>Willie</em>: I'm just really proud of the product we’ve built together, it’s an awesome feeling.</p>
<p><strong>Thanks for chatting with us, In Ha and Willie!</strong></p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>spotlight</category>
        </item>
        <item>
            <title><![CDATA[PlayCanvas Editor Frontend is now Open Source]]></title>
            <link>https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source</link>
            <guid>https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source</guid>
            <pubDate>Wed, 30 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are thrilled to announce the open sourcing of the PlayCanvas Editor Frontend!]]></description>
            <content:encoded><![CDATA[<p>Today, we are thrilled to announce the open sourcing of the <a href="https://github.com/playcanvas/editor" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Editor Frontend</a>!</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/7XlVDfA0sU8?loop=1&amp;autoplay=1&amp;mute=1&amp;rel=0" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<p>The PlayCanvas Editor is a powerful visual editing environment for building WebGL, WebGPU, and WebXR applications. It has been the cornerstone of countless incredible projects, many of which you can explore on the <a href="https://playcanvas.com/explore" target="_blank" rel="noopener noreferrer" class="">PlayCanvas website</a>. While the PlayCanvas Engine has always been open source, the Editor Frontend, a key component of the PlayCanvas ecosystem, has not. That changes today!</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Open Source</div><div class="admonitionContent_BuS1"><p>The PlayCanvas Editor Frontend is <a href="https://github.com/playcanvas/editor" target="_blank" rel="noopener noreferrer" class="">open-sourced under an MIT license on GitHub</a></p></div></div>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-why-open-source-the-editor-frontend">✅ Why Open Source the Editor Frontend?<a href="https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source#-why-open-source-the-editor-frontend" class="hash-link" aria-label="Direct link to ✅ Why Open Source the Editor Frontend?" title="Direct link to ✅ Why Open Source the Editor Frontend?" translate="no">​</a></h3>
<p>Open sourcing the Editor Frontend brings a host of benefits, not just for us, but for the entire PlayCanvas community:</p>
<ul>
<li class=""><strong>Faster Feature Development:</strong> Community contributions will accelerate the development of new features and improvements.</li>
<li class=""><strong>Enhanced Stability:</strong> With more eyes on the code, bugs can be identified and resolved more quickly, leading to a more stable and robust editor.</li>
<li class=""><strong>Customization and Bespoke Use Cases:</strong> Developers can now create custom Editor Frontend versions, connecting them to our backend for highly specialized workflows and integrations.</li>
<li class=""><strong>Improved Understanding:</strong> A more transparent codebase will allow developers to better understand how the Editor functions, making it easier to contribute and debug.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-local-development--contributing">🛠️ Local Development &amp; Contributing<a href="https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source#%EF%B8%8F-local-development--contributing" class="hash-link" aria-label="Direct link to 🛠️ Local Development &amp; Contributing" title="Direct link to 🛠️ Local Development &amp; Contributing" translate="no">​</a></h3>
<p>We've made it easier than ever to get started with local development and contribute to the Editor Frontend. For detailed setup instructions, please refer to the <a href="https://github.com/playcanvas/editor/blob/main/README.md" target="_blank" rel="noopener noreferrer" class="">README</a> in the repository.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="built-on-open-source-foundations">Built on Open Source Foundations<a href="https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source#built-on-open-source-foundations" class="hash-link" aria-label="Direct link to Built on Open Source Foundations" title="Direct link to Built on Open Source Foundations" translate="no">​</a></h4>
<p>The PlayCanvas Editor is built upon a foundation of powerful open-source libraries:</p>
<table><thead><tr><th style="text-align:left">Library</th><th style="text-align:left">Details</th></tr></thead><tbody><tr><td style="text-align:left"><a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a></td><td style="text-align:left">Powers the Editor's 3D View and Launch Page</td></tr><tr><td style="text-align:left"><a href="https://github.com/playcanvas/playcanvas-observer" target="_blank" rel="noopener noreferrer" class="">Observer</a></td><td style="text-align:left">Data binding and history</td></tr><tr><td style="text-align:left"><a href="https://github.com/playcanvas/pcui" target="_blank" rel="noopener noreferrer" class="">PCUI</a></td><td style="text-align:left">Front-end component library</td></tr><tr><td style="text-align:left"><a href="https://github.com/playcanvas/pcui-graph" target="_blank" rel="noopener noreferrer" class="">PCUI-Graph</a></td><td style="text-align:left">PCUI plugin for rendering node-based graphs</td></tr><tr><td style="text-align:left"><a href="https://github.com/playcanvas/editor-api" target="_blank" rel="noopener noreferrer" class="">Editor API</a></td><td style="text-align:left">Public API for Editor automation</td></tr></tbody></table>
<p>We've focused on significant improvements to the codebase to make it more accessible for contributors, including:</p>
<ul>
<li class=""><strong>Code Reorganization:</strong> A clearer, more efficient file and code structure.</li>
<li class=""><strong>Improved Typings:</strong> Enhanced TypeScript support for better type checking and code integrity.</li>
<li class=""><strong>Optimized Debugging:</strong> Streamlined local debugging processes for a smoother development experience.</li>
<li class=""><strong>Comprehensive Testing Suite:</strong> A new testing suite ensures stability and helps prevent regressions with new contributions.</li>
</ul>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-join-our-open-source-mission">👨‍💻 Join Our Open Source Mission<a href="https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source#-join-our-open-source-mission" class="hash-link" aria-label="Direct link to 👨‍💻 Join Our Open Source Mission" title="Direct link to 👨‍💻 Join Our Open Source Mission" translate="no">​</a></h3>
<p>We proudly provide the PlayCanvas Editor Frontend as an open-source project. This is just the beginning of a new chapter for the Editor, and we invite you to be a part of it. The PlayCanvas community has always been at the forefront of innovation, and we believe that this open-source initiative will further accelerate our collective progress.</p>
<p>Join us in shaping the future of the PlayCanvas Editor by submitting issues, creating pull requests, or simply starring <a href="https://github.com/playcanvas/editor" target="_blank" rel="noopener noreferrer" class="">our GitHub repo</a>! ⭐</p>
<hr>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/playcanvas-editor-frontend-is-now-open-source#-your-feedback-matters" class="hash-link" aria-label="Direct link to 👂 Your Feedback Matters" title="Direct link to 👂 Your Feedback Matters" translate="no">​</a></h3>
<p>We're incredibly excited about this new phase for the PlayCanvas Editor. Your feedback is invaluable as we continue this open-source journey. What features are you most excited to contribute to, or what would you love to see next? Share your thoughts on our <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">Forum</a> or <a href="https://twitter.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a>!</p>]]></content:encoded>
            <category>editor</category>
            <category>ui</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Introducing SplatTransform: The Ultimate CLI Tool for 3D Gaussian Splats]]></title>
            <link>https://blog.playcanvas.com/introducing-splat-transform-cli-tool</link>
            <guid>https://blog.playcanvas.com/introducing-splat-transform-cli-tool</guid>
            <pubDate>Tue, 15 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We're thrilled to announce the release of SplatTransform — a powerful CLI tool that makes working with 3D Gaussian Splats a breeze!]]></description>
            <content:encoded><![CDATA[<p><strong>We're thrilled to announce the release of SplatTransform — a powerful CLI tool that makes working with 3D Gaussian Splats a breeze!</strong></p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/splat-transform.mp4" style="width:100%;height:auto"></video>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>Open Source</div><div class="admonitionContent_BuS1"><p>SplatTransform is <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">open-sourced under an MIT license on GitHub</a></p></div></div>
<p>When 3D Gaussian Splats began to revolutionize real-time rendering and photorealistic 3D content creation, we built <a href="https://superspl.at/editor?load=https://d28zzqy0iyovbz.cloudfront.net/db6ab60b/scene.compressed.ply" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a>, a visual editor for splats. But developers have continued to ask for better tools to manage, convert, and optimize their splat datasets. Our solution is to bring some of SuperSplat's most powerful features to the command line, courtesy of a new tool called <strong>SplatTransform</strong>. It's fast, flexible, and designed specifically for developers who need precise control over their Gaussian splat workflows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-splattransform">Why use SplatTransform?<a href="https://blog.playcanvas.com/introducing-splat-transform-cli-tool#why-use-splattransform" class="hash-link" aria-label="Direct link to Why use SplatTransform?" title="Direct link to Why use SplatTransform?" translate="no">​</a></h2>
<p>SplatTransform solves important problems developers face when working with Gaussian splats:</p>
<p>🔄 <strong>Broad Format Support</strong> — seamlessly convert between PLY, SPLAT, KSPLAT, SOGS and even CSV<br>
<!-- -->🛠️ <strong>Powerful Transformations</strong> — translate, rotate, and scale your splats with precision<br>
<!-- -->🧹 <strong>Smart Filtering</strong> — remove NaN values, filter by properties, and strip unnecessary data<br>
<!-- -->📦 <strong>Scene Merging</strong> — combine multiple splat files into a merged scene<br>
<!-- -->⚡ <strong>Production Ready</strong> — optimized for maximum performance<br>
<!-- -->🆓 <strong>Open Source</strong> — completely free and available on GitHub</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-looks-like">What it Looks Like<a href="https://blog.playcanvas.com/introducing-splat-transform-cli-tool#what-it-looks-like" class="hash-link" aria-label="Direct link to What it Looks Like" title="Direct link to What it Looks Like" translate="no">​</a></h2>
<p>Instead of wrestling with format incompatibilities or writing custom scripts, you can now handle complex splat operations with simple, intuitive commands:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Convert between commonly used splat formats</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform input.ksplat converted.ply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Apply transformations during conversion</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform input.ply -s 0.5 -t 0,0,10 -r 0,90,0 transformed.ply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Combine multiple files with different transforms</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform inputA.ply -r 0,90,0 inputB.ply -s 2 merged.ply</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Filter and optimize for production</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform input.ply --filterNaN -c opacity,gt,0.3 --filterBands 2 filtered.ply</span><br></div></code></pre></div></div>
<p>The tool automatically handles the complexity of different splat formats while giving you granular control over every aspect of the transformation pipeline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="unlock-data-science-workflows-with-csv-export">Unlock Data Science Workflows with CSV Export<a href="https://blog.playcanvas.com/introducing-splat-transform-cli-tool#unlock-data-science-workflows-with-csv-export" class="hash-link" aria-label="Direct link to Unlock Data Science Workflows with CSV Export" title="Direct link to Unlock Data Science Workflows with CSV Export" translate="no">​</a></h2>
<p>One of SplatTransform's most powerful features is its ability to export Gaussian splat data to CSV format, opening up entirely new possibilities for analysis and processing:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain"># Export your splat data for spreadsheet analysis</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform scene.ply data.csv</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"># Pre-filter before analysis to focus on relevant data</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">splat-transform input.ply --filterNaN -c opacity,gt,0.1 analysis.csv</span><br></div></code></pre></div></div>
<p><strong>Why CSV matters for splats:</strong></p>
<ul>
<li class=""><strong>Spreadsheet Analysis</strong> — Import directly into Excel, Google Sheets, or any data analysis tool</li>
<li class=""><strong>Statistical Insights</strong> — Calculate distributions, correlations, and quality metrics across your splat dataset</li>
<li class=""><strong>Custom Filtering</strong> — Use spreadsheet formulas to identify outliers, cluster data, or segment by properties</li>
<li class=""><strong>Visualization</strong> — Create charts and graphs to understand your splat data patterns</li>
<li class=""><strong>Integration</strong> — Feed splat data into machine learning pipelines or custom processing workflows</li>
</ul>
<p>Whether you're optimizing splat quality, analyzing capture patterns, or preparing data for research, CSV export transforms your splats from opaque binary files into readable, analyzable datasets.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="splattransform-️-playcanvas">SplatTransform ❤️ PlayCanvas<a href="https://blog.playcanvas.com/introducing-splat-transform-cli-tool#splattransform-%EF%B8%8F-playcanvas" class="hash-link" aria-label="Direct link to SplatTransform ❤️ PlayCanvas" title="Direct link to SplatTransform ❤️ PlayCanvas" translate="no">​</a></h2>
<p>The open-source <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> has the most advanced 3D Gaussian Splat renderer on the market! First, we released our <a href="https://blog.playcanvas.com/compressing-gaussian-splats#compressed-ply-format" target="_blank" rel="noopener noreferrer" class="">Compressed PLY format</a>. Then, we improved on it by adding support for <a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression" target="_blank" rel="noopener noreferrer" class="">SOGS</a>, an even more optimal compressed format. SplatTransform can now target both formats with ease.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Migrating to PlayCanvas</div><div class="admonitionContent_BuS1"><p>Are you currently using another renderer that uses different formats such as <code>.splat</code> or <code>.ksplat</code>? Do you want to migrate to PlayCanvas for better visuals and performance? SplatTransform can help you make the switch!</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="get-started-today">Get Started Today<a href="https://blog.playcanvas.com/introducing-splat-transform-cli-tool#get-started-today" class="hash-link" aria-label="Direct link to Get Started Today" title="Direct link to Get Started Today" translate="no">​</a></h2>
<p>SplatTransform is <a href="https://www.npmjs.com/package/@playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">available right now on npm</a> and completely open source:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">npm install -g @playcanvas/splat-transform</span><br></div></code></pre></div></div>
<p>Check out the <a href="https://github.com/playcanvas/splat-transform" target="_blank" rel="noopener noreferrer" class="">GitHub repository</a> for full source, documentation and examples. If you find a bug or have a feature request, log an issue or better yet, submit a pull request! 🙌</p>
<p>We're excited to see what you build! 🚀</p>]]></content:encoded>
            <category>tools</category>
            <category>gaussian-splats</category>
            <category>splattransform</category>
            <category>cli</category>
            <category>open-source</category>
        </item>
        <item>
            <title><![CDATA[Introducing ESM Scripts in PlayCanvas]]></title>
            <link>https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas</link>
            <guid>https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas</guid>
            <pubDate>Tue, 10 Jun 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[We’re excited to announce a major step forward for PlayCanvas: ESM Scripts are now supported — and officially the recommended way to write scripts in your PlayCanvas projects.]]></description>
            <content:encoded><![CDATA[<p><strong>We’re excited to announce a major step forward for PlayCanvas: <strong>ESM Scripts are now supported</strong> — and officially the recommended way to write scripts in your PlayCanvas projects.</strong></p>
<p>Back in 2016, we introduced what we now call <a href="https://blog.playcanvas.com/playcanvas-scripts-2-0/" target="_blank" rel="noopener noreferrer" class="">Classic Scripts</a>. At the time, this represented the state of the art in JavaScript. But things have evolved rapidly since then, and developers today expect modern tooling, clearer patterns, and better integration with the broader JavaScript ecosystem.</p>
<p>If you’ve ever struggled with managing classic scripts, wondered why your auto-complete didn’t work, or wished you could reuse code across projects more easily — this is for you.</p>
<p>ESM (ECMAScript Modules) brings modern JavaScript development to the heart of PlayCanvas. It’s faster to get started, easier to scale your project, and way more fun to work with. No more hidden globals. No more messy script loading order. Just well-structured, maintainable, and modular code — exactly how modern web development should be.</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/pc-esm-scripts.mp4" style="width:100%;height:auto"></video>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-use-esm-scripts">Why use ESM Scripts?<a href="https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas#why-use-esm-scripts" class="hash-link" aria-label="Direct link to Why use ESM Scripts?" title="Direct link to Why use ESM Scripts?" translate="no">​</a></h2>
<p>ESM Scripts offer major improvements across the board:</p>
<p>💡 <strong>Modern JavaScript</strong> — use <code>import</code>, <code>export</code> class based module syntax<br>
<!-- -->🧠 <strong>Smarter Editor</strong> — better auto-complete and inline docs<br>
<!-- -->🧱 <strong>Modular Codebase</strong> — structure large projects cleanly with reusable modules<br>
<!-- -->⚙️ <strong>No Global Scope Issues</strong> — each script has its own context<br>
<!-- -->📦 <strong>Import Maps</strong> — define aliases and pull in libraries from CDNs<br>
<!-- -->🚀 <strong>Optimized for Production</strong> — static imports enable bundling and future support for tree-shaking</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-it-looks-like">What it looks like<a href="https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas#what-it-looks-like" class="hash-link" aria-label="Direct link to What it looks like" title="Direct link to What it looks like" translate="no">​</a></h2>
<p>Instead of attaching scripts to an entity and hoping things load in the right order, you now write self-contained, class-based modules like this:</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword module" style="color:#00009f">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color:#393A34">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">Script</span><span class="token imports"> </span><span class="token imports punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword module" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'playcanvas'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">Rotator</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">Script</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">static</span><span class="token plain"> scriptName </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'rotator'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token doc-comment comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * </span><span class="token doc-comment comment keyword" style="color:#00009f;font-style:italic">@attribute</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"></span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     * </span><span class="token doc-comment comment keyword" style="color:#00009f;font-style:italic">@range</span><span class="token doc-comment comment" style="color:#999988;font-style:italic"> [0, 10]</span><br></div><div class="token-line" style="color:#393A34"><span class="token doc-comment comment" style="color:#999988;font-style:italic">     */</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    speed </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token function" style="color:#d73a49">update</span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">dt</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">entity</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">rotateLocal</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">this</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">speed</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> dt</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>The Editor picks up your <code>scriptName</code>, exposes your attributes automatically, and everything behaves as expected — no magic, no legacy syntax.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="real-benefits-for-real-projects">Real benefits for real projects<a href="https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas#real-benefits-for-real-projects" class="hash-link" aria-label="Direct link to Real benefits for real projects" title="Direct link to Real benefits for real projects" translate="no">​</a></h2>
<p>We didn’t just add ESM support because it was shiny. We added it because it solves real problems PlayCanvas developers have told us about for years.</p>
<ul>
<li class="">You get <strong>stronger editor feedback</strong> while writing code.</li>
<li class="">You can <strong>reuse logic cleanly</strong> across multiple scripts.</li>
<li class="">You can <strong>share modules between projects</strong> or publish them as libraries.</li>
<li class="">You’ll write <strong>fewer bugs</strong> — and spend less time wrestling with script order or context issues.</li>
</ul>
<p>Plus, by adopting a standard that the rest of the JS world already embraces, it’s easier than ever to onboard new developers and bring in existing tools and libraries.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="seamless-integration-without-disruption">Seamless integration without disruption<a href="https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas#seamless-integration-without-disruption" class="hash-link" aria-label="Direct link to Seamless integration without disruption" title="Direct link to Seamless integration without disruption" translate="no">​</a></h2>
<p>Don’t worry — classic <code>.js</code> scripts aren’t going anywhere. If you have an existing project using them, everything still works. You can even mix classic and ESM scripts in the same project.</p>
<p>But going forward, <strong>ESM Scripts are the best choice</strong> for all new projects — and we think once you try them, you won’t want to go back.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="try-it-today">Try It Today<a href="https://blog.playcanvas.com/introducing-esm-scripts-in-playcanvas#try-it-today" class="hash-link" aria-label="Direct link to Try It Today" title="Direct link to Try It Today" translate="no">​</a></h2>
<p>You can start using ESM Scripts right now — just create a script with a <code>.mjs</code> extension and enjoy everything modern JavaScript has to offer.</p>
<p>Check out the <a href="https://developer.playcanvas.com/user-manual/scripting/fundamentals/esm-scripts/" target="_blank" rel="noopener noreferrer" class="">user manual</a> for examples, or drop into the <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Forum</a> to share your thoughts.</p>
<p>We can’t wait to see what you build.</p>]]></content:encoded>
            <category>esm</category>
            <category>modules</category>
            <category>editor</category>
            <category>developer</category>
        </item>
        <item>
            <title><![CDATA[PlayCanvas Adopts SOGS for 20x 3DGS Compression]]></title>
            <link>https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression</link>
            <guid>https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression</guid>
            <pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are releasing PlayCanvas Engine 2.7.5 that introduces a new and advanced compression format for 3D Gaussian Splatting (3DGS) called Self-Organizing Gaussians (SOGS). SOGS can reduce 3DGS data by over 20x.]]></description>
            <content:encoded><![CDATA[<p>Today, we are releasing <a href="https://github.com/playcanvas/engine/releases/tag/v2.7.5" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine 2.7.5</a> that introduces a new and advanced compression format for 3D Gaussian Splatting (3DGS) called Self-Organizing Gaussians (SOGS). <strong>SOGS can reduce 3DGS data by over 20x.</strong></p>
<p>To showcase PlayCanvas' support for SOGS, we have collaborated with <a href="https://www.linkedin.com/in/christoph-schindelar-79515351/" target="_blank" rel="noopener noreferrer" class="">Christoph Schindelar</a> to build a technical demo:</p>
<div class="iframe-container"><iframe id="viewer" width="800" height="500" allow="fullscreen; xr-spatial-tracking" src="https://playcanv.as/e/p/Zp9Oh1ia/"></iframe></div>
<p><em><strong><a href="https://playcanv.as/p/Zp9Oh1ia/" target="_blank" rel="noopener noreferrer" class="">RUN FULLSCREEN IN A NEW TAB</a></strong></em></p>
<p>The church scene above was originally a <strong>1GB PLY file containing 4 million Gaussians</strong> - not at all suitable for the web or mobile! <strong>Using SOGS, we can serve up the scene in just 55MB!</strong> Read on to find out how.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="introduction-to-self-organizing-gaussians">Introduction to Self-Organizing Gaussians<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#introduction-to-self-organizing-gaussians" class="hash-link" aria-label="Direct link to Introduction to Self-Organizing Gaussians" title="Direct link to Introduction to Self-Organizing Gaussians" translate="no">​</a></h3>
<p>3D Gaussian Splatting has taken the real-time graphics world by storm, offering breathtaking photorealism. But as many developers have discovered, the incredible detail comes at a cost: massive file sizes. A typical high-quality scene can easily run into hundreds of megabytes, making them challenging for web delivery, mobile experiences, and quick load times.</p>
<p>This is precisely the problem that <a href="https://github.com/fraunhoferhhi/Self-Organizing-Gaussians" target="_blank" rel="noopener noreferrer" class="">Self-Organizing Gaussians</a>, a groundbreaking compression technique from <a href="https://wieland.morgenst.de/" target="_blank" rel="noopener noreferrer" class="">Wieland Morgenstern</a> at <a href="https://www.hhi.fraunhofer.de/en/index.html" target="_blank" rel="noopener noreferrer" class="">Fraunhofer HHI</a>, sets out to solve.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-core-challenge-taming-the-data-deluge">The Core Challenge: Taming the Data Deluge<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#the-core-challenge-taming-the-data-deluge" class="hash-link" aria-label="Direct link to The Core Challenge: Taming the Data Deluge" title="Direct link to The Core Challenge: Taming the Data Deluge" translate="no">​</a></h3>
<p>Each individual Gaussian in a 3DGS scene stores multiple parameters:</p>
<ul>
<li class="">Position (XYZ)</li>
<li class="">Scale (3 values)</li>
<li class="">Rotation (4 quaternion values)</li>
<li class="">Opacity</li>
<li class="">Base Color (RGB)</li>
<li class="">Spherical Harmonics (SH) coefficients for view-dependent effects (often 45+ values, contributing a huge portion to file size – up to 75%!)</li>
</ul>
<p>Storing all of these as high-precision floats is what leads to those hefty files.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="enter-sogs-reshape-reorganize-compress">Enter SOGS: Reshape, Reorganize, Compress<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#enter-sogs-reshape-reorganize-compress" class="hash-link" aria-label="Direct link to Enter SOGS: Reshape, Reorganize, Compress" title="Direct link to Enter SOGS: Reshape, Reorganize, Compress" translate="no">​</a></h3>
<p>Instead of just quantizing individual values or creating simple codebooks for attributes (which are valid but more traditional compression steps), SOGS takes a far more innovative approach, directly inspired by how image compression algorithms work best:</p>
<ol>
<li class=""><strong>Grid Reorganization:</strong> The fundamental idea is to take all the Gaussians and their attributes and reshape this data. Imagine "unrolling" all the Gaussians and laying their parameters out into a series of 2D grids or "attribute images." For instance, all X positions could form one 2D image, all Y positions another, each SH coefficient its own image, and so on (e.g., 59+ such images if you have 59 attributes per Gaussian). Initially, these images would look like random noise.</li>
<li class=""><strong>The "Self-Organizing" Sort (PLAS Algorithm):</strong> Here's the magic. SOGS employs a sophisticated sorting algorithm (<a href="https://github.com/fraunhoferhhi/PLAS" target="_blank" rel="noopener noreferrer" class="">Parallel Linear Assignment Sorting - PLAS</a>) to reorder the Gaussians themselves within these 2D grids. The goal is to arrange them so that Gaussians with similar properties (especially position, scale, and base color) become neighbors in the 2D grid. This process transforms the noisy, random-looking attribute images into much smoother, more structured images with lower frequency content.<!-- -->
<ul>
<li class=""><strong>Why sort?</strong> Compressing highly organized, smooth data (like a sorted image) is vastly more efficient than compressing noisy, random data. The difference can be dramatic (e.g., a 9x reduction for a sorted vs. random image with JPEG).</li>
</ul>
</li>
<li class=""><strong>Exploiting Smoothness:</strong> By sorting based on primary attributes (position, scale, base color), SOGS leverages the insight that Gaussians similar in these aspects are also likely to have similar secondary attributes (opacity, rotation, and those bulky SH coefficients). This "co-sorting" makes all the attribute images smoother.</li>
<li class=""><strong>Leveraging 2D Image Compression:</strong> Once these attribute images are smooth and organized, SOGS applies standard, highly optimized 2D image compression codecs to each one. In PlayCanvas, we have opted to use WebP. This is where the massive compression gains come from – the WebP codec is perfect for compressing smooth, predictable image data. Check out the image set for the church:
<a href="https://blog.playcanvas.com/assets/files/sogs-textures-c63805053f989a4996da53a700d6fe10.jpg" target="_blank" class=""><img decoding="async" loading="lazy" alt="SOGS Textures" src="https://blog.playcanvas.com/assets/images/sogs-textures-c63805053f989a4996da53a700d6fe10.jpg" width="1136" height="580" class="img_ev3q"></a></li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-impact-for-splat-developers">The Impact for Splat Developers<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#the-impact-for-splat-developers" class="hash-link" aria-label="Direct link to The Impact for Splat Developers" title="Direct link to The Impact for Splat Developers" translate="no">​</a></h3>
<p>Integrating SOGS into PlayCanvas is a game-changer for web-based 3DGS:</p>
<ul>
<li class="">🗜️ <strong>Massive File Size Reduction:</strong> We're talking serious compression! The church scene above, for example, was reduced from ~1GB to 55MB (a <strong>~20x reduction</strong>).</li>
<li class="">⚡ <strong>Lightning-Fast Loading:</strong> Smaller files mean your immersive 3DGS experiences load significantly faster, keeping users engaged.</li>
<li class="">📱 <strong>Mobile Feasibility:</strong> This level of compression makes deploying rich 3DGS content practical even on bandwidth or memory-constrained devices.</li>
<li class="">✨ <strong>Exceptional Visual Quality:</strong> SOGS is designed to maintain the high visual fidelity that makes 3DGS so compelling, and can even improve it by reducing artifacts.</li>
<li class="">🖼️ <strong>Simple Decoding:</strong> The compressed format is essentially a set of WebP images, which are trivial and fast to decode using standard browser capabilities.</li>
</ul>
<p>With SOGS support, PlayCanvas can deliver stunning, performant, and accessible 3D Gaussian Splat-based experiences directly in the browser. This is <strong>huge news</strong> for e-commerce, architectural visualization, education and entertainment industries.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-next">What's Next<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#whats-next" class="hash-link" aria-label="Direct link to What's Next" title="Direct link to What's Next" translate="no">​</a></h3>
<p>PlayCanvas Engine support is just the first step. Here's what's coming next:</p>
<ul>
<li class=""><strong>Editor Support</strong> - Support SOGS data as a first-class citizen in the Asset Panel</li>
<li class=""><strong>SuperSplat Support</strong> - Add SOGS as an export format</li>
<li class=""><strong>Performance Optimization</strong> - Now that we can quickly load vast numbers of Gaussians on mobile, we will turn our attention to boosting frame rates</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-our-open-source-mission">👨‍💻 Our Open Source Mission<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#-our-open-source-mission" class="hash-link" aria-label="Direct link to 👨‍💻 Our Open Source Mission" title="Direct link to 👨‍💻 Our Open Source Mission" translate="no">​</a></h3>
<p>We proudly provide the PlayCanvas Engine as an MIT-licensed open source project. The 3D Gaussian Splat community has made impressive strides over the past 18 months, largely due to open collaboration. Join us in shaping the future by submitting issues, creating pull requests, or simply starring <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">our GitHub repo</a>! ⭐</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/playcanvas-adopts-sogs-for-20x-3dgs-compression#-your-feedback-matters" class="hash-link" aria-label="Direct link to 👂 Your Feedback Matters" title="Direct link to 👂 Your Feedback Matters" translate="no">​</a></h3>
<p>We hope you approve of this latest update to our open source journey! The SuperSplat community has grown tremendously, and your feedback is invaluable. What features would you love to see next? Share your thoughts on our <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a>!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[SuperSplat 3DGS Viewer is now Open Source]]></title>
            <link>https://blog.playcanvas.com/supersplat-3dgs-viewer-is-now-open-source</link>
            <guid>https://blog.playcanvas.com/supersplat-3dgs-viewer-is-now-open-source</guid>
            <pubDate>Wed, 09 Apr 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are announcing the open sourcing of the SuperSplat Viewer. Try it out for yourself:]]></description>
            <content:encoded><![CDATA[<p>Today, we are announcing the open sourcing of the <a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">SuperSplat Viewer</a>. Try it out for yourself:</p>
<div class="iframe-container"><iframe id="viewer" width="800" height="500" allow="fullscreen; xr-spatial-tracking" src="https://superspl.at/s?id=db6ab60b"></iframe></div>
<p>Since its initial release back in November 2023, <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> has grown to be the most popular platform for editing and publishing 3D Gaussian Splats.</p>
<p><img decoding="async" loading="lazy" alt="SuperSplat Landing Page" src="https://blog.playcanvas.com/assets/images/supersplat-landing-page-08f751605b1bc0b050fce3f7e4095c73.webp" width="3840" height="2100" class="img_ev3q"></p>
<p>It allows you to publish your splats to our <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">superspl.at</a> domain or download the SuperSplat Viewer for self-hosting. Regardless of which option you choose, you get the same viewer experience, giving you total flexibility. But while the SuperSplat Editor has been open source from the beginning, SuperSplat's web-based viewer has not. That changes today with the release of the viewer on <a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">GitHub</a> (under the MIT license).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-viewer-features">✅ Viewer Features<a href="https://blog.playcanvas.com/supersplat-3dgs-viewer-is-now-open-source#-viewer-features" class="hash-link" aria-label="Direct link to ✅ Viewer Features" title="Direct link to ✅ Viewer Features" translate="no">​</a></h3>
<p>So why use the SuperSplat Viewer to publish your splats? There are a lot of great reasons! Here is a run down:</p>
<ul>
<li class="">🏃 <strong>Performance</strong> - it is built on the powerful <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> which delivers high frame rates.</li>
<li class="">✨ <strong>Visual Fidelity</strong> - the PlayCanvas Engine's advanced 3DGS shaders ensure top quality visuals.</li>
<li class="">🤳 <strong>AR Support</strong> - view your splat in your space in mixed reality.</li>
<li class="">🥽 <strong>VR Support</strong> - experience your splat in full immersion using any WebXR-capable headset.</li>
<li class="">🎬 <strong>Animation</strong> - play back attractive camera fly-throughs for your scenes.</li>
<li class="">🖥️ <strong>Fullscreen Support</strong> - take your splats fullscreen with the click of a button.</li>
<li class="">🎥 <strong>Camera Modes</strong> - switch between orbit and fly cameras, tuned for both mobile and desktop.</li>
</ul>
<p>And this is just the beginning. We have ambitious plans for the viewer with exciting features just around the corner. So what's next? Well, one feature we are excited about is <strong>annotations</strong>, meaning you will be able to place informational panels within your scenes. Subscribe to the repo to get notified about new releases.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-our-open-source-mission">👨‍💻 Our Open Source Mission<a href="https://blog.playcanvas.com/supersplat-3dgs-viewer-is-now-open-source#-our-open-source-mission" class="hash-link" aria-label="Direct link to 👨‍💻 Our Open Source Mission" title="Direct link to 👨‍💻 Our Open Source Mission" translate="no">​</a></h3>
<p>We proudly provide the SuperSplat Viewer as an MIT-licensed open source project. The 3D Gaussian Splat community has made impressive strides over the past 18 months, largely due to open collaboration. Join us in shaping the future by submitting issues, creating pull requests, or simply starring <a href="https://github.com/playcanvas/supersplat-viewer" target="_blank" rel="noopener noreferrer" class="">our GitHub repo</a>! ⭐</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/supersplat-3dgs-viewer-is-now-open-source#-your-feedback-matters" class="hash-link" aria-label="Direct link to 👂 Your Feedback Matters" title="Direct link to 👂 Your Feedback Matters" translate="no">​</a></h3>
<p>We hope you approve of this latest update to our open source journey! The SuperSplat community has grown tremendously, and your feedback is invaluable. What features would you love to see next? Share your thoughts on our <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a>!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
        <item>
            <title><![CDATA[Render Your Gaussian Splats to Video with SuperSplat 2.2]]></title>
            <link>https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat</link>
            <guid>https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat</guid>
            <pubDate>Thu, 13 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are announcing the release of SuperSplat 2.2. 🚀]]></description>
            <content:encoded><![CDATA[<p>Today, we are announcing the release of SuperSplat 2.2. 🚀</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/wVBwVQ55Pe8" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<p>SuperSplat is your <a href="https://github.com/playcanvas/supersplat/" target="_blank" rel="noopener noreferrer" class="">open source</a> platform for editing and publishing 3D Gaussian Splats. This update introduces video rendering for your splats, alongside numerous other improvements. Let's dive in!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="️-video-rendering">🎞️ Video Rendering<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#%EF%B8%8F-video-rendering" class="hash-link" aria-label="Direct link to 🎞️ Video Rendering" title="Direct link to 🎞️ Video Rendering" translate="no">​</a></h3>
<p>The <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat Editor</a> is a powerful application for cleaning up, optimizing and publishing your 3DGS scenes. With today's update, you can now render high-quality videos directly from your camera animations set up on the Timeline. The new functionality can be accessed via the new <code>Render</code> menu in the menu bar.</p>
<p>Choose your resolution, set your bitrate, and even render vertical videos optimized for mobile viewing. Video encoding is impressively fast — try it yourself and experience the speed! ⚡</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-social-splats">👥 Social Splats<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-social-splats" class="hash-link" aria-label="Direct link to 👥 Social Splats" title="Direct link to 👥 Social Splats" translate="no">​</a></h3>
<p>The <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">SuperSplat site</a> launched exactly 1 month ago. Since then, we have added a raft of new features that makes gives you a much more social experience.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-user-pages">👥 User Pages<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-user-pages" class="hash-link" aria-label="Direct link to 👥 User Pages" title="Direct link to 👥 User Pages" translate="no">​</a></h4>
<p>You can now showcase your splats on your own user page! When you find a splat that inspires you, click on the creator link and browse their work. Lots of creators have already inspired us! For example, <a href="https://superspl.at/user?id=tipatat" target="_blank" rel="noopener noreferrer" class="">tipatat</a> has published a smorgasbord of culinary delicacies:</p>
<p><img decoding="async" loading="lazy" alt="SuperSplat User Tipatat" src="https://blog.playcanvas.com/assets/images/supersplat-user-tipatat-cbc4ba388c1a53c855cda34e23051168.webp" width="1824" height="987" class="img_ev3q"></p>
<p>Here are some other awesome user pages for you to visit:</p>
<ul>
<li class=""><a href="https://superspl.at/user?id=studioduckbill" target="_blank" rel="noopener noreferrer" class="">Studio Duckbill</a> - beautiful locations in Japan with great camera animations.</li>
<li class=""><a href="https://superspl.at/user?id=epigraph" target="_blank" rel="noopener noreferrer" class="">Epigraph</a> - realistically rendered splats of products.</li>
<li class=""><a href="https://superspl.at/user?id=simonbethke" target="_blank" rel="noopener noreferrer" class="">Simon Bethke</a> - talented 3DGS enthusiast showcasing various objects and locations in Germany.</li>
</ul>
<p><a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">Go explore</a> and see what else you can discover! 🔍</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-comments">💬 Comments<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-comments" class="hash-link" aria-label="Direct link to 💬 Comments" title="Direct link to 💬 Comments" translate="no">​</a></h4>
<p>You can now leave your thoughts or ask questions under any splat!</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-comments.mp4" style="width:50%;height:auto"></video>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="-social-sharing">🔄 Social Sharing<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-social-sharing" class="hash-link" aria-label="Direct link to 🔄 Social Sharing" title="Direct link to 🔄 Social Sharing" translate="no">​</a></h4>
<p>You can easily share any splat to your favorite social channels: X, LinkedIn, Slack, email...you name it!</p>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-sharing.mp4" style="width:50%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-splat-embeds">🔗 Splat Embeds<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-splat-embeds" class="hash-link" aria-label="Direct link to 🔗 Splat Embeds" title="Direct link to 🔗 Splat Embeds" translate="no">​</a></h3>
<p>You can now embed any splat on SuperSplat on your own website! Here's an gorgeous example from world-class 3DGS creator <a href="https://superspl.at/user?id=schindelar3d" target="_blank" rel="noopener noreferrer" class="">Christoph Schindelar</a> - <em>YES, IT'S INTERACTIVE AND NOT A VIDEO!</em> 😆</p>
<div class="iframe-container"><iframe id="viewer" width="800" height="500" allow="fullscreen; xr-spatial-tracking" src="https://superspl.at/s?id=ed2efe80"></iframe></div>
<p>To create an embed:</p>
<ul>
<li class="">Hit the <code>Embed</code> button</li>
<li class="">Copy the HTML code</li>
<li class="">Insert it at the appropriate place on your own site</li>
</ul>
<video playsinline="" autoplay="" muted="" loop="" controls="" src="/img/supersplat-embed.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-viewer-enhancements">📺 Viewer Enhancements<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-viewer-enhancements" class="hash-link" aria-label="Direct link to 📺 Viewer Enhancements" title="Direct link to 📺 Viewer Enhancements" translate="no">​</a></h3>
<p>The SuperSplat Viewer embedded above has been heavily enhanced in the month since launch. Here's a quick overview of what's new:</p>
<ul>
<li class=""><strong>Progress Bar</strong>: Easily scrub through your scene’s animations.</li>
<li class=""><strong>Camera Settings</strong>: Quickly switch between Orbit (ideal for objects) and Fly (ideal for locations) camera modes via the cog icon.</li>
<li class=""><strong>Redesigned Info Panel</strong>: Comprehensive usage instructions for both desktop and mobile.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-our-open-source-mission">👨‍💻 Our Open Source Mission<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-our-open-source-mission" class="hash-link" aria-label="Direct link to 👨‍💻 Our Open Source Mission" title="Direct link to 👨‍💻 Our Open Source Mission" translate="no">​</a></h3>
<p>We proudly offer SuperSplat as an MIT-licensed open source project. The 3D Gaussian Splat community has made impressive strides over the past 18 months, largely due to open collaboration. Join us in shaping the future by submitting issues, creating pull requests, or simply starring <a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">our GitHub repo</a>! ⭐</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/render-your-gaussian-splats-to-video-with-supersplat#-your-feedback-matters" class="hash-link" aria-label="Direct link to 👂 Your Feedback Matters" title="Direct link to 👂 Your Feedback Matters" translate="no">​</a></h3>
<p>We hope you love this update as much as we enjoyed creating it! The SuperSplat community has grown tremendously, and your feedback is invaluable. What features would you love to see next? Share your thoughts on our <a href="https://discord.com/invite/T3pnhRTTAY" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://x.com/playcanvas" target="_blank" rel="noopener noreferrer" class="">ping us on X</a>!</p>]]></content:encoded>
            <category>gaussian-splats</category>
            <category>supersplat</category>
        </item>
    </channel>
</rss>