<?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, 22 Apr 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[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 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 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/?features=downloadable&amp;time=all" 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, SuperSplat (and <code>splat-transform</code>) write out a <strong>folder of SOG chunks</strong> plus a 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, export it as streamed LOD (the easiest way is from SuperSplat's export dialog - see the <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="">Streamed LOD docs</a>) 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>-K</code> / <code>--collision-mesh</code>. It voxelizes the splat, flood-fills the navigable interior from a seed position, and writes out a watertight <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-params 0.05,0.1 \</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">  -K \</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  scene.sog</span><br></div></code></pre></div></div>
<p>That one command gives me two outputs:</p>
<ul>
<li class=""><code>scene.sog</code> - a single-file compressed splat for quick iteration; the shipped build uses the streamed folder from Step 2.</li>
<li class=""><code>scene.collision.glb</code> - a voxel-derived mesh that hugs the real geometry.</li>
</ul>
<p>I dropped both into the PlayCanvas project and attached the GLB 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 modelling, 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 -K scene.sog</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 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 popularised 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">retreat</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">retreat</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">range</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 -K</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 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 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 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 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 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 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 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 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 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 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 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 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 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 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>
        <item>
            <title><![CDATA[Publish Your Gaussian Splats with SuperSplat 2.0]]></title>
            <link>https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat</link>
            <guid>https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat</guid>
            <pubDate>Thu, 13 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are announcing a major update of SuperSplat, the open source platform for editing and publishing 3D Gaussian Splats.]]></description>
            <content:encoded><![CDATA[<p>Today, we are announcing a major update of SuperSplat, the open source platform for editing and publishing 3D Gaussian Splats.</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/eLi_HVoHjrk" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-weve-moved">🏠 We've Moved<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#-weve-moved" class="hash-link" aria-label="Direct link to 🏠 We've Moved" title="Direct link to 🏠 We've Moved" translate="no">​</a></h3>
<p>SuperSplat can now be found on a shiny new domain! From now on, point your browser at:</p>
<div style="text-align:center"><a href="https://superspl.at/" style="font-size:2rem;font-weight:bold;text-decoration:none"><p>superspl.at</p></a></div>
<p>The SuperSplat Editor that you know and love can now be accessed at <a href="https://superspl.at/editor" target="_blank" rel="noopener noreferrer" class="">https://superspl.at/editor</a>. Much easier to remember, don't you think?</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-publish-your-splats-to-the-web">🌐 Publish your Splats to the Web<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#-publish-your-splats-to-the-web" class="hash-link" aria-label="Direct link to 🌐 Publish your Splats to the Web" title="Direct link to 🌐 Publish your Splats to the Web" translate="no">​</a></h3>
<p>Recently, we added the ability to export an HTML viewer of your splat from the SuperSplat Editor. Built on the powerful <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">PlayCanvas Engine</a> and our open source <a class="" href="https://blog.playcanvas.com/compressing-gaussian-splats#compressed-ply-format">Compressed PLY format</a>, it offers fast load times and high-performance rendering. However, <em>hosting</em> the HTML viewer was still your responsibility. And let's be honest, not everybody has the time or expertise to host their own website. So we've added a new feature to SuperSplat to make it easier to share your splats with others.</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat2-publish-1080p-social-60fps.mp4" style="width:100%;height:auto"></video>
<p>It's as easy as 1-2-3:</p>
<ol>
<li class="">Log in with your PlayCanvas account (or sign up if you don't have one).</li>
<li class="">Select <code>File</code> &gt; <code>Publish</code> when you've finished crafting your splat.</li>
<li class="">Fill out the publishing options form and hit <code>Publish</code>.</li>
</ol>
<p>That's it! Your splat will be published to the web and you'll be given a URL to share with others.</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>tip</div><div class="admonitionContent_BuS1"><p>By default, your splat will be listed on the SuperSplat website. However, you can also choose to make it unlisted. This means it won't appear in the main gallery, but you can still access it via the URL.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-create-camera-flythroughs">🎥 Create Camera Flythroughs<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#-create-camera-flythroughs" class="hash-link" aria-label="Direct link to 🎥 Create Camera Flythroughs" title="Direct link to 🎥 Create Camera Flythroughs" translate="no">​</a></h3>
<p>Sure, it's great to be able to share your splats with others, but for that extra 'wow' factor, why not add a camera flythrough? SuperSplat Editor 2.0 introduces the Timeline that makes it a breeze to author great looking camera animations. Simply select a frame in the timeline, position the camera, and set a keyframe. Do this for as many frames as you want and you've got a camera flythrough!</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat2-camera-animation-720p-social-60fps.mp4" style="width:100%;height:auto"></video>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-load-and-save-your-supersplat-projects">📄 Load and Save your SuperSplat Projects<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#-load-and-save-your-supersplat-projects" class="hash-link" aria-label="Direct link to 📄 Load and Save your SuperSplat Projects" title="Direct link to 📄 Load and Save your SuperSplat Projects" translate="no">​</a></h3>
<p>With the ability to create camera animations, your splat projects are becoming more and more complex. To support this, we've added a new project file format so you can save your work between sessions. The extension of SuperSplat's new project file format is <code>.ssproj</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>The <code>.ssproj</code> file format is actually just a ZIP file containing project data in JSON format, along with a set of PLY files storing the Gaussian Splat data.</p></div></div>
<p>The introduction of the new project file format has also prompted us to reorganize the <code>File</code> menu. <code>Open</code>, <code>Save</code> and <code>Save As</code> now only operate on <code>.ssproj</code> files. To import and export other file formats into your project (such as <code>.ply</code> or <code>.splat</code>) you can use the <code>Import</code> and <code>Export</code> options in the <code>File</code> menu.</p>
<p><img decoding="async" loading="lazy" alt="File Menu" src="https://blog.playcanvas.com/assets/images/supersplat-file-menu-130ee9e8c308ac54fdeeac9c54e58e50.png" width="715" height="538" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-explore-splats-from-the-community">👥 Explore Splats from the Community<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#-explore-splats-from-the-community" class="hash-link" aria-label="Direct link to 👥 Explore Splats from the Community" title="Direct link to 👥 Explore Splats from the Community" translate="no">​</a></h3>
<p>With the ability to publish splats to the web, <a href="https://superspl.at/" target="_blank" rel="noopener noreferrer" class="">superspl.at</a> has become a great place to explore the work of the Gaussian Splat community. Browse or search digitized reality from creators around the world.</p>
<p><img decoding="async" loading="lazy" alt="Community Scroll" src="https://blog.playcanvas.com/assets/images/supersplat2-community-scroll-f50fe19ed9f6614b367d7cf3934cb8cb.gif" width="804" height="480" class="img_ev3q"></p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="view-splats-in-immersive-ar-and-vr">View Splats in Immersive AR and VR<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-with-supersplat#view-splats-in-immersive-ar-and-vr" class="hash-link" aria-label="Direct link to View Splats in Immersive AR and VR" title="Direct link to View Splats in Immersive AR and VR" translate="no">​</a></h4>
<p>One of the coolest things about the PlayCanvas-powered web viewer is that it's fully integrated with WebXR, the browser-based standard for immersive experiences. Simply tap the viewer's AR button and you can spawn photorealistic 3D models directly into your environment.</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat2-ar-quest3.mp4" style="width:100%;height:auto"></video>
<p>Or dive straight into a splat in fully immersive VR.</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat2-vr-avp.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>🤳 AR mode has been tested on Meta Quest 2 and 3, and Android-based smartphones.<br>
<!-- -->🥽 VR mode has been tested on Meta Quest 2 and 3, and Apple Vision Pro.</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-our-open-source-mission">👨‍💻 Our Open Source Mission<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-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 are proud to bring SuperSplat to you as an MIT-licensed open source project. The 3D Gaussian Splat community has come a long way in the last 18 months and much of that progress is thanks to the OSS community. So it's important to us that we play our part. But we're stronger together, so please do consider joining our open source effort. Submit issue reports, open pull requests...or just help us out by starring <a href="https://github.com/playcanvas/supersplat" target="_blank" rel="noopener noreferrer" class="">our repo</a>! ⭐</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="-your-feedback-matters">👂 Your Feedback Matters<a href="https://blog.playcanvas.com/publish-your-gaussian-splats-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 today's update! We put our heart and soul into this release and we're excited to share it with you.</p>
<p>The SuperSplat community has grown a lot over the last year and we want to get your feedback. What other features would you like to see added to the platform? 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[Declarative 3D with React]]></title>
            <link>https://blog.playcanvas.com/declarative-3d-with-playcanvas-react</link>
            <guid>https://blog.playcanvas.com/declarative-3d-with-playcanvas-react</guid>
            <pubDate>Tue, 14 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Since introducing PlayCanvas, we've seen developers the world over build amazing 3D experiences using the PlayCanvas Engine and Editor. But what if you are a React developer?]]></description>
            <content:encoded><![CDATA[<p>Since introducing PlayCanvas, we've seen developers the world over build amazing 3D experiences using the PlayCanvas Engine and Editor. But what if you are a React developer?</p>
<p>Today we're proud to announce the release of <strong><a href="https://github.com/playcanvas/react" target="_blank" rel="noopener noreferrer" class="">PlayCanvas React</a></strong>, a new declarative way to build 3D content using <a href="https://react.dev/" target="_blank" rel="noopener noreferrer" class="">React</a>.</p>
<p><strong>PlayCanvas React</strong> is a thin React wrapper around the PlayCanvas API. It allows you to build rich 3D content in a declarative way that fully integrates with the React ecosystem. You can create rich, complex 3D content with assets, physics, gaussian splats, audio, and more, all while leveraging the powerful state management of React.</p>
<p>Check out the <a href="https://codesandbox.io/p/sandbox/playcanvas-react-mxfvg9?file=%2Fsrc%2FApp.jsx" target="_blank" rel="noopener noreferrer" class="">CodeSandbox</a> below. Slide open the code editor and play with the code in real time.</p>
<iframe src="https://codesandbox.io/embed/mxfvg9?view=preview&amp;module=%2Fsrc%2FApp.jsx&amp;hidenavigation=1" style="width:100%;height:500px;border:0;border-radius:4px;overflow:hidden" title="@playcanvas/react" allow="accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; hid; microphone; midi;   payment; usb; vr; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-presentation allow-same-origin allow-scripts"></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-does-this-look-like">What does this look like?<a href="https://blog.playcanvas.com/declarative-3d-with-playcanvas-react#what-does-this-look-like" class="hash-link" aria-label="Direct link to What does this look like?" title="Direct link to What does this look like?" translate="no">​</a></h3>
<p>With <strong>@playcanvas/react</strong> you create a scene using entities and components, just like you would in the PlayCanvas Editor or Engine. Entities have position, rotation and scale. They're the building blocks of your scene. Components on the other hand add behavior to an entity. For example, adding a <code>&lt;Render/&gt;</code> component to an entity allows it to render a mesh.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>View code example</summary><div><div class="collapsibleContent_i85q"><div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx 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">Application</span><span class="token imports punctuation" style="color:#393A34">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">Entity</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/react'</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 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 keyword module" style="color:#00009f">as</span><span class="token imports"> </span><span class="token imports maybe-class-name">PcScript</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 comment" style="color:#999988;font-style:italic">// This script spins the entity it's attached to</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">class</span><span class="token plain"> </span><span class="token class-name">Spinner</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">PcScript</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 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">rotate</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 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 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 comment" style="color:#999988;font-style:italic">/**</span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * Your first @playcanvas/react example! </span><br></div><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"> * This renders a spinning box with a camera and some lighting.</span><br></div><div class="token-line" style="color:#393A34"><span class="token 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"></span><span class="token keyword module" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:#d73a49">HelloWorld</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 plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</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" style="display:inline-block"></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"> material </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">useMaterial</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 literal-property property" style="color:#36acaa">diffuse</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'gray'</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 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 control-flow" style="color:#00009f">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* Create a camera entity */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">name</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">camera</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">position</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">[</span><span class="token tag script language-javascript number" style="color:#36acaa">4</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">3</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">4</span><span class="token tag script language-javascript punctuation" style="color:#393A34">]</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Camera</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">clearColor</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">#111111</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">fov</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript number" style="color:#36acaa">28</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token comment" style="color:#999988;font-style:italic">/* Create the spinning box entity */</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">position</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript punctuation" style="color:#393A34">[</span><span class="token tag script language-javascript number" style="color:#36acaa">0</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">0.5</span><span class="token tag script language-javascript punctuation" style="color:#393A34">,</span><span class="token tag script language-javascript" style="color:#00009f"> </span><span class="token tag script language-javascript number" style="color:#36acaa">0</span><span class="token tag script language-javascript punctuation" style="color:#393A34">]</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Render</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">type</span><span class="token tag attr-value punctuation attr-equals" style="color:#393A34">=</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag attr-value" style="color:#e3116c">box</span><span class="token tag attr-value punctuation" style="color:#393A34">'</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">material</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript" style="color:#00009f">material</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:#393A34">&lt;</span><span class="token tag class-name" style="color:#00009f">Script</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">script</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript maybe-class-name" style="color:#00009f">Spinner</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag" style="color:#00009f"> </span><span class="token tag attr-name" style="color:#00a4db">speed</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:#393A34">=</span><span class="token tag script language-javascript punctuation" style="color:#393A34">{</span><span class="token tag script language-javascript number" style="color:#36acaa">10</span><span class="token tag script language-javascript punctuation" style="color:#393A34">}</span><span class="token tag punctuation" style="color:#393A34">/&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag punctuation" style="color:#393A34">&gt;</span><span class="token plain-text"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:#393A34">&lt;/</span><span class="token tag class-name" style="color:#00009f">Entity</span><span class="token tag punctuation" style="color:#393A34">&gt;</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><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></code></pre></div></div></div></div></details>
<p>If you’re already familiar with the PlayCanvas API, you’re already off to a good start! You’ll see that any component system available in the engine can be used out of the box including rigid bodies, collision, physics etc. Follow our <a href="https://playcanvas-react.vercel.app/docs/guide/getting-started" target="_blank" rel="noopener noreferrer" class="">Getting Started Guide</a> and you'll be up to speed in no time.</p>
<p>If you're coming from a React background, you'll find it easy to integrate with existing React projects. Even if you’re new to PlayCanvas, you can pick up the basics in just a few hours.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-react">Why React?<a href="https://blog.playcanvas.com/declarative-3d-with-playcanvas-react#why-react" class="hash-link" aria-label="Direct link to Why React?" title="Direct link to Why React?" translate="no">​</a></h3>
<p>React is loved by developers because it makes building user interfaces simple, intuitive, and predictable. With PlayCanvas React, you can now apply the same magic to 3D! Instead of writing complex, imperative code to create and manage 3D scenes, you can describe them declaratively, just like you do with HTML for a webpage. React’s component-based approach also makes it easy to reuse and organize your 3D content, so you can focus on creativity instead of boilerplate.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-about-the-editor-and-engine">What about the Editor and Engine?<a href="https://blog.playcanvas.com/declarative-3d-with-playcanvas-react#what-about-the-editor-and-engine" class="hash-link" aria-label="Direct link to What about the Editor and Engine?" title="Direct link to What about the Editor and Engine?" translate="no">​</a></h3>
<ul>
<li class="">
<p>The PlayCanvas Engine underpins everything. PlayCanvas React is simply a thin wrapper around the engine with a React friendly syntax. There's no strict rule for using one over the other, but if you're familiar with React and its ecosystem, you'll find PlayCanvas React fits well with your stack.</p>
</li>
<li class="">
<p>The Editor on the other hand is a powerful browser-based tool for building rich 3D content. PlayCanvas React is another way of achieving the same goal. Whilst the Editor provides a full suite of tools for asset management, scene organization, and rapid iteration, PlayCanvas React is more about building 3D content from within your React code. If you enjoy a code-centric workflow or want to integrate 3D content directly into a larger React application, PlayCanvas React may be the perfect fit.</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-source-ftw">Open Source FTW<a href="https://blog.playcanvas.com/declarative-3d-with-playcanvas-react#open-source-ftw" class="hash-link" aria-label="Direct link to Open Source FTW" title="Direct link to Open Source FTW" translate="no">​</a></h3>
<p>PlayCanvas React is completely open source, licensed under the <a href="https://github.com/playcanvas/react/blob/main/LICENSE" target="_blank" rel="noopener noreferrer" class="">MIT License</a>. We believe that by sharing our work, collaborating with the community, and encouraging contributions, we aim to build a robust ecosystem.</p>
<p>If you find a bug, have a suggestion, or want to contribute, feel free to <a href="https://github.com/playcanvas/react/issues" target="_blank" rel="noopener noreferrer" class="">open an issue</a> or submit a pull request. We welcome your feedback and ideas!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-new-step-for-3d">A new step for 3D<a href="https://blog.playcanvas.com/declarative-3d-with-playcanvas-react#a-new-step-for-3d" class="hash-link" aria-label="Direct link to A new step for 3D" title="Direct link to A new step for 3D" translate="no">​</a></h3>
<p>The library is already being used in production! <a href="https://ai.snapchat.com/" target="_blank" rel="noopener noreferrer" class="">Snap AI</a> from Snap Inc — an app for generating 3D assets from text — is built on PlayCanvas React:</p>
<p><img decoding="async" loading="lazy" alt="Snap AI" src="https://blog.playcanvas.com/assets/images/ai-snapchat-d7b9bcac70782f385d47a350a51a3741.gif" width="788" height="480" class="img_ev3q"></p>
<p>To get started you can follow the <a href="https://playcanvas-react.vercel.app/docs/installation" target="_blank" rel="noopener noreferrer" class="">installation and getting started guide</a>, then check out the <strong><a href="https://github.com/playcanvas/react" target="_blank" rel="noopener noreferrer" class="">repo</a></strong> and explore some of the <strong><a href="https://playcanvas-react.vercel.app/examples" target="_blank" rel="noopener noreferrer" class="">examples</a></strong> in the live playground.</p>
<p>Happy coding!</p>]]></content:encoded>
            <category>engine</category>
            <category>react</category>
        </item>
        <item>
            <title><![CDATA[PlayCanvas Engine Hits 2.0.0]]></title>
            <link>https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0</link>
            <guid>https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0</guid>
            <pubDate>Thu, 22 Aug 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Today marks a major milestone for the PlayCanvas Engine, the open-source JavaScript runtime that powers thousands of interactive graphical apps and tools on the web. We are bubbling with excitement to announce the release of version 2.0.0!]]></description>
            <content:encoded><![CDATA[<p>Today marks a major milestone for the PlayCanvas Engine, the <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">open-source</a> JavaScript runtime that powers thousands of interactive graphical apps and tools on the web. We are bubbling with excitement to announce the release of version 2.0.0!</p>
<p>For the full details, visit our GitHub:</p>
<p><a href="https://github.com/playcanvas/engine/releases/tag/v2.0.0" target="_blank" rel="noopener noreferrer" class=""><strong>RELEASE NOTES</strong></a></p>
<p>It's not every day we do a major version bump of the Engine. Let's take a walk down memory lane to see how we got here:</p>
<ul>
<li class="">October 2010: Coding of the Engine begins!</li>
<li class="">24 October 2011: <a href="https://github.com/playcanvas/engine/commit/e5bf014e738d5bfc92ece1d6c0f50ad71bf4dd90" target="_blank" rel="noopener noreferrer" class="">Engine migrated to GitHub</a></li>
<li class="">4 June 2014: <a href="https://blog.playcanvas.com/playcanvas-goes-open-source/" target="_blank" rel="noopener noreferrer" class="">Engine goes open source</a></li>
<li class="">24 April 2018: <a href="https://blog.playcanvas.com/playcanvas-engine-reaches-1-0-0/" target="_blank" rel="noopener noreferrer" class="">Engine hits 1.0.0</a></li>
</ul>
<p>Back in 2018, the Engine was bumped to 1.0.0 because we adhere to <a href="https://semver.org/" target="_blank" rel="noopener noreferrer" class="">semantic versioning</a> which dictates:</p>
<blockquote>
<p>If your software is being used in production, it should probably already be 1.0.0. If you have a stable API on which users have come to depend, you should be 1.0.0. If you’re worrying a lot about backward compatibility, you should probably already be 1.0.0.</p>
</blockquote>
<p>With hindsight, the Engine should probably have reached 1.0.0 some years before. It had long been stable and was already being used heavily in production!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-bump-to-200">Why Bump to 2.0.0<a href="https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0#why-bump-to-200" class="hash-link" aria-label="Direct link to Why Bump to 2.0.0" title="Direct link to Why Bump to 2.0.0" translate="no">​</a></h3>
<p>Semantic versioning says that you perform a major version bump when you introduce breaking changes. To say we go out of our way to avoid introducing breaking changes in an understatement. But since 1.0.0, we had done 73 minor versions along with countless patch releases. Along the way, the Engine accumulated a considerable amount of "cruft".</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>cruft <em>noun</em> <code>INFORMAL - COMPUTING</code></div><div class="admonitionContent_BuS1"><p>badly designed, unnecessarily complicated, or unwanted code or software.</p></div></div>
<p>It was getting to the point where parts of the codebase were restricting our ability to advance the Engine's capabilities. And so, we took to the decision to do a spring clean. 🧹 Here are some highlights of what we removed:</p>
<ul>
<li class=""><strong>WebGL 1 support.</strong> This is the big one. Today, devices that support WebGL 1 but not WebGL 2 is less than 2% and this number is only going to get smaller. And supporting WebGL 1 was making it extraordinarily difficult to construct the foundations we needed in order to support WebGPU. Cheerio, WebGL 1 - it's been fun! 👋</li>
<li class=""><strong>Scripts 1.0 support.</strong> The very first <code>ScriptComponent</code> implementation was deprecated with the introduction of <a href="https://blog.playcanvas.com/playcanvas-scripts-2-0/" target="_blank" rel="noopener noreferrer" class="">Scripts 2.0</a> back in 2016. So after 8 years of deprecation, it's gone! We are now focused on delivering our new ESM-based scripting system, due soon.</li>
<li class=""><strong>AudioSourceComponent.</strong> This component was the precursor to the Engine's <a href="https://api.playcanvas.com/engine/classes/SoundComponent.html" target="_blank" rel="noopener noreferrer" class=""><code>SoundComponent</code></a>. <code>AudioSourceComponent</code> has been deprecated for many years so it's time for it to go.</li>
<li class=""><strong>...and several other public API symbols.</strong> What we are left with is a cleaner, tighter codebase that can power us into the future!</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-if-my-project-breaks">What if my Project Breaks<a href="https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0#what-if-my-project-breaks" class="hash-link" aria-label="Direct link to What if my Project Breaks" title="Direct link to What if my Project Breaks" translate="no">​</a></h3>
<p>Never fear! Today's release is more relevant to 'Engine-only' users who pull the engine from <a href="https://www.npmjs.com/package/playcanvas" target="_blank" rel="noopener noreferrer" class="">NPM</a>. At a time of their choosing, these developers can upgrade to 2.0.0 and give it a try. The vast majority of projects will update without modification.</p>
<p>Editor users will gain access to Engine 2.0.0 in the coming weeks. At that point, moving to 2.0.0 will be <em>opt in</em> for existing projects. We plan to support the last Engine 1.x release in the Editor for at least a year after Engine 2 becomes available. This should be plenty of time for developers to migrate. New projects will automatically use 2.0.0. We will release more information about the transition for Editor users in the coming weeks.</p>
<p>In the meantime, we ask NPM users to try Engine 2.0.0 and give us your feedback as soon as you can. We hope you like it! Head over to the <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">Forum</a>, <a href="https://discord.gg/RSaMRzg" target="_blank" rel="noopener noreferrer" class="">Discord</a> or <a href="https://github.com/playcanvas/engine" target="_blank" rel="noopener noreferrer" class="">GitHub</a> to have your say. <!-- -->👂</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="whats-new">What's New<a href="https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0#whats-new" class="hash-link" aria-label="Direct link to What's New" title="Direct link to What's New" translate="no">​</a></h3>
<p>The 2.0.0 release isn't just about breaking changes! We have some exciting features to announce by way of some brand new Engine examples:</p>
<p><img decoding="async" loading="lazy" alt="Engine 2 Examples" src="https://blog.playcanvas.com/assets/images/engine2-examples-fda1649bd8bafcaed05d4ce584df015e.png" width="1920" height="1080" class="img_ev3q"></p>
<p>Check 'em out:</p>
<ul>
<li class=""><a href="https://playcanvas.vercel.app/#/graphics/shader-hatch" target="_blank" rel="noopener noreferrer" class="">Custom Shaders: Cross Hatching</a></li>
<li class=""><a href="https://playcanvas.vercel.app/#/graphics/instancing-gooch" target="_blank" rel="noopener noreferrer" class="">Custom Shaders: Used with Skinning and Instancing</a></li>
<li class=""><a href="https://playcanvas.vercel.app/#/graphics/ambient-occlusion" target="_blank" rel="noopener noreferrer" class="">Screen Space Ambient Occlusion</a></li>
<li class=""><a href="https://playcanvas.vercel.app/#/graphics/instancing-custom" target="_blank" rel="noopener noreferrer" class="">Hardware Instancing</a></li>
<li class=""><a href="https://playcanvas.vercel.app/#/graphics/instancing-glb" target="_blank" rel="noopener noreferrer" class="">glTF Hardware Instancing Extension</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="thanking-the-open-source-community">Thanking the Open Source Community<a href="https://blog.playcanvas.com/playcanvas-engine-hits-2-0-0#thanking-the-open-source-community" class="hash-link" aria-label="Direct link to Thanking the Open Source Community" title="Direct link to Thanking the Open Source Community" translate="no">​</a></h3>
<p>We <em>could not</em> have reached this point without the amazing open source community:</p>
<p><img decoding="async" loading="lazy" alt="GitHub Contributors" src="https://blog.playcanvas.com/assets/images/engine-contributors-50d4173785b6d1ae8d8f478ac3bc8520.svg" width="812" height="608" class="img_ev3q"></p>
<p>Thank you for your incredible contributions. 🙏</p>]]></content:encoded>
            <category>engine</category>
        </item>
        <item>
            <title><![CDATA[Create 3D Gaussian Splat Apps with the PlayCanvas Editor]]></title>
            <link>https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor</link>
            <guid>https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor</guid>
            <pubDate>Wed, 05 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[CLICK HERE to open in a new tab. Credits: Splats scanned at the V&A Museum. HDRI from Poly Haven.]]></description>
            <content:encoded><![CDATA[<div class="iframe-container-taller"><iframe loading="lazy" src="https://playcanv.as/e/p/cLkf99ZV/" title="3DGS Statues" webkitallowfullscreen="true" mozallowfullscreen="true" allow="autoplay" allowfullscreen="" allowvr="" scrolling="no" frameborder="0"></iframe></div>
<p><em><a href="https://playcanv.as/e/p/cLkf99ZV/" target="_blank" rel="noopener noreferrer" class="">CLICK HERE</a> to open in a new tab. Credits: Splats scanned at the <a href="https://www.vam.ac.uk/" target="_blank" rel="noopener noreferrer" class="">V&amp;A Museum</a>. HDRI from <a href="https://polyhaven.com/a/sepulchral_chapel_rotunda" target="_blank" rel="noopener noreferrer" class="">Poly Haven</a>.</em></p>
<p>We have big news for the 3D Gaussian Splat community - the PlayCanvas Editor now has fully integrated support for splats!
Learn how to quickly build stunning, interactive 3DGS applications 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>What you need</div><div class="admonitionContent_BuS1"><p>🤳 A smartphone<br>
<!-- -->💻 A computer with a web browser<br>
<!-- -->⏱️ A small amount of time</p></div></div>
<p>The application above shows several splats assembled in a single application, with animation and post effects spicing up the visuals. Let's check out how it was built.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1-clean-in-supersplat-">Step 1: Clean in SuperSplat 🧹<a href="https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor#step-1-clean-in-supersplat-" class="hash-link" aria-label="Direct link to Step 1: Clean in SuperSplat 🧹" title="Direct link to Step 1: Clean in SuperSplat 🧹" translate="no">​</a></h3>
<p>After <a href="https://developer.playcanvas.com/user-manual/graphics/gaussian-splatting/#creating-splats" target="_blank" rel="noopener noreferrer" class="">capturing the statues</a> to PLY format, our first stop is <a href="https://playcanvas.com/supersplat/editor?load=https://raw.githubusercontent.com/willeastcott/assets/main/statues/narcissus.compressed.ply" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a>, the open source tool for editing and optimizing 3D Gaussian Splats. Here, in a little over a minute, we can isolate the statue from the background and align it with the origin:</p>
<video autoplay="" muted="" loop="" controls="" src="/img/statue-supersplat.mp4" style="width:100%;height:auto"></video>
<p>Once we are done, we can download the splat using our <a href="https://blog.playcanvas.com/compressing-gaussian-splats" target="_blank" rel="noopener noreferrer" class="">compressed PLY format</a>. In this case, our downloaded PLY is <strong>only 1.56MB</strong>!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2-import-into-the-editor-">Step 2: Import into the Editor 🚧<a href="https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor#step-2-import-into-the-editor-" class="hash-link" aria-label="Direct link to Step 2: Import into the Editor 🚧" title="Direct link to Step 2: Import into the Editor 🚧" translate="no">​</a></h3>
<p>Now that we have a clean, compressed PLY, we simply need to drop it into the Editor's Asset Panel. And from there, drag it into the viewport to add it to the scene. Let's do that (along with a cube map for a photographic backdrop):</p>
<video autoplay="" muted="" loop="" controls="" src="/img/statue-editor.mp4" style="width:100%;height:auto"></video>
<p>The PlayCanvas Editor is a powerful visual environment for building and publishing 3D scenes. You can:</p>
<ul>
<li class="">Grab useful scripts (and other assets) from the Asset Store. Here, we import an Orbit Camera script.</li>
<li class="">Create beautiful user interfaces, using either HTML or PlayCanvas' built-in UI system.</li>
<li class="">Add sound, physics, VR/AR support and much, much more.</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3-add-animation-and-post-effects-">Step 3: Add Animation and Post Effects ✨<a href="https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor#step-3-add-animation-and-post-effects-" class="hash-link" aria-label="Direct link to Step 3: Add Animation and Post Effects ✨" title="Direct link to Step 3: Add Animation and Post Effects ✨" translate="no">​</a></h3>
<p>What really makes the demo pop is the transitions that fade the statues in and out.</p>
<video autoplay="" muted="" loop="" controls="" src="/img/statue-custom-shaders.mp4" style="width:100%;height:auto"></video>
<p>With the Editor, you can customize the shader code that renders your splats to apply stunning animation effects. For the transition between statues, individual splats are transformed and recolored over time, while a full-screen bloom effect is ramped up and down.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="resources">Resources<a href="https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor#resources" class="hash-link" aria-label="Direct link to Resources" title="Direct link to Resources" translate="no">​</a></h3>
<p>Today's release makes working with 3D Gaussian Splats both easy and fun! We've shown you how to build a virtual gallery or museum but the possibilities are endless. With 3D Gaussian Splats in the PlayCanvas Editor, you can target many verticals: product visualization (furniture, clothing, consumer electronics), automotive, education, travel and so much more.</p>
<p>To get started, here is an useful list of resources:</p>
<ul>
<li class=""><a href="https://playcanvas.com/project/1224723/overview/3d-gaussian-splat-statues" target="_blank" rel="noopener noreferrer" class="">Statue Project</a> - feel free to fork it, explore and experiment.</li>
<li class=""><a href="https://developer.playcanvas.com/user-manual/graphics/gaussian-splatting/" target="_blank" rel="noopener noreferrer" class="">3D Gaussian Splatting</a> User Guide</li>
<li class=""><a href="https://playcanvas.com/supersplat/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a> (don't forget to <a href="https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support#pwa-support" target="_blank" rel="noopener noreferrer" class="">install the PWA</a>)</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="go-forth-and-create">Go Forth and Create<a href="https://blog.playcanvas.com/create-3d-gaussian-splat-apps-with-the-playcanvas-editor#go-forth-and-create" class="hash-link" aria-label="Direct link to Go Forth and Create" title="Direct link to Go Forth and Create" translate="no">​</a></h3>
<p>We hope you love today's update as much as we do! ❤️</p>
<p>But let us know what you think by heading over to the <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">forum</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[A Faster SuperSplat with PWA Support]]></title>
            <link>https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support</link>
            <guid>https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support</guid>
            <pubDate>Wed, 22 May 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Today, we are announcing the latest release of SuperSplat, the open source tool for editing and optimizing 3D Gaussian Splats. If you don't have a PLY file to hand, here's an example!]]></description>
            <content:encoded><![CDATA[<p>Today, we are announcing the latest release of <a href="https://playcanvas.com/supersplat/editor" target="_blank" rel="noopener noreferrer" class="">SuperSplat</a>, the open source tool for editing and optimizing 3D Gaussian Splats. If you don't have a PLY file to hand, <a href="https://playcanvas.com/supersplat/editor?load=https://raw.githubusercontent.com/playcanvas/engine/main/examples/assets/splats/biker.ply" target="_blank" rel="noopener noreferrer" class="">here's an example</a>!</p>
<p><img decoding="async" loading="lazy" alt="SuperSplat PWA" src="https://blog.playcanvas.com/assets/images/supersplat-pwa-sculpture-a820654be125762e818d128ec8c1af5a.png" width="2594" height="1620" class="img_ev3q"></p>
<p><a href="https://github.com/playcanvas/supersplat/releases/tag/v1.17.1" target="_blank" rel="noopener noreferrer" class="">Version 0.17.1</a> focuses on two key areas: performance and PWA support.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="performance-improvements">Performance Improvements<a href="https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support#performance-improvements" class="hash-link" aria-label="Direct link to Performance Improvements" title="Direct link to Performance Improvements" translate="no">​</a></h2>
<p>SuperSplat is now <em>over 2x faster on the GPU</em>! 🏃</p>
<p>Compare before and after (notice GPU time dropping from 32ms to 13.5ms for the bike scene):</p>
<p><img decoding="async" loading="lazy" alt="SuperSplat PWA" src="https://blog.playcanvas.com/assets/images/engine-splat-performance-cc6d9e8f879d315a132d14cdefba975b.webp" width="1920" height="1488" class="img_ev3q"></p>
<p>This is thanks to the <a href="https://github.com/playcanvas/engine/releases/tag/v1.71.0" target="_blank" rel="noopener noreferrer" class="">v1.71.0 release</a> of the PlayCanvas Engine, which includes a dramatic overhaul of how splats are processed by the GPU. For the technical details, take a look at <a href="https://github.com/playcanvas/engine/pull/6357" target="_blank" rel="noopener noreferrer" class="">this pull request</a>.</p>
<p>The result is that SuperSplat can now throw around millions of splats and still maintain a silky smooth frame rate. Try it for yourself!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="pwa-support">PWA Support<a href="https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support#pwa-support" class="hash-link" aria-label="Direct link to PWA Support" title="Direct link to PWA Support" translate="no">​</a></h2>
<p>A Progressive Web App (PWA) is a web application that provides a native app-like experience, including the ability to install it on a user's home screen or desktop.</p>
<p>From today, SuperSplat is shipping with PWA support! 🎉</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat-pwa-install.mp4" style="width:100%;height:auto"></video>
<p>To install SuperSplat as a PWA:</p>
<ol>
<li class="">Visit <a href="https://playcanvas.com/supersplat/editor" target="_blank" rel="noopener noreferrer" class="">https://playcanvas.com/supersplat/editor</a>.</li>
<li class="">Hit the <code>Install SuperSplat</code> button in the address bar.</li>
</ol>
<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>For your convenience, pin SuperSplat to the Taskbar (Windows) or add it do the Dock (macOS).</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ply-file-association">PLY File Association<a href="https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support#ply-file-association" class="hash-link" aria-label="Direct link to PLY File Association" title="Direct link to PLY File Association" translate="no">​</a></h3>
<p>With SuperSplat installed as a PWA, your operating system can now open launch PLY files directly into the tool. Simply right-click on a PLY file and select SuperSplat to open it.</p>
<video autoplay="" muted="" loop="" controls="" src="/img/supersplat-pwa-file-association.mp4" style="width:100%;height:auto"></video>
<p>You can also set SuperSplat as the default tool to open your PLYs. Then, you can simply double-click a PLY file to open it instantly in SuperSplat!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-feedback-matters">Your Feedback Matters<a href="https://blog.playcanvas.com/a-faster-supersplat-with-pwa-support#your-feedback-matters" class="hash-link" aria-label="Direct link to Your Feedback Matters" title="Direct link to Your Feedback Matters" translate="no">​</a></h2>
<p>We hope you love today's update! ❤️</p>
<p>The SuperSplat community has grown a lot in recent weeks and we want to get your feedback. What other features would you like the PWA to get? Are you still experiencing any performance problems? What is still missing from SuperSplat? Let us know by heading over to the <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">forum</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[Build WebGPU Apps Today with PlayCanvas]]></title>
            <link>https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas</link>
            <guid>https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas</guid>
            <pubDate>Thu, 18 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[It's here! 🥳 Today, we're excited to announce that WebGPU support has officially arrived in the PlayCanvas Editor.]]></description>
            <content:encoded><![CDATA[<p>It's here! 🥳 Today, we're excited to announce that WebGPU support has officially arrived in the PlayCanvas Editor.</p>
<p><img decoding="async" loading="lazy" alt="Editor with WebGPU Scene" src="https://blog.playcanvas.com/assets/images/editor-webgpu-86041b7f4db9c53139d1883799815a85.png" width="3840" height="2080" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="webgpu-on-the-rise">WebGPU on the Rise<a href="https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas#webgpu-on-the-rise" class="hash-link" aria-label="Direct link to WebGPU on the Rise" title="Direct link to WebGPU on the Rise" translate="no">​</a></h2>
<p>Since its inception back in 2010, PlayCanvas has been layered on top of WebGL. In 2017, we were proud to launch support for <a href="https://blog.playcanvas.com/mozilla-launches-webgl-2-with-playcanvas/" target="_blank" rel="noopener noreferrer" class="">WebGL 2.0</a> in partnership with our friends at Mozilla. April 2023 marked the beginning of a new era for web graphics when Google enabled WebGPU by default in Chrome 113. Since then, WebGPU adoption has exploded and today, <a href="https://web3dsurvey.com/webgpu" target="_blank" rel="noopener noreferrer" class="">Web3D Survey</a> reports that <strong>62.19% of end users can now run WebGPU</strong>. With <a href="https://caniuse.com/webgpu" target="_blank" rel="noopener noreferrer" class="">Firefox and Safari due to launch their WebGPU support</a> in the not-too-distant future, expect this number to rise dramatically in 2024.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="why-webgpu-matters">Why WebGPU Matters<a href="https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas#why-webgpu-matters" class="hash-link" aria-label="Direct link to Why WebGPU Matters" title="Direct link to Why WebGPU Matters" translate="no">​</a></h2>
<p>If you enable WebGPU for your PlayCanvas project, you may not notice much difference to begin with. In fact, we have put a great deal of effort into ensuring your WebGL projects look identical under WebGPU. But over time, there is are a great deal of opportunities to achieve performance improvements due to WebGPU's reduced driver overhead.</p>
<p>Another key feature unique to WebGPU is support for Compute Shaders which allow for general computation on the GPU. Support for Compute Shaders landed in <a href="https://github.com/playcanvas/engine/releases/tag/v1.70.0" target="_blank" rel="noopener noreferrer" class="">Engine v1.70.0</a>. Here you can see Computer Shaders in action simulating 1 million particles on the GPU:</p>
<div class="iframe-container"><iframe loading="lazy" width="560" height="315" src="https://www.youtube.com/embed/FRRFcEiWYEY" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"></iframe></div>
<p><a href="https://playcanvas.github.io/#/compute/particles" target="_blank" rel="noopener noreferrer" class="">Click here</a> to run it for yourself in a WebGPU-enabled browser (i.e. Chrome or Edge).</p>
<p>In short, WebGPU represents the future for PlayCanvas and you can expect some incredible advances in performance and functionality over the coming months.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="getting-started-with-webgpu">Getting Started with WebGPU<a href="https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas#getting-started-with-webgpu" class="hash-link" aria-label="Direct link to Getting Started with WebGPU" title="Direct link to Getting Started with WebGPU" translate="no">​</a></h2>
<p>WebGPU support in PlayCanvas is still considered 'Beta'. There are still some unimplemented features (for example, the run-time lightmapper is still not supported). Therefore, you have to currently 'opt in' to WebGPU support. To do this, open your Project's Settings in the Inspector and expand the <code>RENDERING</code> section. Then update <code>Graphics Devices</code> to include <code>WebGPU (beta)</code>.</p>
<p><img decoding="async" loading="lazy" alt="Editor with WebGPU Scene" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA4wAAAB3CAIAAADHFVmyAAAVvklEQVR42u3d/VMTWb7H8f1ndmur1tq9zGrNZm/iMLpRQUUYREWRy4wwZkSMFGpcZGBWLIhCClhRMhqeJyDEkLGL6qL4626f0+mkO+kOeehACO+q1w8zEpvu5uvpD6fPwx885y8AAAAANeUP3AIAAAAQUgEAAABCKgAAAAipAAAAACEVAAAAhFQAAACAkAoAAABCKgAAAEBIBQAAAAipAAAAIKQCAAAAhFSgVv3N4wUA4AQipAKEVAAACKkACKkAABBSAUIqAACEVACEVAAACKkAIRUAAEIqIRUgpAIAQEgFCKkAABBSCakAIRUAAEIqAEIqAACEVICQCgAAIRUAIRUAAEIqQEgFAICQCoCQCgAAIRUgpAIAQEglpAKEVAAACKkACKkAAEIqIRUgpAIAQEgFQEgFAICQChBSAQAgpAIgpAIA6pj326/OFu1/CakAIRUAgENw7saNR0M9wSI8+un8t4RUgJAKAMCh+Orqve6DQ+rjK83f8LofIKQCAHBovvHefVw4pHbebGJMKkBIBQDgcP3zX+f7HBNqd9+NM/9k4hRASAUA4PB90/6d7eDUB997vczuBwipAAAc1eDU5u/v2AxFPVv5kQmpACEVAIDynWn/yTyJ6kb7v1w5LCEVIKQCAFCJbxt/MIai/t93X7l0WEIqQEgFAKAy3pYrD9wZikpIBQipAAC451yr75ybBySkAoRUAABqDiEVIKQCAEBIBUBIBQCAkAoQUgEAIKQCIKQCAEBIBQipAAAQUgmpACEVAABCKkBIBQCAkEpIBQipAACc5JDqawkEIytrv6vK3r6gqomtlcnnvY1HlAaeLGunkZq8d8DH/KFYYk/9+J+7VT6f3snkfvrOmOwoqaUPc8HvW6r83duCHxRFWQ/dISYSUgEAOEEhtSMQ2Uzs2YQwIRkN3myu2ZAqP7avLI8eSUjN2Pgwev1i9b776IL8LgvDxERCKgAAJyWkdjxZTveeJtbehR71Nl3WO1Y7e57PLejJTFl5cr1GQ2rT8MrO3v7Sq8PpSc05n5am74Mj7xPpfJ+Y66pWTpU/I3VzhJ5UQioAACckpN6aSsmEmpoa7PTZdrK+TSlqYmawszZD6mGxDanGSImuiY+KfPsfDflIcoRUAAAIqZWG1NaXH0VCVT+OdDh/rKXxsul/781tyNfrvptD48uJnd39jUhv5quN37+c2VB29J7FXXVtORLIGSowvCJejkcCVwcjC1uq8Ull6f3LW5ftQ6o8ZmpH1ft0EwtvhppsDthr+S6Xe8X4WsUYObq1Mm6N4L6u0ewx7b57SSFVHPC+vC17ifHczs5m/UrTAwPk+V/NdLheDE6ltD9fD7XmH7P54Qftb6lvnzY7RXbfzf6R95uJXf0y1cRGNJQ/OvZyb+jAz1zsefJ+c0Mp+BkQUgEAhNRDC6mtEwmRS7YircX/LT2kJjeXjAhoBMTmronNHZvxmqnxe7mZMpFI2Xzyd8ugAj2WfYzaHHNt4m6BkCr6NX/PPw11aSLgswRKK2Vz7H5z2SHVyJT7ibl+y2v6RcVmDGviXcC40tY34kew9uau/e8Pu7GHDv3KTY/fran5l6m8fdphis4Ru8+oH8d7spH9YmAyUeh2gZAKAMBhh1R91pEl8xUZUkWm3Jwcupud+9/1ek2E19jIox6/7Cls/K4/JCPaTjSUkylFmPvtXTDQIf76xbbrQ3PpyLv20p8zI0rMSXrZ812Lvv5AaFlmvkTkllNI1SKXHEe7s2Ec/3xLq3Z8LbYqsYdXxEz50JoMYZHQ9ZZmedie3lexDTWvO7a0kHrBN7Iuzm3ztZH4m7sicihFasW4J83+jv7QB/GHOyuj6f7gTnnfUu96cn5/kOE1E3lzQ+r10Y+yczSxONHb1eaTt7FrTFyFshW5ZXxmQZFXOjes30DP5Y5b+q3QDmUkcv9/1uXtmntoHOf6o4m32sUm526RSgmpAAAcRUjtHU+UPmc83ZOaP0mouWvQ9CLbPC3dHHf0ntT3Q7krW92RWc30ulzGsrxxCBf1ee4rTxxCqh65bOYw3envuW6Km9r5544r7S04Pf/gkJq5M7fMXaGpd735N2pGy6nK1IP08lJ6aNZf6xv65TCAnLuR/e49czL9L4825Y466M9cuP6ZpfG8gRx6wDV+H7glkrSWWXMHANzqaiaSElIBAKidkOqw1lImexljUm26EvVRqunBoyk50NM+pNr1WaZfl38caS44cUo/PaeQ2jbym3jlPfWwwFXfHduU8Tcc1HtSK584ZRtS/eOb4sSm7HpnZe9p5ib4nsZ2rL3I+X9ivRvBKdEbujnSWuCE9c+sBO2++jCqint4MTvkY2ftdbpHFgAAwA0Vve4PLua/7i83pKZfLucMM5WTqIoKqUaqM75UVkjN+6rj+v+ZoaippZV3Y0MB/8VKQ2rO6/5b+rv+ArL3MN1vOtbp2LdqvRt50d95aVVnxtFah99mhvCq6sbG+lQ41NVCNyoAADi6kFrUxCl9FOlBIVV2zu0riWiwT++Qa2kKDE/9pii1F1L1VQim1qyTt353eeJUKSHVOn3KGCfQ47ggl6shVV8BYG59Y9cyAYuJUwAA4MhCalFLUBUVUvUMtzlyvagxqUf6uj93Nf7gq7m3m8pBYb3IJaiyH8jJ3Af9ICaWjGCaM2Wqwtf9T0rZX6Dxu97e5xOTH/TtCfKX0wIAADickJpdzF95G7JdzP9C49i66yG1wMQp45V3eSG1mIlT2uJNw4Hc8+yQ6bZAF2zpi/nrvwDYbtZ1+W5r7h9mXvEHc6ZMVThxaiMSyPuxNl+9Y/pZXx8KPs79FaXp1Sa7sAIAgKMMqZZtUX/Lbosqlit69HJyOf3OOvFh2F/wdX/gfQmv+52WoNJSl8NUoWJDamYJKmUrmnt8fQmqDtlnqabevjImTl3u6BlbEX2Hv7/rLS2kFt4WVZ/FLwYSTD3vN202+04sArUVyXlZn54spag5U6bs70ZmCaoVY8JT5ipMS1Dpn9n4YCxTpZ+wWANLS8P6cv2dMp1bPxN4uZAqqUMaAADA/ZAqcmogsplwHLyoLEVMmzyVNHEqZ9JVJlOurNgsMm+3mH/JIfXgxfydNh1QF4Y7DhqT6mjjw6jNClYXO+0X87cuuW+dPpW/HJX93ShmMf/GwJzdZ7RVUV9n8rTv/uslux9cfjctdGe+OXfqzNd/+uv//BGoGVpBamWpFScVCyoE7lbIkYdUvZMvEIzElpJqJrTtJDffRoZzJ3oXuQRVek9UxzGp1g8X2ha11JCqzwQqvC2qZatV7UrzPlBkSN1RUksf5oKFNhHVthIwbwBrt1WsdfpU/sL+ngq2RRU7IGS3PN3XfqYzY725Yy3k1qnZz+Ts3Qpra05Tjlp+zOQ8Y6hYUCGopEJqJaQeEufZ/UDt037R1P4Z/7nh73858/WpM/8AaoRWkFpZ/lH2hVCxoELgVoUQUoFjQ+9yoDVHbT5j9I4QKhZUCNyqEEIqcGzoL0Roy1Cb9PqkYkGFwK0KIaQChFSACAIqBIRUAIRUEEFAhVAhIKQChFSACAIqBIRUAIRU8IChYkGFgJAKEFIBIgioEBBSCakAIRUggoAKASEVQI006I2+lrYLLU2n661lrNfrIoLwk6VCqBBCKoATEVJD83v7ymKo4Zi3g6dvvJj5HB9trd3rahiYX42Fey4RQahYQioVQkglpAJ1G1JFK7w986P9V/ujyb3k6I1SGvRYqIhPes/1jE2tK0nt85ovW/PhoWtnrcexSmqfefXgnMf4zNCi9ofx8O3cI3dOx/f254fK7zi5Gd4S33EnPjnYVvp1Fc/r8fvLfvJdeylPUt2avN908iJIDVbs7fHP+8putM/jxm8gV3549t/49q78Rqq6uvDC9I1Kq7FzP01Hd1RxnFR86mlHAxVSFxUieK72vFqMqxW2S/VQIYRUoL5Dqmw9V8c8RrMVmI+PdhrPy6eryt7iwBl3G3Rv+4SWsZToyx8viEa88UL/dOyL1kouDlyyP07Dtx194bjW+idjIZ8ppNqE0YpCqrc9nNQOu/1r6JynvAdVKTcqe8/L6u7tDoubtqfMD1U1pzZdu2F/fN+N276jiSA1WLHylD5PX6s8od4Nr6r7yfXpvtZG8ZvMnbFoSks8mW9UAt/QYnJPmRlsOy1OeFb7d7E60d1AhRzzCjnl8bc/j4p4qqfhCtql+qgQQipQ56/7B2JaYzp7J/2/wZnd/diIP91jp4W2EhrWohp0z2OtZVRzolXDvdntveT4Xa/zcbx9C6qyp870VyukyhMz5eDqhdSW8VU3DthwJTQvcmoy8wB2/ekyENPuuTIzkPuM8Q1Et+3v1WG8zK29inUvpLaNRden2z25JZ1cCJaWHlpFjcVGsufsG4lXoVSokMOukFM9s/EvW9HIeF/3WLSSZqReKoSQCtR5SBWt9l782Xn5v3fFE1Fr+BoybX0JjWAxDfoPkzv7yvKLvE5Ef3Nb0wHH0V/xT9yuSkj1/ChO7Ivt+zi3Q6o8yfibbhdeDYsH4b4SH79QhZDarA8qECzPGP3pon9p9WXH4UeQ2qtY9yKIU7/g5+n2Uv7WzYii7MzezHtLUHLYpUJqt0IqapfqpkIIqUC9T5wSgU/7jV/894VfZJuijZ2SDevotnXcpxwItfrFGC0XC/dc8eY3mr774flPanos6afo4I3G7GdkqIo+9ZbT+FYzpHqGV5U9S79CaddV1P2RD6q9fDkvHxuvDU7Pf1KSavo48fV5m++V6WCelx3MA95q9KT2zSs5zxjz02V7Pngk/WS1V7G1FlJF36F5UGaDHtSyN4oKqYMKqSSk1k+FEFKBeg+pMtjJRtb/bHU/Ht9K7imT97Qv/TiZMgU+T/foJ62vMT7er41h+sfp1uDkds5oOdloflG3t2eNEXUv5ndk2/Q4/a5NPjCS451lNL7eOzNaY6dM9lTjdb+4cBEWPc7nU/C6irs/lrS9+kub/cmcfxEV42Jf3PQ3yvG43c+WVSX73jD/tV1YDB6w6chx/xkzH1ks++niZgSpuYqtZkj1yJMs6ed7Ixw3xyZPcEYLYdvTfa/EtRQ9Z4gKqfEKqSCk1lGFEFKBeg+pnlBUf/ssHofK5H35v1png/jzdG9E+vVQTlS6FIruml8P6bPy48/MsezSWExMlk+/V2p/k1T2Vgc8JTa+Hn/7z6vVnDg1VHAm08HXVdz9sYTUAifpu3LV8lc8otvD+fTa/h0XCTtQtblTpmdM+U8XNyNIzVVs9UKqV55AiT3lj80Fpg8KlPdBL7zHVEh9VEgFIbWOKoSQCtT9OqndogHVGjuxOIvWmyhDjzbMUQQ+o/F1yEnyXXMmHslGczt8zeYz6QlPYkDYwVNri12CyrWQKvsVnAeJHnxdxd0fY2iBmKBQ0knKjl7n13Cyj/nAvpyKnjGDi6Yfx+ILX1nHcW8VzFqr2GqFVDn/uuTJJeZ/HXI2jBp92lTMb0dUyLGqkApCah1VCCEVqPuQ6h1YFA3ogNYlIJtsOe1gceDpYnYknByxlL8uqfxkJh7ZN5p6JtPHkgZ+3c/pdZBNfJpx/CIaX3dDaqf91RV+GJivq7j7Y/5DI90WP1vZ+UFYxgFLi0qmMWT5cyCOIoLUWsVWJaSmb/u2dbJ/Kf1k+kDDg98/UCHHskJc6EmtgwohpAL1v+OUfGO1tRo3BkqKqQBqdHkr280gGy8HBzTo5oX3bUNb5u8er5Bq2VCgqPtTKLnmrAo+uby1nVILzq86pJBqmeXwWankGePifkI1VrHuRxCtD1Um1Nly9hWT9bz6Kji+LWdceazTiTqpkHqokIpCah1VCCEVqP+QqncMZJsnT/qFe3b6p/zNO7PWYBlhLv2ocDzOkYbU83KQ2a9DVbgup0zp9CTQF4JRY+HgNX9jkT2p8nlcldf9efNwbebqHkkEqbGKdTmCpKdab0/fLHOvKfkiW78/pgGXsk4WBzxUyLGvEFdm99dHhRBSgfoPqfoqKqZRj/psd1PLK9efP2gJPdlo5q3ZaZmVb4wD81UYUvVRpHl9n3I7mTL6FMWcX+dHSBHXVdT9MYdUhyQtQ/b27IMG28UHCi5NEKh6QnVcU+bwI0iNVayrEeSS3KOhrF2mcna+SA80NCbYiZnsrq4CQYUcTYW4EFLrp0IIqcAJCKl6V6Kx3rWxroo57fkHl/NmuYoG2ttQeBa8vriJqXW+NiF6CvM28ywxpOqN/s7sHcsv/U3iOfSlnA2y5UwIp87IYq6rmPtjvrcOXTiyVyZnCpexhKFDSNV/dtVYgkpPSzbzcI1nTIlBys0IUlsV62IEkTVcYMUx0z+B0bjYyyf2822n/YS0Qmqw7Pug3R8vFXLMK6T4kHoiKoSQCpyAkCq7Ei2xSTRYW/9usTY3KX1NwQ6PSIGNvu4XM59FV8Rp66x8Y+dxue7gp/wnrt48KbFwsPlbr1h6sC04vqqUNnHKvMt5m19rZ0/7fxj8VRx2qt9fzh3oEf0uyXnbbpXiruvg+2N5PCif58Wy4R5/++Bs7JOxlJX+/DMWbjx1tu3Oz5llBW1Dqr58bJUW8xcXNRmxXSmmqS8yW2pXn5sRpLYq1r1tUcVsdEt0KDysUBSGw/eVKwOo0Z9vn9ZO+F5Y20o+Hq7CzuxUyOFWSAkh9WRUCCEVOAkhVVuixdp8a4OWdvLWPDp7OxDWdmcxdl75koz998W1s+ZGU0tL/mvP52M7+mfU7eVp6w4uxtygn7I7uCi7anw9Oj7Y7fGU9hqr4cqD0dhWcjezW8x0oK3srKavNmrbg1X0dR1wf0yPh/vT0ZSxutbn+Ex4qDnT+3tJXpRpu6lnPVedxqSmO1mrsy2q61yNIDVVsU57iRWzOFH+Mg5FHifdTxYdbnOcgffTdFS/ri9bM89vn6ZCjn+FlNGTWt8VQkgFTkJIhdbxEI6Xt+LPUbn0QGyQs5cc7TweJ+xqBEEdokJASAUIqSi0drryqexZ1Yen4crQjNieMX8kHBEEhFQQUgmpACG13njbf4mLnJqKj3Y31ux5XhiKxtXyF8QmgoAKASGVkAoQUo9hf+r96VhKmX/sr9kzFItYfY4OtHmJICCkgpBKSAUIqSeJ3dJRnB4RBFQICKkACKkggoAKoUJASAUIqQARBFQICKkACKngAUPFggoBIRU4Ef4k/wH/5czXtGWoNVpZasX5J+sDhooFFYJKKoSQChwbp+S/4T83/J02HbX2dNHKUnaJfU3FggqBWxVCSAWOjTPfnNM7HoAapBWnVqJULKgQuFUhhFTgmOVU7RdNmnXU2qNFK0vbpwsVCyoElVQIIRUAAAB1hZAKAAAAQioAAABASAUAAAAhFQAAACCkAgAAgJAKAAAAEFIBAABASAUAAAAIqQAAAAAhFQAAAIRUAAAAgJAK1Ky/ebwAAJxAZTw0/x8k5f/h9/X6tgAAAABJRU5ErkJggg==" width="908" height="119" class="img_ev3q"></p>
<p>Once we are satisfied WebGPU support has matured enough, it will become the default.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="your-feedback-is-important">Your Feedback is Important<a href="https://blog.playcanvas.com/build-webgpu-apps-today-with-playcanvas#your-feedback-is-important" class="hash-link" aria-label="Direct link to Your Feedback is Important" title="Direct link to Your Feedback is Important" translate="no">​</a></h2>
<p>Since WebGPU support is new, we rely on the community for feedback. What works and what doesn't? Please <a href="https://github.com/playcanvas/editor/issues" target="_blank" rel="noopener noreferrer" class="">submit an issue</a> if you discover any problems or kick off a new thread on the <a href="https://forum.playcanvas.com/" target="_blank" rel="noopener noreferrer" class="">forum</a> if you want to discuss WebGPU support in more detail. We want to hear what your opinions! 👂</p>]]></content:encoded>
            <category>webgpu</category>
            <category>graphics</category>
            <category>editor</category>
        </item>
    </channel>
</rss>