<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged webgl</title>
<link>https://coderlegion.com/tag/webgl</link>
<description>Powered by Question2Answer</description>
<item>
<title>WebGPU for Browser Games: What Actually Changes From WebGL</title>
<link>https://coderlegion.com/29267/webgpu-for-browser-games-what-actually-changes-from-webgl</link>
<description>&lt;p&gt;Plenty of us here have shipped something on WebGL, a game, a visualization or a canvas experiment, and WebGPU now ships in Chrome, Edge, Firefox and Safari. Here is a practical look at what actually changes in your code and your frame budget when you move a browser game over.&lt;/p&gt;
&lt;h3 id=&quot;pipelines-instead-of-a-state-machine&quot;&gt;Pipelines Instead of a State Machine&lt;/h3&gt;
&lt;p&gt;WebGL inherited OpenGL's global state machine. You set blend mode, depth test and active texture on a shared context, then every draw call uses whatever state happens to be active, and the browser validates all of it again on each call. In a scene with thousands of objects, that CPU side overhead can cost more than the rendering itself.&lt;/p&gt;
&lt;p&gt;WebGPU moves that work to creation time. A render pipeline object bakes in the shaders, vertex layout, blend state, depth configuration and primitive topology once. At draw time you record commands into a command buffer and submit the whole batch. Benchmarks in this &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.abratabia.com/webgpu/&quot;&gt;guide to WebGPU for browser games&lt;/a&gt; show a scene going from 15,000 objects at 15 FPS under WebGL to 200,000 objects at a locked 60 FPS, with CPU usage falling from saturated to nearly idle.&lt;/p&gt;
&lt;h3 id=&quot;bind-groups-and-explicit-resources&quot;&gt;Bind Groups and Explicit Resources&lt;/h3&gt;
&lt;p&gt;WebGL binds textures and uniforms one call at a time through numbered units and locations. WebGPU groups buffers, textures and samplers into bind groups that attach to a pipeline as a single unit, so switching materials becomes one bind group swap instead of a dozen state changes. Buffer mapping replaces bufferSubData copies, and you decide when the CPU and GPU synchronize instead of the driver guessing for you.&lt;/p&gt;
&lt;h3 id=&quot;wgsl-and-errors-you-can-actually-see&quot;&gt;WGSL and Errors You Can Actually See&lt;/h3&gt;
&lt;p&gt;WGSL replaces GLSL with a stricter, Rust influenced syntax. Every variable has an explicit type, there are no implicit conversions, and resource bindings are declared with @group and @binding attributes that map straight to your bind group layouts. Shaders are validated when the module is created, so a type mismatch or out of bounds access shows up as a readable error instead of a black screen three frames later. WebGL errors, by comparison, stay silent unless you remember to poll getError.&lt;/p&gt;
&lt;h3 id=&quot;compute-shaders-in-a-game-loop&quot;&gt;Compute Shaders in a Game Loop&lt;/h3&gt;
&lt;p&gt;This is the part that changes what a browser game can do. Compute shaders run outside the render pipeline on plain storage buffers, with shared workgroup memory. A particle system can update millions of particles in one dispatch and render them straight from GPU memory with no CPU round trip. Cloth, soft bodies, fluid grids, procedural terrain and post processing effects like bloom and ambient occlusion all fit the same pattern.&lt;/p&gt;
&lt;p&gt;If you are not ready to write raw WebGPU, Babylon.js and Three.js both ship WebGPU renderers that fall back to WebGL automatically, which is the lowest risk way to start. Either way, the practical takeaway is to profile where your frame time goes today. If it is CPU side draw overhead or work you are faking with fragment shaders, WebGPU is worth the move.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/29267/webgpu-for-browser-games-what-actually-changes-from-webgl</guid>
<pubDate>Wed, 30 Sep 2026 15:55:25 +0000</pubDate>
</item>
<item>
<title>Five Things That Break First When Your Web Game Hits a Phone</title>
<link>https://coderlegion.com/28953/five-things-that-break-first-when-your-web-game-hits-a-phone</link>
<description>&lt;p&gt;Plenty of us here build browser games or interactive canvas projects, and the desktop build usually feels finished long before the phone build does. These are the five problems that show up first when the same game meets a real handset, and the fixes that keep one codebase working everywhere.&lt;/p&gt;
&lt;h3 id=&quot;safari-sets-your-limits-not-chrome&quot;&gt;Safari Sets Your Limits, Not Chrome&lt;/h3&gt;
&lt;p&gt;Every browser on iOS, Chrome included, runs on WebKit under Apple's rules, so Safari's behavior is the iOS experience no matter which icon the player taps. It has tighter memory limits than Chrome on Android, limited Fullscreen API support, and it resizes the canvas differently when the address bar collapses. Testing Chrome on Android and Safari on iOS covers over 95 percent of mobile players, and this &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.abratabia.com/mobile-web-games/&quot;&gt;complete guide to building mobile web games&lt;/a&gt; walks through the rest of the browser landscape, the rendering choices and distribution without a store.&lt;/p&gt;
&lt;h3 id=&quot;cap-the-device-pixel-ratio-at-2&quot;&gt;Cap the Device Pixel Ratio at 2&lt;/h3&gt;
&lt;p&gt;A phone with a 3x pixel ratio has nine physical pixels for every CSS pixel. Render at CSS resolution and the game looks blurry, render at full device resolution and the GPU fills far more pixels than anyone can see. Capping the ratio at 2, or rendering at 1.5x, looks sharp and keeps the fill rate sane. Pair it with a fixed reference resolution, such as 1920x1080, and scale the canvas with CSS so your layout math never depends on the screen.&lt;/p&gt;
&lt;h3 id=&quot;unlock-audio-on-the-first-tap&quot;&gt;Unlock Audio on the First Tap&lt;/h3&gt;
&lt;p&gt;Both iOS Safari and Chrome on Android block audio until the player taps something. Create the AudioContext inside that first gesture, usually a tap to start screen, and it stays unlocked for the rest of the session. Decode sound effects into AudioBuffers while loading and use the Web Audio API rather than HTML audio elements, which add latency and behave differently on each browser. AAC in an M4A container is the safe format for older iPhones.&lt;/p&gt;
&lt;h3 id=&quot;fight-garbage-collection-before-it-fights-you&quot;&gt;Fight Garbage Collection Before It Fights You&lt;/h3&gt;
&lt;p&gt;The GPU is rarely the bottleneck on a modern phone. Garbage collection pauses, draw call overhead and memory pressure are. Pool bullets, particles and enemies instead of allocating them every frame, batch sprites into texture atlases, and profile on real hardware early, since desktop DevTools will not show you the stutter a mid range phone does. Pause the loop when the tab is hidden too, because a 60 fps loop drains a battery faster in a browser than the same work in a native app.&lt;/p&gt;
&lt;h3 id=&quot;save-games-somewhere-safari-will-not-evict&quot;&gt;Save Games Somewhere Safari Will Not Evict&lt;/h3&gt;
&lt;p&gt;localStorage handles small JSON saves within a 5 to 10 MB limit, and IndexedDB handles larger or binary state. Both can disappear, because iOS Safari evicts storage for sites the player has not visited recently. If losing progress would upset your players, add a simple cloud save, or at least an export and import button.&lt;/p&gt;
&lt;h3 id=&quot;takeaway&quot;&gt;Takeaway&lt;/h3&gt;
&lt;p&gt;None of these are reasons to skip the mobile web, they are just the first five things to design for. Build against Safari's limits, keep pixel ratio and allocations under control, unlock audio deliberately and back up saves, and one build can reach iOS, Android and desktop without an app store in the middle.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/28953/five-things-that-break-first-when-your-web-game-hits-a-phone</guid>
<pubDate>Mon, 28 Sep 2026 15:43:04 +0000</pubDate>
</item>
<item>
<title>Why PixiJS Is A Renderer And Not A Game Engine</title>
<link>https://coderlegion.com/26261/why-pixijs-is-a-renderer-and-not-a-game-engine</link>
<description>&lt;p&gt;A lot of the web game questions that land on here come down to picking a library before working out what kind of problem you actually have. This one catches people often enough that it is worth writing down for anyone about to start a browser game.&lt;/p&gt;
&lt;p&gt;PixiJS does exactly one job: it draws 2D to a canvas, through WebGL, WebGPU, or Canvas 2D as a fallback, and it does that faster than almost anything else on the web. It manages a scene graph of display objects, sprites, text, graphics primitives and containers in a parent and child hierarchy, and renders that whole tree every frame.&lt;/p&gt;
&lt;p&gt;What it does not ship is everything a framework bundles around a renderer. No physics engine, no scene manager in the game sense, no input abstraction, no audio system, no asset pipeline past texture loading, no editor. Those are not gaps. They are the reason it is fast.&lt;/p&gt;
&lt;h3 id=&quot;the-v8-trap&quot;&gt;The v8 trap&lt;/h3&gt;
&lt;p&gt;v8 was a rewrite rather than a version bump. The renderer was restructured, WebGPU became a first class backend alongside WebGL, and a fair amount of the older API surface moved. The practical effect is that much of the PixiJS material online is now quietly wrong. Guides written against v6 or v7 read correct and then fail in ways that look like your mistake rather than a version mismatch. Check the target version on anything you follow, before you follow it.&lt;/p&gt;
&lt;h3 id=&quot;where-the-performance-actually-goes&quot;&gt;Where the performance actually goes&lt;/h3&gt;
&lt;p&gt;Optimization in Pixi almost always reduces to two things: how many draw calls you are issuing, and whether your textures live in atlases so they can batch. Objects sharing a texture batch into a single call. The library is fast by default and the ways to make it slow are specific and learnable.&lt;/p&gt;
&lt;h3 id=&quot;the-actual-decision&quot;&gt;The actual decision&lt;/h3&gt;
&lt;p&gt;Reach for PixiJS when rendering is the hard part and structure is not. A card game, a board game, a large 2D map, a data heavy interactive. Reach for a full framework like Phaser when you need physics, scenes, input and audio and would rather not assemble them yourself. Phaser used Pixi internally for years, so this is less a rivalry than a question of where you want the boundary between what you are handed and what you build.&lt;/p&gt;
&lt;p&gt;The longer version is in this &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.abratabia.com/pixijs/&quot;&gt;full guide to PixiJS game development&lt;/a&gt;, which covers the v8 architecture, the scene graph, animation and input, filters and shaders, the optimization work, and the comparison against full frameworks.&lt;/p&gt;
&lt;p&gt;If you can describe your game as a rendering problem, use the renderer. If you cannot, use the framework.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26261/why-pixijs-is-a-renderer-and-not-a-game-engine</guid>
<pubDate>Sat, 05 Sep 2026 13:22:38 +0000</pubDate>
</item>
<item>
<title>Shader Budgeting For Web Games: Where Your Frame Time Actually Goes</title>
<link>https://coderlegion.com/25438/shader-budgeting-for-web-games-where-your-frame-time-actually-goes</link>
<description>&lt;p&gt;A lot of the WebGL questions that land here turn out to be performance questions wearing a syntax costume, so this is the profiling angle rather than the GLSL tutorial angle. If you have ever stripped a scene down to fewer triangles and watched the frame rate refuse to move, this is probably why.&lt;/p&gt;
&lt;h3 id=&quot;where-the-frame-time-actually-goes&quot;&gt;Where The Frame Time Actually Goes&lt;/h3&gt;
&lt;p&gt;A 1920x1080 canvas is a little over two million pixels. Every triangle covering a pixel runs the fragment shader for that pixel, and with overdraw, meaning several triangles stacked over the same pixel, the fragment shader can execute tens of millions of times in a single frame. The vertex shader runs once per vertex, which for most web scenes is a few thousand invocations.&lt;/p&gt;
&lt;p&gt;That ratio is the whole story. Cutting geometry shrinks the small number. Cutting per pixel work shrinks the large one.&lt;/p&gt;
&lt;h3 id=&quot;moving-work-up-a-stage&quot;&gt;Moving Work Up A Stage&lt;/h3&gt;
&lt;p&gt;Communication between the two programmable stages only flows one way. The vertex shader writes varyings, the rasterizer interpolates them across the triangle, and the fragment shader reads them as inputs. Anything that interpolates acceptably can be computed per vertex and handed down essentially for free, which is the difference between per vertex Gouraud lighting and per pixel Phong lighting: smoother results at real cost.&lt;/p&gt;
&lt;p&gt;Procedural animation is the other easy win. Grass sway, ocean waves and cloth flutter are vertex displacement driven by sine waves, noise and a time uniform, and that beats rewriting vertex buffers from JavaScript every frame because the GPU does the math in parallel across every vertex at once. The &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.abratabia.com/game-shaders/&quot;&gt;full guide to game shaders and visual effects&lt;/a&gt; walks through the GLSL for both stages if you want the code rather than the summary.&lt;/p&gt;
&lt;h3 id=&quot;branching-costs-more-than-you-expect&quot;&gt;Branching Costs More Than You Expect&lt;/h3&gt;
&lt;p&gt;GPUs execute fragments in groups, called warps or wavefronts depending on the vendor. If any fragment in a group takes a different branch, every fragment in that group executes both sides. So the if/else you wrote to skip expensive work often costs about the same as running it unconditionally. step(), mix() and clamp() usually beat the branch, and this is the single most common surprise for people coming from CPU code.&lt;/p&gt;
&lt;p&gt;Draw calls matter for a related reason. Each one can force a shader program switch, texture rebinds and uniform updates, so a pile of unique ShaderMaterial instances quietly defeats the automatic batching that Three.js and Babylon.js do for you.&lt;/p&gt;
&lt;h3 id=&quot;one-shader-source-for-webgl-and-webgpu&quot;&gt;One Shader Source For WebGL And WebGPU&lt;/h3&gt;
&lt;p&gt;Three.js now ships TSL, a JavaScript node graph that compiles to GLSL for the WebGL backend and WGSL for WebGPU from a single source, so you are not maintaining two shader codebases while WebGPU support fills in across browsers. Classic ShaderMaterial still works if you would rather write GLSL by hand or you are porting existing code. Babylon.js goes the parallel route with its own node material system plus a built in inspector.&lt;/p&gt;
&lt;h3 id=&quot;takeaway-1&quot;&gt;Takeaway&lt;/h3&gt;
&lt;p&gt;Profile first. Spector.js captures the WebGL calls and lets you inspect the shader program, textures and GPU state per draw call, and the Babylon.js inspector reports draw call counts and frame stats directly. Once you can see which stage is eating the frame, the fix is usually obvious, and it is usually not fewer triangles.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25438/shader-budgeting-for-web-games-where-your-frame-time-actually-goes</guid>
<pubDate>Wed, 26 Aug 2026 11:52:22 +0000</pubDate>
</item>
<item>
<title>The Load Time Budget That Decides Whether Anyone Plays Your Web Game</title>
<link>https://coderlegion.com/25321/the-load-time-budget-that-decides-whether-anyone-plays-your-web-game</link>
<description>&lt;p&gt;Most of us here ship to a browser tab, and a browser tab is the least forgiving delivery target there is. This is the performance model I keep coming back to when a web game is technically finished and still losing players before the first frame.&lt;/p&gt;
&lt;h3 id=&quot;why-load-time-is-the-whole-game&quot;&gt;Why Load Time Is The Whole Game&lt;/h3&gt;
&lt;p&gt;A web game that takes eight seconds to load has lost most of its audience before a single frame renders. Unlike a native game, where the player already committed to a download and an install, a browser game competes with the back button. That is not a marketing problem, it is an architectural constraint, and it shapes decisions from the first line of code.&lt;/p&gt;
&lt;p&gt;The browser also adds constraints native platforms do not share. JavaScript runs on a single main thread. GPU access is mediated through WebGL or WebGPU rather than direct hardware APIs. Assets have to travel over HTTP before they can be decoded. The garbage collector can pause the game loop without warning. None of these are weaknesses of the platform, they are design parameters.&lt;/p&gt;
&lt;h3 id=&quot;tier-the-assets-instead-of-compressing-harder&quot;&gt;Tier The Assets Instead Of Compressing Harder&lt;/h3&gt;
&lt;p&gt;The load pipeline has stages, and each one is a separate optimisation target. DNS, TCP and TLS are largely fixed by your hosting, though a CDN with edge locations near your players shaves tens of milliseconds. Minifying and compressing HTML, CSS and JS with gzip or Brotli cuts transfer size by 60 to 80 percent. Code splitting lets you defer non-critical modules so the shell appears quickly. Then the engine initialises and starts pulling textures, audio, meshes and level data, and that last stage is where most of the room is.&lt;/p&gt;
&lt;p&gt;The strategy that works there is tiering, not squeezing harder. Tier one is everything needed to render the first interactive frame: the loading screen itself, UI fonts, a low resolution background, and the core loop code. Tier two is the current level or scene. Tier three is everything else, loaded on demand as the player progresses. Done that way a player sees interactive content in one to two seconds even when the total asset budget is 50 MB.&lt;/p&gt;
&lt;h3 id=&quot;many-small-files-are-cheaper-than-they-used-to-be&quot;&gt;Many Small Files Are Cheaper Than They Used To Be&lt;/h3&gt;
&lt;p&gt;HTTP/2 and HTTP/3 multiplexing removed the head-of-line blocking that made many small requests expensive under HTTP/1.1, so splitting assets costs less than it once did. Bundling into atlases and spritesheets still wins, because it cuts total request overhead and decoding passes. The target is a small number of well organised bundles, rather than thousands of individual files or one monolithic download.&lt;/p&gt;
&lt;h3 id=&quot;every-optimisation-compounds&quot;&gt;Every Optimisation Compounds&lt;/h3&gt;
&lt;p&gt;A smaller texture atlas loads faster, decodes faster, uses less GPU memory and draws faster. That is the reason performance work is so rarely wasted, and the reason it belongs at the start rather than in a polish pass before launch. The full guide to &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.abratabia.com/web-game-performance/&quot;&gt;web game performance optimization&lt;/a&gt; covers the rest of the picture, the asset pipeline, rendering and frame rate, memory and garbage collection, the game loop, and the profiling tools that tell you which of them is actually costing you.&lt;/p&gt;
&lt;p&gt;If you take one number away from this, make it time to first interactive frame, measured separately from total load. It is the only load metric a player experiences directly, and it is the one that decides whether they stay.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25321/the-load-time-budget-that-decides-whether-anyone-plays-your-web-game</guid>
<pubDate>Tue, 25 Aug 2026 02:00:38 +0000</pubDate>
</item>
<item>
<title>How I Brought My Illustrations to Life with PixiJS: Parallax, Particles, and Sound in the Browser</title>
<link>https://coderlegion.com/25133/how-brought-my-illustrations-to-life-with-pixijs-parallax-particles-and-sound-the-browser</link>
<description>&lt;h2 id=&quot;how-i-brought-my-illustrations-to-life-with-pixijs-parallax-particles-and-sound-in-the-browser&quot;&gt;How I Brought My Illustrations to Life with PixiJS: Parallax, Particles, and Sound in the Browser&lt;/h2&gt;
&lt;p&gt;I'm a book illustrator by trade. In 2012 I drew a piece called &lt;em&gt;After Picasso&lt;/em&gt; — and at some point I realized a static image wasn't the end of the story for me. A side experiment with WebGL grew into a series I call &lt;strong&gt;Living Illustrations&lt;/strong&gt;: finished illustrations, reopened — this time with depth, wind, and time inside them.&lt;/p&gt;
&lt;h3 id=&quot;what-is-a-living-illustration-&quot;&gt;What is a &quot;living illustration&quot;?&lt;/h3&gt;
&lt;p&gt;Not a video, not a GIF. It's an interactive scene that responds to the visitor:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mouse movement (or touch) drives the parallax&lt;/li&gt;
&lt;li&gt;The scene has &quot;sleep&quot; and &quot;awake&quot; states&lt;/li&gt;
&lt;li&gt;Audio only starts on a user gesture — which conveniently sidesteps browser autoplay policies&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;anatomy-of-a-scene-dissecting-after-picasso-&quot;&gt;Anatomy of a scene: dissecting &quot;After Picasso&quot;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Layers.&lt;/strong&gt; The illustration is cut into 6 PNG layers — background, midground, shadow, body, hand, foreground — each with its own &lt;code&gt;zIndex&lt;/code&gt; and parallax coefficient, from &lt;code&gt;0.02&lt;/code&gt; (background) to &lt;code&gt;0.12&lt;/code&gt; (foreground). The closer the layer, the harder it reacts to the cursor. That coefficient gradient is what sells the depth.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Breathing.&lt;/strong&gt; The body and hand layers slowly scale and shift on a sine curve, so the character appears to breathe. Cheap to compute, surprisingly effective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The bird.&lt;/strong&gt; Three flight frames, orbiting a point at &lt;code&gt;(750, 420)&lt;/code&gt; with a ~500 px radius.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Particles.&lt;/strong&gt; Up to 150 dust particles, color-locked to whichever zone of the artwork they rise from.&lt;/p&gt;
&lt;h3 id=&quot;twelve-years-later-pilot-2024-&quot;&gt;Twelve years later: &quot;Pilot&quot; (2024)&lt;/h3&gt;
&lt;p&gt;Same idea, different league:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The campfire is a sprite sheet (8×4 frames) driven by a full state machine: &lt;code&gt;sleep → invite → awake → active → peak → fade&lt;/code&gt;, with spark bursts in the active phase&lt;/li&gt;
&lt;li&gt;8 parallax layers, including two moons at different depths&lt;/li&gt;
&lt;li&gt;A soundscape: campfire, dusk in the woods, wind&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;The stack&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PixiJS (WebGL)&lt;/strong&gt; for rendering — with a static-image fallback when WebGL isn't available&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vite&lt;/strong&gt; for the build (hashed assets)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Howler / Tone.js&lt;/strong&gt; for audio&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A custom shader&lt;/strong&gt; with subtle noise (&lt;code&gt;uNoiseIntensity: 0.01&lt;/code&gt;) and chromatic aberration, so the scene feels alive even when nothing is moving&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;what-this-taught-me-as-an-artist&quot;&gt;What this taught me as an artist&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Draw in layers from day one.&lt;/strong&gt; If you might animate an illustration later, separate it into planes while drawing, not after.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance is part of the composition.&lt;/strong&gt; 150 particles isn't arbitrary — it's a budget.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Side projects with no deadlines are the best way to learn a new tool.&lt;/strong&gt; This whole series started as an experiment that refused to stay small.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Fun fact: the section is deliberately hidden from search engines (&lt;code&gt;noindex&lt;/code&gt;) and removed from my site's navigation — a private lab I've decided to open up a little.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Try the scenes yourself:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://vimark.art/living-illustrations.html&quot;&gt;vimark.art/living-illustrations&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/25133/how-brought-my-illustrations-to-life-with-pixijs-parallax-particles-and-sound-the-browser</guid>
<pubDate>Sat, 22 Aug 2026 10:55:09 +0000</pubDate>
</item>
<item>
<title>Pipeline Visualisasi 3D Arsitektur: Dari SketchUp/Revit ke Web Preview Interaktif (Three.js)</title>
<link>https://coderlegion.com/12132/pipeline-visualisasi-3d-arsitektur-dari-sketchup-revit-ke-web-preview-interaktif-three</link>
<description>&lt;p&gt;Kalau Anda pernah mengalami “render sudah bagus, tapi pas eksekusi kok beda?”, Anda tidak sendirian. Kesenjangan biasanya terjadi di fase review—ketika keputusan dibuat dari gambar statis, lalu realita lapangan bergerak cepat. Kabar baiknya, ekosistem web 3D sekarang makin matang: update dan rilis &lt;em&gt;engine&lt;/em&gt; seperti &lt;strong&gt;Three.js&lt;/strong&gt; terus melaju (lihat catatan rilis di &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/mrdoob/three.js/releases&quot;&gt;rilis Three.js&lt;/a&gt;). Dengan pipeline yang tepat, kita bisa bawa model arsitektur ke browser untuk &lt;em&gt;preview&lt;/em&gt; real-time—dan menutup paragraf pertama ini dengan satu tujuan: &lt;strong&gt;visualisasi 3d arsitektur interaktif&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Secara ilmiah, pendekatan visual/immersive terbukti membantu pemahaman ruang dan proses belajar/komunikasi visual—terutama ketika objeknya kompleks dan butuh &lt;em&gt;spatial reasoning&lt;/em&gt;. Salah satu referensi yang relevan adalah kajian tentang pemanfaatan visualisasi/teknologi imersif untuk meningkatkan pemahaman dan pengalaman pengguna (lihat &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ejournal.warmadewa.ac.id/index.php/jipe/article/download/9479/5614&quot;&gt;landasan riset visualisasi imersif&lt;/a&gt;). Tema ini penting untuk pembaca CoderLegion karena 3D di web bukan cuma “keren-kerenan”—ini sudah jadi &lt;em&gt;workflow enabler&lt;/em&gt; untuk kolaborasi lintas tim (desainer, engineer, PM, klien) dan bisa di-&lt;em&gt;productize&lt;/em&gt; jadi fitur nyata.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;“Ketika review ruang berubah dari &lt;em&gt;slide&lt;/em&gt; menjadi &lt;em&gt;scene&lt;/em&gt;, revisi tidak lagi ‘adu pendapat’—melainkan ‘cek konteks’.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-masalah-nyata-kenapa-render-sering-tidak-cukup-&quot;&gt;1) Masalah Nyata: Kenapa Render Sering Tidak Cukup?&lt;/h3&gt;
&lt;p&gt;Di proyek arsitektur/interior, render statis itu seperti &lt;em&gt;screenshot&lt;/em&gt; dari sebuah pengalaman. Bagus untuk estetika, tapi sering kurang untuk keputusan teknis: jarak sirkulasi, &lt;em&gt;clearance&lt;/em&gt; pintu, ketinggian meja, pantulan cahaya, sampai &lt;em&gt;placement&lt;/em&gt; signage.&lt;/p&gt;
&lt;h4 id=&quot;apa-yang-biasanya-bikin-revisi-meledak-&quot;&gt;Apa yang biasanya bikin revisi “meledak”?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ambiguitas skala&lt;/strong&gt;: “kayaknya muat” vs “beneran muat”.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ganti material dadakan&lt;/strong&gt;: visual berubah, biaya berubah, timeline ikut goyang.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Detail joinery &amp;amp; MEP&lt;/strong&gt;: sering baru ketemu masalah saat &lt;em&gt;site&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stakeholder banyak&lt;/strong&gt;: approval berlapis = &lt;em&gt;context loss&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Solusi yang makin populer:&lt;/strong&gt; jadikan review sebagai &lt;em&gt;interactive session&lt;/em&gt;—bukan presentasi satu arah. Dengan begitu, keputusan jadi lebih “terukur” dan jejak revisi lebih rapi.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;2-gambaran-besar-pipeline-dari-dcc-ke-browser&quot;&gt;2) Gambaran Besar Pipeline: Dari DCC ke Browser&lt;/h3&gt;
&lt;p&gt;Kuncinya bukan sekadar “export lalu tampilkan”. Pipeline yang &lt;em&gt;waras&lt;/em&gt; harus memikirkan: format, optimasi, &lt;em&gt;versioning&lt;/em&gt;, kolaborasi, dan &lt;em&gt;feedback loop&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id=&quot;tabel-ringkas-pipeline-yang-praktis&quot;&gt;Tabel Ringkas Pipeline yang Praktis&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Tahap                      &lt;/th&gt;&lt;th&gt;Output Ideal                     &lt;/th&gt;&lt;th&gt;Tools Umum              &lt;/th&gt;&lt;th&gt;Tujuan              &lt;/th&gt;&lt;th&gt;Risiko Jika Dilewati&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Authoring (SketchUp/Revit) &lt;/td&gt;&lt;td&gt;Model bersih + layer/tag rapi    &lt;/td&gt;&lt;td&gt;SketchUp, Revit         &lt;/td&gt;&lt;td&gt;&lt;em&gt;Source of truth&lt;/em&gt;   &lt;/td&gt;&lt;td&gt;Model berat, naming kacau&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Export                     &lt;/td&gt;&lt;td&gt;glTF/GLB (utama), FBX (opsional) &lt;/td&gt;&lt;td&gt;Exporter/add-in         &lt;/td&gt;&lt;td&gt;Format web-friendly &lt;/td&gt;&lt;td&gt;Material/UV berantakan&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Optimasi                   &lt;/td&gt;&lt;td&gt;GLB terkompresi + LOD            &lt;/td&gt;&lt;td&gt;Blender, gltf-transform &lt;/td&gt;&lt;td&gt;Loading cepat       &lt;/td&gt;&lt;td&gt;Preview lambat, user kabur&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Web Viewer                 &lt;/td&gt;&lt;td&gt;Scene interaktif                 &lt;/td&gt;&lt;td&gt;Three.js                &lt;/td&gt;&lt;td&gt;Review real-time    &lt;/td&gt;&lt;td&gt;Review tetap “statis”&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Kolaborasi                 &lt;/td&gt;&lt;td&gt;Comment/issue per versi          &lt;/td&gt;&lt;td&gt;Git, Notion/Jira        &lt;/td&gt;&lt;td&gt;Jejak keputusan     &lt;/td&gt;&lt;td&gt;Revisi ulang-ulang&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;&lt;p&gt;Targetnya: &lt;em&gt;review&lt;/em&gt; yang cepat, stabil, bisa dibuka dari HP/laptop, dan punya &lt;strong&gt;audit trail&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-format-amp-optimasi-gltf-glb-adalah-mvp&quot;&gt;3) Format &amp;amp; Optimasi: glTF/GLB adalah MVP&lt;/h3&gt;
&lt;p&gt;Sebelum bahas Three.js, kita rapikan “bahan baku”. Di web, &lt;strong&gt;glTF/GLB&lt;/strong&gt; adalah format yang paling sering jadi pilihan karena ringan dan didesain untuk &lt;em&gt;runtime delivery&lt;/em&gt;.&lt;/p&gt;
&lt;h4 id=&quot;kenapa-gltf-glb-&quot;&gt;Kenapa glTF/GLB?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PBR-ready&lt;/strong&gt; (material modern)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Efisien untuk streaming&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ekosistem tool lengkap (konversi, kompresi, validasi)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;checklist-optimasi-yang-paling-kerasa-impact-nya-&quot;&gt;Checklist Optimasi (yang paling kerasa impact-nya)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Polygon budget&lt;/strong&gt;: bikin batas per kategori objek (furniture vs struktur).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Texture discipline&lt;/strong&gt;: batasi resolusi, konsisten (mis. 1K/2K), pakai atlas jika perlu.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kompresi&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Geometry: Draco / meshopt&lt;/li&gt;
&lt;li&gt;Texture: KTX2 (Basis Universal)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LOD&lt;/strong&gt;: untuk objek repetitif atau jauh.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kalau Anda mengejar pengalaman &lt;strong&gt;visualisasi 3d arsitektur interaktif&lt;/strong&gt; yang mulus, optimasi ini bukan opsional—ini syarat masuk.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;4-web-preview-interaktif-dengan-three-js&quot;&gt;4) Web Preview Interaktif dengan Three.js&lt;/h3&gt;
&lt;p&gt;Sekarang masuk ke bagian yang disukai developer: kita bikin viewer yang “cukup interaktif” untuk review arsitektur.&lt;/p&gt;
&lt;h4 id=&quot;fitur-minimum-yang-sebaiknya-ada&quot;&gt;Fitur minimum yang sebaiknya ada&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Orbit/first-person control (bergantung use case)&lt;/li&gt;
&lt;li&gt;Toggle layer (struktur, furniture, MEP, lighting)&lt;/li&gt;
&lt;li&gt;Hotspot + catatan (issue/comment)&lt;/li&gt;
&lt;li&gt;Ukur jarak sederhana (measure tool)&lt;/li&gt;
&lt;li&gt;Screenshot/share link per versi&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;contoh-loader-glb-three-js-&quot;&gt;Contoh loader GLB (Three.js)&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-js&quot;&gt;import * as THREE from &quot;three&quot;;
import { OrbitControls } from &quot;three/examples/jsm/controls/OrbitControls.js&quot;;
import { GLTFLoader } from &quot;three/examples/jsm/loaders/GLTFLoader.js&quot;;

