This course was updated in 2024. For the newer content, please visit Animation Loop
Video Lecture
Description
The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser calls a specified function to update an animation before the next repaint. The method takes a callback as an argument to be invoked before the repaint.
Note
The callback routine must itself call requestAnimationFrame() if you want to animate another frame at the next repaint.
The number of callbacks is usually 60 times per second, but will generally match the display refresh rate in most web browsers as per W3C recommendation. requestAnimationFrame() calls are paused in most browsers when running in background tabs or hidden <iframe>s in order to improve performance and battery life.
Start Scripts
Lets put the scripts back to the way the where before the previous lesson.
./dist/client/index.html
1 2 3 4 5 6 7 8 9101112131415161718
<!DOCTYPE html><htmllang="en"><head><metacharset="utf-8"/><metaname="viewport"content="width=device-width, initial-scale=1"/><title>Three.js TypeScript Tutorials by Sean Bradley : https://sbcode.net/threejs</title><style>body{overflow:hidden;margin:0px;}</style></head><body><scripttype="module"src="bundle.js"></script></body></html>
import*asTHREEfrom'three'import{OrbitControls}from'three/examples/jsm/controls/OrbitControls'constscene=newTHREE.Scene()constcamera=newTHREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,1000)camera.position.z=2constrenderer=newTHREE.WebGLRenderer()renderer.setSize(window.innerWidth,window.innerHeight)document.body.appendChild(renderer.domElement)constcontrols=newOrbitControls(camera,renderer.domElement)controls.addEventListener('change',render)//this line is unnecessary if you are re-rendering within the animation loopconstgeometry=newTHREE.BoxGeometry()constmaterial=newTHREE.MeshBasicMaterial({color:0x00ff00,wireframe:true,})constcube=newTHREE.Mesh(geometry,material)scene.add(cube)window.addEventListener('resize',onWindowResize,false)functiononWindowResize(){camera.aspect=window.innerWidth/window.innerHeightcamera.updateProjectionMatrix()renderer.setSize(window.innerWidth,window.innerHeight)render()}// function animate() {// requestAnimationFrame(animate)// cube.rotation.x += 0.01// cube.rotation.y += 0.01// render()// }functionrender(){renderer.render(scene,camera)}//animate()render()