
The fastest way to get a stable 3D AuraJS project is to start with a tiny authored scene:
Do not start with imported animation, terrain, physics, and UI all at once.
For a first native 3D project:
aura.setupaura.draw()let floorMesh = null;
let crateMesh = null;
let floorMaterial = null;
let crateMaterial = null;
let spin = 0;
aura.setup = function () {
aura.camera3d.perspective(60, 0.1, 100);
aura.camera3d.setPosition(0, 3.2, 6.5);
aura.camera3d.lookAt(0, 0.8, 0);
aura.light.ambient(aura.rgba(1, 1, 1, 1), 0.3);
aura.light.directional({ x: -0.5, y: -1, z: -0.35 }, aura.rgba(1, 0.97, 0.92, 1), 1.15);
floorMesh = aura.mesh.createPlane(10, 10);
crateMesh = aura.mesh.createBox(1, 1, 1);
floorMaterial = aura.material.create({
color: aura.rgba(0.18, 0.2, 0.24, 1),
roughness: 0.92,
metallic: 0.04,
});
crateMaterial = aura.material.create({
color: aura.rgba(0.78, 0.55, 0.26, 1),
roughness: 0.72,
metallic: 0.08,
});
};
aura.update = function (dt) {
spin += dt;
};
aura.draw = function () {
aura.draw3d.clear3d(aura.rgba(0.04, 0.05, 0.07, 1));
aura.draw3d.drawMesh(floorMesh, floorMaterial, {
position: { x: 0, y: 0, z: 0 },
rotation: { x: 0, y: 0, z: 0 },
scale: { x: 1, y: 1, z: 1 },
});
aura.draw3d.drawMesh(crateMesh, crateMaterial, {
position: { x: 0, y: 0.5, z: 0 },
rotation: { x: 0, y: spin, z: 0 },
scale: { x: 1, y: 1, z: 1 },
});
};
Add the next layers in this order:
aura.scene3d for hierarchy and render-node bindingaura.scene3d.loadGltfScene(...) for imported contentaura.physics3d and aura.character3daura.terrain and aura.navmeshThat order keeps debugging simple:
Once the procedural floor is stable, the canonical next proof is the direct plain-JS avatar path:
aura.scene3d.loadGltfScene(...)aura.scene3d.getImportedScene(...)aura.scene3d.createAvatar(...)avatar.tick(dt)aura.scene3d.submitRenderBindings()Current honest boundary:
starter-avatar.gltf assetscene3d when you need hierarchy or imported-scene metadata