const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

const scene = new THREE.Scene();
scene.background = new THREE.Color(0xf5f5f5);

const camera = new THREE.PerspectiveCamera(55, window.innerWidth / window.innerHeight, 0.1, 500);
camera.position.set(3, 2, 5);

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true;

scene.add(new THREE.HemisphereLight(0xffffff, 0x444444, 1.0));
const dir = new THREE.DirectionalLight(0xffffff, 1.0);
dir.position.set(5, 10, 5);
scene.add(dir);

const loader = new GLTFLoader();
loader.load(&quot;/models/project.glb&quot;, (gltf) =&amp;gt; {
  const model = gltf.scene;
  model.traverse((obj) =&amp;gt; {
    if (obj.isMesh) {
      obj.castShadow = true;
      obj.receiveShadow = true;
    }
  });
  scene.add(model);
});

function animate() {
  requestAnimationFrame(animate);
  controls.update();
  renderer.render(scene, camera);
}
animate();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Yang menarik: viewer seperti ini bisa jadi “alat komunikasi” yang mengurangi debat subjektif. Hasilnya, keputusan material/layout lebih cepat, dan revisi lapangan lebih sedikit—itulah payoff dari &lt;strong&gt;visualisasi 3d arsitektur interaktif&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;5-review-kolaboratif-dari-komentar-chat-ke-audit-trail&quot;&gt;5) Review Kolaboratif: Dari “Komentar Chat” ke Audit Trail&lt;/h3&gt;
&lt;p&gt;Viewer 3D tanpa sistem review akan kembali jadi presentasi. Yang kita butuhkan adalah &lt;em&gt;loop&lt;/em&gt; yang bisa diulang, diukur, dan dilacak.&lt;/p&gt;
&lt;h4 id=&quot;paragraf-pembuka&quot;&gt;Paragraf pembuka&lt;/h4&gt;
&lt;p&gt;Bayangkan tiap feedback bisa “menempel” pada posisi ruang, bukan hanya di chat. Inilah cara paling cepat mengurangi miskomunikasi antara tim desain, workshop, dan pelaksana.&lt;/p&gt;
&lt;h4 id=&quot;pola-kolaborasi-yang-efektif-ringkas-&quot;&gt;Pola kolaborasi yang efektif (ringkas)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versi model = versi keputusan&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v0.8-concept&lt;/code&gt;, &lt;code&gt;v1.0-design-freeze&lt;/code&gt;, &lt;code&gt;v1.2-value-engineering&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Issue berbasis lokasi&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hotspot → komentar → status (open/in progress/done)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Rule of engagement&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1 issue = 1 keputusan (hindari “komentar campur aduk”)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;internal-link-yang-relevan-untuk-gaya-coderlegion&quot;&gt;Internal link yang relevan untuk gaya CoderLegion&lt;/h4&gt;
&lt;p&gt;Kalau Anda ingin menambahkan &lt;em&gt;structured data&lt;/em&gt; untuk membuat artikel/halaman viewer lebih mudah dipahami mesin pencari (dan &lt;em&gt;AI crawler&lt;/em&gt;), bacaan internal CoderLegion yang nyambung adalah &lt;a rel=&quot;nofollow&quot; href=&quot;https://coderlegion.com/7334/technical-seo-setup-that-makes-your-website-visible-to-chatgpt&quot;&gt;Technical SEO Setup yang Membuat Website Terlihat oleh ChatGPT&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;6-blueprint-implementasi-howto-praktik-yang-bisa-anda-tiru&quot;&gt;6) Blueprint Implementasi (HowTo) — Praktik yang Bisa Anda Tiru&lt;/h3&gt;
&lt;p&gt;Paragraf pembuka: di bawah ini bukan teori “ideal”. Ini blueprint yang sering dipakai saat tim butuh hasil cepat tapi tetap rapi.&lt;/p&gt;
&lt;h4 id=&quot;step-by-step&quot;&gt;Step-by-step&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Rapikan model sumber&lt;/strong&gt; (tag/layer, naming, pivot)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export ke GLB&lt;/strong&gt; (atau FBX lalu konversi ke GLB)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Optimasi&lt;/strong&gt; (compress + texture discipline)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deploy viewer&lt;/strong&gt; (Three.js + hosting)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tambahkan review layer&lt;/strong&gt; (hotspot, comment, versioning)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Buat SOP handoff&lt;/strong&gt; (design freeze → shop drawing → build)&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;quick-wins-yang-sering-dilupakan-&quot;&gt;Quick wins (yang sering dilupakan)&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Batasi &lt;em&gt;texture set&lt;/em&gt; per material (jangan “beda-beda dikit jadi file baru”).&lt;/li&gt;
&lt;li&gt;Samakan skala unit dari awal (mm/m) agar measure tool akurat.&lt;/li&gt;
&lt;li&gt;Simpan &lt;em&gt;changelog&lt;/em&gt; tiap versi model.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan ritme ini, &lt;strong&gt;visualisasi 3d arsitektur interaktif&lt;/strong&gt; bukan proyek “sampingan”, tapi bagian dari pipeline yang menghasilkan keputusan lebih cepat.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;7-faq&quot;&gt;7) FAQ&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Q: Kenapa tidak pakai render video saja?&lt;/strong&gt;&lt;br&gt;
A: Video membantu, tapi tetap &lt;em&gt;linear&lt;/em&gt;. Viewer interaktif memungkinkan stakeholder mengecek sudut/ruang yang mereka pedulikan, kapan saja.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Model saya berat. Harus bagaimana?&lt;/strong&gt;&lt;br&gt;
A: Mulai dari optimasi terbesar: kurangi poly, batasi texture, kompres geometry/texture, dan buat LOD untuk objek repetitif.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Apakah ini hanya untuk tim besar?&lt;/strong&gt;&lt;br&gt;
A: Tidak. Untuk studio kecil, viewer 3D justru menghemat waktu revisi dan menurunkan “biaya komunikasi”.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Bisa dipakai di HP?&lt;/strong&gt;&lt;br&gt;
A: Bisa, kalau Anda disiplin di optimasi GLB dan desain UI (minim panel, tombol besar, loading progres jelas).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Bagaimana cara mengukur dampaknya?&lt;/strong&gt;&lt;br&gt;
A: Track metrik sederhana: jumlah revisi per fase, durasi approval, dan &lt;em&gt;rework&lt;/em&gt; di site. Biasanya penurunan terlihat setelah 2–3 proyek.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;8-resources-tambahan-ringkas-&quot;&gt;8) Resources Tambahan (Ringkas)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Lihat update ekosistem Three.js langsung dari &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/mrdoob/three.js/releases&quot;&gt;rilis Three.js&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Landasan ilmiah untuk konteks visualisasi/teknologi imersif: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.ejournal.warmadewa.ac.id/index.php/jipe/article/download/9479/5614&quot;&gt;landasan riset visualisasi imersif&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;ruang-lebih-cepat-dipahami-keputusan-lebih-cepat-diambil&quot;&gt;Ruang Lebih Cepat Dipahami, Keputusan Lebih Cepat Diambil&lt;/h3&gt;
&lt;p&gt;Sebagai penutup, ada kutipan yang relevan dari &lt;strong&gt;Jaron Lanier&lt;/strong&gt;—tokoh modern yang dikenal sebagai salah satu pelopor virtual reality (VR) dan banyak membahas bagaimana teknologi visual memengaruhi persepsi manusia. Lanier pernah menjelaskan bahwa ilusi “kehadiran” tercipta ketika visual benar-benar merespons gerak pengguna; esensinya: pengalaman 3D itu bukan gambar, melainkan &lt;em&gt;respons&lt;/em&gt;. Anda bisa mengenal beliau lewat &lt;a rel=&quot;nofollow&quot; href=&quot;https://en.wikipedia.org/wiki/Jaron_Lanier&quot;&gt;profil Jaron Lanier di Wikipedia&lt;/a&gt;. Artinya dalam konteks arsitektur: semakin cepat stakeholder “merasakan ruang” melalui interaksi, semakin cepat pula keputusan yang benar dibuat—dan makin kecil peluang revisi berulang.&lt;/p&gt;
&lt;p&gt;Jika tim Anda sedang membangun workflow &lt;strong&gt;visualisasi 3d arsitektur interaktif&lt;/strong&gt; untuk mengurangi revisi dan mempercepat approval, kami di Ide Ruang terbiasa mengerjakan pipeline dari desain–3D–hingga build/turnkey. Untuk melihat konteks layanan dan portofolio, Anda bisa mengunjungi &lt;a rel=&quot;nofollow&quot; href=&quot;https://ide-ruang.com/&quot;&gt;Ide Ruang — design–build end-to-end&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;@context&quot;: &quot;https://schema.org&quot;,
  &quot;@graph&quot;: [
    {
      &quot;@type&quot;: &quot;TechArticle&quot;,
      &quot;headline&quot;: &quot;Pipeline Visualisasi 3D Arsitektur: Dari SketchUp/Revit ke Web Preview Interaktif (Three.js)&quot;,
      &quot;description&quot;: &quot;Panduan praktis membangun pipeline visualisasi 3D arsitektur dari SketchUp/Revit ke web preview interaktif dengan Three.js, plus pola review kolaboratif untuk meminimalkan revisi.&quot;,
      &quot;inLanguage&quot;: &quot;id-ID&quot;,
      &quot;keywords&quot;: [
        &quot;visualisasi 3d arsitektur interaktif&quot;,
        &quot;three.js&quot;,
        &quot;gltf&quot;,
        &quot;webgl&quot;,
        &quot;arsitektur&quot;,
        &quot;desain interior&quot;
      ],
      &quot;author&quot;: {
        &quot;@type&quot;: &quot;Organization&quot;,
        &quot;name&quot;: &quot;Ide Ruang&quot;,
        &quot;url&quot;: &quot;https://ide-ruang.com/&quot;
      },
      &quot;publisher&quot;: {
        &quot;@type&quot;: &quot;Organization&quot;,
        &quot;name&quot;: &quot;Ide Ruang&quot;,
        &quot;url&quot;: &quot;https://ide-ruang.com/&quot;
      },
      &quot;mainEntityOfPage&quot;: {
        &quot;@type&quot;: &quot;WebPage&quot;,
        &quot;@id&quot;: &quot;https://coderlegion.com/&quot;
      },
      &quot;about&quot;: [
        {
          &quot;@type&quot;: &quot;Thing&quot;,
          &quot;name&quot;: &quot;Three.js&quot;
        },
        {
          &quot;@type&quot;: &quot;Thing&quot;,
          &quot;name&quot;: &quot;glTF&quot;
        },
        {
          &quot;@type&quot;: &quot;Thing&quot;,
          &quot;name&quot;: &quot;Arsitektur&quot;
        }
      ],
      &quot;isPartOf&quot;: {
        &quot;@type&quot;: &quot;WebSite&quot;,
        &quot;name&quot;: &quot;CoderLegion&quot;,
        &quot;url&quot;: &quot;https://coderlegion.com/&quot;
      }
    },
    {
      &quot;@type&quot;: &quot;HowTo&quot;,
      &quot;name&quot;: &quot;Blueprint Pipeline: SketchUp/Revit ke Web Viewer Three.js&quot;,
      &quot;description&quot;: &quot;Langkah implementasi pipeline visualisasi 3D ke web preview interaktif untuk review kolaboratif.&quot;,
      &quot;inLanguage&quot;: &quot;id-ID&quot;,
      &quot;totalTime&quot;: &quot;PT6H&quot;,
      &quot;step&quot;: [
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;Rapikan model sumber&quot;,
          &quot;text&quot;: &quot;Bereskan tag/layer, naming, pivot, dan skala unit di SketchUp/Revit agar konsisten.&quot;
        },
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;Export ke GLB&quot;,
          &quot;text&quot;: &quot;Export ke GLB (atau FBX lalu konversi) dengan material dan UV yang valid.&quot;
        },
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;Optimasi &amp;amp; kompresi&quot;,
          &quot;text&quot;: &quot;Kurangi poly, disiplin texture, aktifkan kompresi geometry/texture dan siapkan LOD bila perlu.&quot;
        },
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;Deploy web viewer&quot;,
          &quot;text&quot;: &quot;Bangun viewer Three.js (loader GLB, lighting, controls) dan host agar mudah diakses stakeholder.&quot;
        },
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;Tambah review kolaboratif&quot;,
          &quot;text&quot;: &quot;Implement hotspot, komentar per lokasi, status issue, dan versioning untuk audit trail.&quot;
        },
        {
          &quot;@type&quot;: &quot;HowToStep&quot;,
          &quot;name&quot;: &quot;SOP handoff ke build&quot;,
          &quot;text&quot;: &quot;Tetapkan design freeze, sinkron ke shop drawing, lalu jalankan QA/QC agar minim revisi lapangan.&quot;
        }
      ]
    },
    {
      &quot;@type&quot;: &quot;FAQPage&quot;,
      &quot;mainEntity&quot;: [
        {
          &quot;@type&quot;: &quot;Question&quot;,
          &quot;name&quot;: &quot;Kenapa tidak pakai render video saja?&quot;,
          &quot;acceptedAnswer&quot;: {
            &quot;@type&quot;: &quot;Answer&quot;,
            &quot;text&quot;: &quot;Video membantu, tapi tetap linear. Viewer interaktif memungkinkan stakeholder mengecek sudut/ruang yang mereka pedulikan kapan saja.&quot;
          }
        },
        {
          &quot;@type&quot;: &quot;Question&quot;,
          &quot;name&quot;: &quot;Model berat, harus bagaimana?&quot;,
          &quot;acceptedAnswer&quot;: {
            &quot;@type&quot;: &quot;Answer&quot;,
            &quot;text&quot;: &quot;Fokus pada optimasi berdampak besar: kurangi poly, batasi resolusi texture, kompres geometry/texture, dan gunakan LOD untuk objek repetitif.&quot;
          }
        },
        {
          &quot;@type&quot;: &quot;Question&quot;,
          &quot;name&quot;: &quot;Apakah bisa dipakai di HP?&quot;,
          &quot;acceptedAnswer&quot;: {
            &quot;@type&quot;: &quot;Answer&quot;,
            &quot;text&quot;: &quot;Bisa, asalkan GLB dioptimasi dan UI viewer dirancang mobile-first (loading jelas, kontrol sederhana, tombol besar).&quot;
          }
        }
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/12132/pipeline-visualisasi-3d-arsitektur-dari-sketchup-revit-ke-web-preview-interaktif-three</guid>
<pubDate>Wed, 04 Mar 2026 17:00:00 +0000</pubDate>
</item>
</channel>
</rss>