The architecture behind turning English into production-ready WebGL.

You describe a 3D scene. VULK generates the code. You run it. It works.
That flow sounds simple. The engineering behind it is not.
Stage 1: Understand the request
The first model reads your prompt and builds a mental model of what you're describing:
"Create an interactive product showcase. A rotating 3D cube with product images on each face. Click to pause/resume rotation. Mobile-friendly."
The model extracts:
From this, the model generates a detailed architecture plan:
Scene:
- Camera (perspective, positioned to see cube)
- Lighting (key light, fill light, back light)
- Cube geometry with image textures on each face
Interaction:
- Raycaster for mouse/touch input
- Animation state machine (rotating/paused)
- Toggle on click
Performance:
- Texture compression
- Simple geometry (don't overdraw)
- No unnecessary effects
This architecture is not random. It's based on thousands of examples of well-written Three.js code.
Stage 2: Generate the code structure
The second model takes that architecture and generates the full Three.js boilerplate:
import * as THREE from 'three';
import { TextureLoader } from 'three';
export class ProductShowcase {
constructor(container) {
this.scene = new THREE.Scene();
this.camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
this.renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });
this.isRotating = true;
}
setupLighting() {
const keyLight = new THREE.DirectionalLight(0xffffff, 1);
keyLight.position.set(5, 5, 5);
this.scene.add(keyLight);
const fillLight = new THREE.DirectionalLight(0xffffff, 0.5);
fillLight.position.set(-5, 3, 5);
this.scene.add(fillLight);
const backLight = new THREE.DirectionalLight(0xffffff, 0.3);
backLight.position.set(0, 5, -5);
this.scene.add(backLight);
}
setupCube() {
const loader = new TextureLoader();
const materials = [
new THREE.MeshPhongMaterial({ map: loader.load('/faces/front.jpg') }),
new THREE.MeshPhongMaterial({ map: loader.load('/faces/back.jpg') }),
// ... rest of faces
];
const geometry = new THREE.BoxGeometry(2, 2, 2);
this.cube = new THREE.Mesh(geometry, materials);
this.scene.add(this.cube);
}
setupInteraction() {
document.addEventListener('click', (e) => {
this.isRotating = !this.isRotating;
});
}
animate() {
requestAnimationFrame(() => this.animate());
if (this.isRotating) {
this.cube.rotation.x += 0.005;
this.cube.rotation.y += 0.01;
}
this.renderer.render(this.scene, this.camera);
}
}
This is not a template with blanks filled in. This is actual, runnable code.
Notice what the model does correctly:
A junior developer would take 4+ hours to write this. The model generates it in seconds.
Stage 3: Adapt to the platform
The code doesn't just compile in isolation. It needs to fit into a running web application:
53 3D projects in 3 days prove this works at scale. 30% daily growth.. It's a complete, deployable component ready to paste into your project.
Three.js has patterns. Every scene follows the same basic structure:
The model has seen thousands of examples of each pattern. It has learned not just the syntax, but the reasoning. It knows why you use DirectionalLight for key light, why MeshPhongMaterial responds to lighting, why you need the render loop, why you handle window resize events.
This is not pattern matching. This is genuine understanding of 3D graphics concepts expressed in code.
The generated code is correct across:
Geometry:
Materials:
Lighting:
Animation:
Performance:
Mobile:
The generation doesn't stop at code. You can refine it:
"The cube rotates too fast. Slow it down 50%."
The model understands this refers to the rotation speed and adjusts the increment:
if (this.isRotating) {
this.cube.rotation.x += 0.0025; // Changed from 0.005
this.cube.rotation.y += 0.005; // Changed from 0.01
}
"Add a glow effect around the cube."
The model generates a postprocessing pipeline using Three.js's EffectComposer and UnrealBloomPass, adding the necessary imports and setup.
"Make the background a gradient from blue to purple."
The model replaces the flat background color with a canvas gradient applied to a large sphere, or renders to a canvas texture.
Each follow-up is not a template substitution. It's a genuine code modification that understands the context of the scene.
The model cannot:
For most use cases, these are edge cases. For 95% of 3D web projects, the generated code is production-ready.
This is the consolidation of web graphics skills into a single interface. You don't learn Three.js. You learn how to describe a 3D experience in English. The model handles the translation.
The barrier to 3D on the web just collapsed from "months of learning" to "30 seconds of waiting."
Try it at vulk.dev/3d-studio. Prompt any 3D idea and see the code it generates. You'll see that this is not autocomplete. This is genuine 3D generation.
Published by João Castro · 7 min read