Three.js Resizing Canvas Three.js Resizing Canvas javascript javascript

Three.js Resizing Canvas


So the canvas element can be resized like every other element. What you want to do is tell the render and camera to resize the contents of your canvas as well.

window.addEventListener( 'resize', onWindowResize, false );function onWindowResize(){    camera.aspect = window.innerWidth / window.innerHeight;    camera.updateProjectionMatrix();    renderer.setSize( window.innerWidth, window.innerHeight );}


Finally the problem were solved the actually problem was coming from because the application is using the THREE.EffectComposer object, in the class constructor a composer object were created like following:

this.composer = new THREE.EffectComposer(this.renderer3D);

So as for the renderer, the composer needed to have the size updated after the event handler function like following:

if(instance.renderer3D)    instance.renderer3D.setSize(instance.dom.clientWidth, instance.dom.clientHeight);if(instance.composer)    instance.composer.setSize(instance.dom.clientWidth, instance.dom.clientHeight);

And this fixed the issue perfectly :)


I applied Shawn Whinnery's answer to my needs with React JS:

Start listener onMount:

componentDidMount() {  window.addEventListener('resize', this.handleResize, false)}

Remove listener onUnmount (because we like garbage collection):

componentWillUnmount() {  window.removeEventListener('resize', this.handleResize, false)}

Install handler function:

handleResize = () => {  this.camera.aspect = window.innerWidth / window.innerHeight  this.camera.updateProjectionMatrix()  this.renderer.setSize(window.innerWidth, window.innerHeight)}

Fat arrow syntax is used to avoid binding this. The code will not work if you have this: handleResize() { ... }, but of course, it would work if you added this to your constructor:

this.handleResize = this.handleResize.bind(this)

Final note: confirm that your camera is this.camera and your renderer is this.renderer. Besides that, you should be able to paste it all in.