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

  1. Ensure a valid Camera is created (new FreeCamera/ArcRotateCamera + scene.activeCamera = camera) before rendering
  2. Check that the camera passed in is not null or already disposed (camera.isDisposed)
  3. Re-attach the camera if it was disposed, or create a replacement default camera
  4. 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

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


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/154bdc376fdb98fa. Report an issue: GitHub.