{"record":{"id":"3f868c8e547989f1","repo":"BabylonJS/Babylon.js","slug":"no-camera-defined","errorCode":null,"errorMessage":"No camera defined","messagePattern":"No camera defined","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/dev/core/src/scene.pure.ts","lineNumber":5699,"sourceCode":"                step.action();\r\n            }\r\n\r\n            // Clear\r\n            this._clearFrameBuffer(this.activeCamera);\r\n\r\n            // Collects render targets from external components.\r\n            for (const step of this._gatherRenderTargetsStage) {\r\n                step.action(this._renderTargets);\r\n            }\r\n\r\n            // Multi-cameras?\r\n            if (this.activeCameras && this.activeCameras.length > 0) {\r\n                for (let cameraIndex = 0; cameraIndex < this.activeCameras.length; cameraIndex++) {\r\n                    this._processSubCameras(this.activeCameras[cameraIndex], cameraIndex > 0);\r\n                }\r\n            } else {\r\n                if (!this.activeCamera) {\r\n                    throw new Error(\"No camera defined\");\r\n                }\r\n\r\n                this._processSubCameras(this.activeCamera, !!this.activeCamera.outputRenderTarget);\r\n            }\r\n        }\r\n\r\n        // Intersection checks\r\n        this._checkIntersections();\r\n\r\n        // Executes the after render stage actions.\r\n        for (const step of this._afterRenderStage) {\r\n            step.action();\r\n        }\r\n\r\n        // After render\r\n        if (this.afterRender) {\r\n            this.afterRender();\r\n        }\r","sourceCodeStart":5681,"sourceCodeEnd":5717,"githubUrl":"https://github.com/BabylonJS/Babylon.js/blob/0592b347b8a4ee0236089ea86a749cacfdb266d8/packages/dev/core/src/scene.pure.ts#L5681-L5717","documentation":"Scene.render() resolves which camera(s) to render through. If scene.activeCameras (multi-camera array) is empty/undefined and scene.activeCamera is also falsy, there is no camera to process sub-cameras with, so the scene throws 'No camera defined'. Babylon requires at least one active camera to compute view/projection matrices for a frame.","triggerScenarios":"Calling scene.render() (directly or via engine.runRenderLoop) when the scene has no activeCamera and no entries in activeCameras — e.g. before any camera was created, or after the only camera was disposed/detached from the scene.","commonSituations":"Boilerplate that creates scene+meshes but omits camera creation; disposing a camera on cleanup while the render loop keeps running; multi-camera code that clears activeCameras and never restores activeCamera; copy-pasted scene code missing the camera line.","solutions":["Create a camera and assign it: scene.activeCamera = new FreeCamera(...) (or pass it as 4th arg to the constructor)","If the camera was disposed, re-create/re-assign before the next render call","For multi-camera setups, ensure activeCameras has entries or fall back to setting activeCamera","Pause/skip scene.render() when no camera is available instead of calling it unconditionally"],"exampleFix":"// before\nconst scene = new Scene(engine);\nengine.runRenderLoop(() => scene.render()); // no camera\n// after\nconst scene = new Scene(engine);\nscene.activeCamera = new FreeCamera('camera', new Vector3(0, 5, -10), scene);\nengine.runRenderLoop(() => scene.render());","handlingStrategy":"validation","validationCode":"if (!scene.activeCamera && !(scene.activeCameras && scene.activeCameras.length > 0)) {\n  scene.activeCamera = new BABYLON.FreeCamera('default', new BABYLON.Vector3(0, 5, -10), scene);\n}\nscene.render();","typeGuard":"function sceneHasCamera(scene: BABYLON.Scene): boolean {\n  return !!scene.activeCamera || (!!scene.activeCameras && scene.activeCameras.length > 0);\n}","tryCatchPattern":"try {\n  scene.render();\n} catch (e) {\n  if (e instanceof Error && e.message === 'No camera defined') {\n    scene.activeCamera = createDefaultCamera(scene); // then re-render\n  } else { throw e; }\n}","preventionTips":["Include camera creation in scene setup boilerplate; never render a camera-less scene","When disposing cameras, immediately assign a replacement or stop the render loop","For multi-camera scenes, keep activeCameras populated or set activeCamera as fallback","Use sceneHasCamera() as a gate in your engine.runRenderLoop callback"],"tags":["babylonjs","camera","scene","render-loop"],"backgroundTag":"no-camera-defined","analyzedSha":"0592b347b8a4ee0236089ea86a749cacfdb266d8","analyzedAt":"2026-08-30T15:11:20.442Z","schemaVersion":2},"datasetVersion":"2026-08-30T18:17:15.746Z"}