I can’t find an official answer of document for this, although many asked this question before, boss’s answer always mentions
You can use scene.render() anywhere you want.
camera.onViewMatrixChangedObservable.add( () => scene.render() )
camera.onViewMatrixChangedObservable is actually not working. User input can not fire this observable at all.
scene.onPointerObservable.add( () => scene.render() )
scene.onPointerObservable is over working with some issue. Over working means that mouse move event also fire this observable to render but camera’s view has not changed. Issue means that this method can not handle camera’s inertia, the view changed by inertia will be queued to the next pointer event.
Three.js make this much more simpler with
OrbitControl.addEventListener( 'change', () => renderer.render(scene, camera) ) and it works very well.