BabylonJS/Babylon.js · error
Active camera not set
Error message
Active camera not set
What it means
This code path (camera-dependent render, e.g. setActiveCamera / _renderForCamera family) assigns the given camera to _activeCamera and then asserts that scene.activeCamera is readable. If the assignment left activeCamera null/undefined (camera was null, or was disposed/rejected), the scene cannot compute a viewport or view matrix, so it throws.
Source
Thrown at packages/dev/core/src/scene.pure.ts:5032
}
/** @internal */
public _allowPostProcessClearColor = true;
/**
* @internal
*/
public _renderForCamera(camera: Camera, rigParent?: Camera, bindFrameBuffer = true): void {
if (camera && camera._skipRendering) {
return;
}
const engine = this._engine;
// Use _activeCamera instead of activeCamera to avoid onActiveCameraChanged
this._activeCamera = camera;
if (!this.activeCamera) {
throw new Error("Active camera not set");
}
// Viewport
engine.setViewport(this.activeCamera.viewport);
// Camera
this.resetCachedMaterial();
this._renderId++;
if (!this.prePass && bindFrameBuffer) {
let skipInitialClear = true;
if (camera._renderingMultiview && camera.outputRenderTarget) {
skipInitialClear = camera.outputRenderTarget.skipInitialClear;
if (this.autoClear) {
this._defaultFrameBufferCleared = false;
camera.outputRenderTarget.skipInitialClear = false;
}
}
View on GitHub (pinned to 0592b347b8)
Solutions
- Ensure a valid Camera is created (new FreeCamera/ArcRotateCamera + scene.activeCamera = camera) before rendering
- Check that the camera passed in is not null or already disposed (camera.isDisposed)
- Re-attach the camera if it was disposed, or create a replacement default camera
- Guard the render call behind a check that scene.activeCamera is set
Example fix
// before
scene.render(); // camera never assigned or was disposed
// after
if (!scene.activeCamera || scene.activeCamera.isDisposed()) {
scene.activeCamera = new ArcRotateCamera('cam', 0, 0, 10, Vector3.Zero(), scene);
}
scene.render(); Defensive patterns
Strategy: validation
Validate before calling
function canRenderWithCamera(scene: BABYLON.Scene, camera?: BABYLON.Camera | null): boolean {
return !!camera && !camera.isDisposed() && (camera.getScene() === scene);
}
// call scene render APIs only if canRenderWithCamera(scene, myCamera) Type guard
function isValidCamera(c: unknown): c is BABYLON.Camera {
return !!c && typeof c === 'object' && 'viewport' in c && !(c as BABYLON.Camera).isDisposed();
} Try / catch
try {
scene.setActiveCamera?.(camera) ?? renderPass(camera);
} catch (e) {
if (e instanceof Error && e.message === 'Active camera not set') {
camera = createDefaultCamera(scene);
scene.activeCamera = camera;
} else { throw e; }
} Prevention
- Always create and assign a camera before the first scene.render()
- Check camera.isDisposed() after disposing cameras elsewhere in the app
- Never pass a nullable camera variable straight into render APIs without a null check
- Re-assign scene.activeCamera whenever you dispose or detach cameras
When it happens
Trigger: Passing null/undefined (or an already-disposed camera) into the camera render/set API on Scene, so this._activeCamera = camera results in this.activeCamera being falsy immediately after assignment.
Common situations: A camera was disposed elsewhere but a reference is still passed to render; camera variable lost by refactoring; calling render with no camera ever created in the scene.
Related errors
- No camera defined
- Freezing active meshes was cancelled
- No camera available for screenshot.
- At least one mesh is needed to create the nav mesh.
- Connect failed
AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30).
Data as JSON: /api/errors/154bdc376fdb98fa.
Report an issue: GitHub.