Babylon.js 8 3D engine development expertise with curated API patterns, code examples, and on-demand documentation access. Use when working with Babylon.js scenes, meshes, materials (PBR/Standard), cameras, lights, shadows, GUI (2D/3D), animations, physics (Havok), thin instances, glTF loading, post-processing, WebXR, or any 3D rendering task. Covers: (1) Scene setup and engine initialization (WebGL/WebGPU), (2) Mesh creation, transforms, instancing, and merging, (3) PBR and Standard materials with textures, (4) Camera types (ArcRotate, Universal, Follow), (5) Lighting and shadows, (6) 2D/3D GUI with AdvancedDynamicTexture, (7) Animation system and animation groups, (8) Asset loading (glTF, OBJ, STL), (9) Performance optimization and profiling, (10) ASRS/warehouse digital twin visualization patterns.
Babylon.js is a powerful open-source 3D engine for the web. Version 8 supports WebGL2 and WebGPU.
Coordinate system: Left-handed (X=right, Y=up, Z=forward). Rotations in radians.
NPM packages:
@babylonjs/core - Engine, scene, meshes, materials, cameras, lights@babylonjs/gui - 2D/3D GUI controls@babylonjs/loaders - glTF, OBJ, STL loaders@babylonjs/materials - Extra material types@babylonjs/inspector - Debug inspectorTree-shaking: Import from deep paths for minimal bundles:
import { Scene } from "@babylonjs/core/scene";
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
import { Color3, Color4 } from "@babylonjs/core/Maths/math.color";
import { Mesh } from "@babylonjs/core/Meshes/mesh";
import { PBRMaterial } from "@babylonjs/core/Materials/PBR/pbrMaterial";
import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera";
Side-effect imports (enable features without referencing exports):
import "@babylonjs/core/Meshes/thinInstanceMesh";
import "@babylonjs/core/Rendering/edgesRenderer";
import "@babylonjs/core/Collisions/collisionCoordinator";
import "@babylonjs/loaders/glTF/2.0/glTFLoader";
import { Engine } from "@babylonjs/core/Engines/engine";
import { Scene } from "@babylonjs/core/scene";
import { ArcRotateCamera } from "@babylonjs/core/Cameras/arcRotateCamera";
import { HemisphericLight } from "@babylonjs/core/Lights/hemisphericLight";
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
import { CreateSphere } from "@babylonjs/core/Meshes/Builders/sphereBuilder";
import { CreateGround } from "@babylonjs/core/Meshes/Builders/groundBuilder";
const engine = new Engine(canvas, true);
const scene = new Scene(engine);
const camera = new ArcRotateCamera("cam", 0, Math.PI/4, 10, Vector3.Zero(), scene);
camera.attachControl(canvas, true);
const light = new HemisphericLight("light", new Vector3(0, 1, 0), scene);
const sphere = CreateSphere("sphere", { diameter: 2 }, scene);
const ground = CreateGround("ground", { width: 6, height: 6 }, scene);
sphere.position.y = 1;
engine.runRenderLoop(() => scene.render());
window.addEventListener("resize", () => engine.resize());
const pbr = new PBRMaterial("pbr", scene);
pbr.albedoColor = new Color3(1.0, 0.766, 0.336);
pbr.metallic = 0.3;
pbr.roughness = 0.7;
// Optional: connect to environment for reflections
pbr.reflectionTexture = scene.environmentTexture;
mesh.material = pbr;
import "@babylonjs/core/Meshes/thinInstanceMesh";
const buffer = new Float32Array(16 * count);
for (let i = 0; i < count; i++) {
Matrix.Translation(x, y, z).copyToArray(buffer, i * 16);
}
mesh.thinInstanceSetBuffer("matrix", buffer, 16, false);
mesh.thinInstanceBufferUpdated("matrix");
import "@babylonjs/loaders/glTF/2.0/glTFLoader";
const container = await BABYLON.LoadAssetContainerAsync("model.glb", scene);
container.addAllToScene();
scene.onBeforeRenderObservable.add(() => { /* per frame */ });
const observer = scene.onPointerObservable.add((info) => { /* pointer events */ });
scene.onPointerObservable.remove(observer); // unsubscribe
Build complex models from primitives by placing a TransformNode at every joint before attaching geometry. One pivot per degree of freedom; geometry's local position is its offset from the joint.
const robotRoot = new TransformNode("robotRoot", scene);
const shoulderPivot = new TransformNode("shoulderPivot", scene);
shoulderPivot.parent = robotRoot; // pivot lives at the joint axis
const upperArm = CreateCapsule("upperArm", { height: 1.2, radius: 0.16 }, scene);
upperArm.parent = shoulderPivot;
upperArm.position.y = 0.6; // geometry sticks out from joint
// Animation later: shoulderPivot.rotation.y = ... // rotates whole arm cleanly
For booleans (drilled holes, carved slots), use CSG2 (Babylon 8). For rotationally symmetric parts (bottles, hubs, columns) use CreateLathe. For path-swept parts (cables, rails) use CreateTube or ExtrudeShape. See [procedural-parametric-modeling.md](references/procedural-parametric-modeling
Read these files for detailed API patterns on specific topics:
For topics not covered in the reference files, fetch from the live docs:
https://doc.babylonjs.comhttps://raw.githubusercontent.com/BabylonJS/Documentation/master/content/{path}.mdTo fetch a specific topic, read the URL map to find the path, then use WebFetch on the doc site URL or fetch raw markdown from GitHub.
/features/featuresDeepDive/physics/features/featuresDeepDive/webXR/features/featuresDeepDive/postProcesses/features/featuresDeepDive/particles/solid_particle_system/features/featuresDeepDive/crowdNavigation/features/featuresDeepDive/mesh/nodeGeometry/features/featuresDeepDive/frameGraph/features/featuresDeepDive/flowGraph/features/featuresDeepDive/smartFilters/features/featuresDeepDive/importers (splat/ply formats)mesh.rotationQuaternion disables mesh.rotation. To switch back: mesh.rotationQuaternion = null..dispose() on meshes, materials, textures when done.mesh.alphaIndex or rendering groups.TransformNode first, then attach geometry as a child with a local offset. Retro-fitting pivots after MergeMeshes is painful — merge only after the hierarchy works.CSG2 (boolean ops backed by Manifold) requires await InitializeCSG2Async() once before use and operates in world space. Always dispose intermediate CSG2.FromMesh objects — they hold WASM memory.scaling.x *= -1 inverts triangle winding and breaks backface culling. Fix with material.sideOrientation = Mesh.DOUBLESIDE or rebake.Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer