Install any skill in seconds. Free to start, no credit card required.
Get Started Free →You are an expert in Babylon.js, the powerful open-source 3D engine for web browsers with WebGL and WebGPU support. You help developers build games, product configurators, architectural visualizations, VR/AR experiences, and interactive 3D applications — using Babylon's scene graph, PBR materials, Havok physics, particle systems, GUI, animation, and XR support for production-grade 3D on the web.
.claude/skills/terminalskills-babylonjs/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 66% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 73% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 115% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 145% | 0% |
You are an expert in Babylon.js, the powerful open-source 3D engine for web browsers with WebGL and WebGPU support. You help developers build games, product configurators, architectural visualizations, VR/AR experiences, and interactive 3D applications — using Babylon's scene graph, PBR materials, Havok physics, particle systems, GUI, animation, and XR support for production-grade 3D on the web.
typescript// src/main.ts — Babylon.js scene import { Engine, Scene, ArcRotateCamera, HemisphericLight, Vector3, MeshBuilder, PBRMaterial, Color3, } from "@babylonjs/core"; import "@babylonjs/loaders"; // GLTF/GLB loader const canvas = document.getElementById("renderCanvas") as HTMLCanvasElement; const engine = new Engine(canvas, true, { adaptToDeviceRatio: true, antialias: true, }); const scene = new Scene(engine); scene.clearColor = new Color4(0.1, 0.1, 0.15, 1); // Camera (orbit around target) const camera = new ArcRotateCamera("camera", Math.PI / 4, Math.PI / 3, 10, Vector3.Zero(), scene); camera.attachControl(canvas, true); camera.lowerRadiusLimit = 3; // Min zoom camera.upperRadiusLimit = 20; // Max zoom // Lighting const light = new HemisphericLight("light", new Vector3(0, 1, 0), scene); light.intensity = 0.7; // PBR Material const material = new PBRMaterial("pbr", scene); material.albedoColor = new Color3(0.8, 0.2, 0.3); material.metallic = 0.3; material.roughness = 0.4; // Mesh const sphere = MeshBuilder.CreateSphere("sphere", { diameter: 2, segments: 32 }, scene); sphere.material = material; // Render loop engine.runRenderLoop(() => scene.render()); window.addEventListener("resize", () => engine.resize());
typescriptimport { SceneLoader } from "@babylonjs/core"; import "@babylonjs/loaders/glTF"; // Load GLTF model const result = await SceneLoader.ImportMeshAsync("", "/models/", "product.glb", scene); const model = result.meshes[0]; model.scaling = new Vector3(0.5, 0.5, 0.5); model.position = new Vector3(0, 0, 0); // Access specific meshes by name const body = scene.getMeshByName("Body"); if (body && body.material) { (body.material as PBRMaterial).albedoColor = new Color3(1, 0, 0); // Red }
typescriptimport { HavokPlugin } from "@babylonjs/core"; import HavokPhysics from "@babylonjs/havok"; // Initialize Havok physics const havok = await HavokPhysics(); const physicsPlugin = new HavokPlugin(true, havok); scene.enablePhysics(new Vector3(0, -9.81, 0), physicsPlugin); // Add physics to meshes const ground = MeshBuilder.CreateGround("ground", { width: 20, height: 20 }, scene); new PhysicsAggregate(ground, PhysicsShapeType.BOX, { mass: 0 }, scene); // Static const ball = MeshBuilder.CreateSphere("ball", { diameter: 1 }, scene); ball.position.y = 10; new PhysicsAggregate(ball, PhysicsShapeType.SPHERE, { mass: 1, restitution: 0.7, // Bounciness }, scene);
typescriptimport { AdvancedDynamicTexture, Button, TextBlock, StackPanel } from "@babylonjs/gui"; // Full-screen UI overlay const ui = AdvancedDynamicTexture.CreateFullscreenUI("UI"); const panel = new StackPanel(); panel.width = "220px"; panel.horizontalAlignment = 0; // Left panel.verticalAlignment = 0; // Top panel.paddingTop = "20px"; panel.paddingLeft = "20px"; ui.addControl(panel); const button = Button.CreateSimpleButton("btn", "Change Color"); button.width = "200px"; button.height = "40px"; button.color = "white"; button.background = "#6366f1"; button.onPointerClickObservable.add(() => { material.albedoColor = Color3.Random(); }); panel.addControl(button); // 3D-attached UI (label following a mesh) const label = AdvancedDynamicTexture.CreateForMesh(sphere); const text = new TextBlock(); text.text = "Product Name"; text.color = "white"; text.fontSize = 24; label.addControl(text);
typescript// Enable VR with one line const xr = await scene.createDefaultXRExperienceAsync({ floorMeshes: [ground], uiOptions: { sessionMode: "immersive-vr" }, }); // AR mode const xrAR = await scene.createDefaultXRExperienceAsync({ uiOptions: { sessionMode: "immersive-ar" }, });
bashnpm install @babylonjs/core @babylonjs/loaders @babylonjs/gui npm install @babylonjs/havok # Physics (optional) npm install @babylonjs/materials # Advanced materials (optional)
SceneLoader.ImportMeshAsync for GLTF; compress with Draco for smaller filesscene.debugLayer.show() for the built-in inspector; invaluable for debuggingnew WebGPUEngine(canvas) for next-gen performance| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 9,988 | 10,805 | +8% | 1 | 1 | 0% | 1,814 | 3,493 | +93% | 0 | 0 | — |
case-01 | pass→pass | 14,776 | 6,790 | -54% | 1 | 1 | 0% | 1,776 | 2,941 | +66% | 0 | 0 | — |
case-02 | pass→pass | 7,540 | 5,697 | -24% | 1 | 1 | 0% | 1,567 | 2,710 | +73% | 0 | 0 | — |
case-03 | pass→pass | 5,926 | 5,164 | -13% | 1 | 1 | 0% | 1,216 | 2,617 | +115% | 0 | 0 | — |
case-04 | pass→pass | 12,155 | 9,379 | -23% | 1 | 1 | 0% | 1,261 | 3,085 | +145% | 0 | 0 | — |
case-06 | pass→pass | 9,214 | 9,170 | -0% | 1 | 1 | 0% | 1,517 | 3,530 | +133% | 0 | 0 | — |
case-07 | pass→pass | 9,449 | 8,684 | -8% | 1 | 1 | 0% | 1,626 | 3,149 | +94% | 0 | 0 | — |
case-08 | pass→pass | 9,439 | 8,067 | -15% | 1 | 1 | 0% | 2,154 | 3,385 | +57% | 0 | 0 | — |
case-09 | pass→pass | 21,774 | 9,477 | -56% | 1 | 1 | 0% | 5,503 | 3,798 | -31% | 0 | 0 | — |
case-10 | fail→fail | 8,575 | 8,538 | -0% | 1 | 1 | 0% | 1,737 | 3,308 | +90% | 0 | 0 | — |
case-11 | pass→pass | 10,578 | 11,499 | +9% | 1 | 1 | 0% | 2,202 | 3,919 | +78% | 0 | 0 | — |
case-12 | pass→pass | 10,829 | 11,759 | +9% | 1 | 1 | 0% | 2,260 | 4,140 | +83% | 0 | 0 | — |
case-13 | pass→pass | 3,876 | 3,305 | -15% | 1 | 1 | 0% | 719 | 2,162 | +201% | 0 | 0 | — |
case-14 | pass→pass | 4,426 | 4,779 | +8% | 1 | 1 | 0% | 723 | 2,509 | +247% | 0 | 0 | — |
case-15 | pass→pass | 7,207 | 10,610 | +47% | 1 | 1 | 0% | 1,678 | 3,431 | +104% | 0 | 0 | — |
case-16 | pass→pass | 4,248 | 3,395 | -20% | 1 | 1 | 0% | 813 | 2,116 | +160% | 0 | 0 | — |
case-17 | pass→pass | 6,312 | 5,455 | -14% | 1 | 1 | 0% | 1,263 | 2,781 | +120% | 0 | 0 | — |
case-18 | pass→pass | 7,487 | 7,334 | -2% | 1 | 1 | 0% | 1,364 | 3,079 | +126% | 0 | 0 | — |
case-19 | pass→pass | 6,219 | 6,422 | +3% | 1 | 1 | 0% | 1,152 | 2,764 | +140% | 0 | 0 | — |
case-20 | pass→pass | 2,015 | 2,216 | +10% | 1 | 1 | 0% | 342 | 2,030 | +494% | 0 | 0 | — |
case-21 | pass→pass | 5,600 | 10,048 | +79% | 1 | 1 | 0% | 1,113 | 3,710 | +233% | 0 | 0 | — |
case-22 | pass→pass | 13,069 | 15,891 | +22% | 1 | 1 | 0% | 3,026 | 5,251 | +74% | 0 | 0 | — |
case-23 | pass→pass | 8,142 | 8,345 | +2% | 1 | 1 | 0% | 1,804 | 3,542 | +96% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +4 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.