https://github.com/josdirksen/learning-threejs
本地Web服务器的不同环境:
用Python > python -m SimpleHTTPServer
用NPM > npm install -g http-server > http-server
用Mongoose -- 在Mac/Windows上可以移植
将书本代码放入Web服务根目录
本书使用Three.js r60
HTML框架
<!DOCTYPE html> <html> <head> <title>Example 01.01 - Basic skeleton </title> <script type="text/javascript" src="../libs/three.js"></script> <script type="text/javascript" src="../libs/jquery-1.9.0.js"></script> <style> body{ margin: 0; overflow: hidden; } </style> </head> <body> <div id="WebGL-output"> </div> <script type="text/javascript"> $(function () { // here we'll put the Three.js stuff }); </script> </body> </html>
1.4 渲染并展示三维对象
创建第一个场景,添加几个物体和一个相机
<script type="text/javascript"> $(function () { // here we'll put the Three.js stuff var scene = new THREE.Scene(); //场景 //相机 var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000); //渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setClearColorHex(0xEEEEEE); renderer.setSize(window.innerWidth, window.innerHeight); //坐标轴 var axes = new THREE.AxisHelper(20); scene.add(axes); //平面 var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1); var planeMaterial = new THREE.MeshBasicMaterial( {color: 0xcccccc} ); //材质 var plane = new THREE.Mesh(planeGeometry, planeMaterial); //合并到网格对象 plane.rotation.x = -0.5*Math.PI; plane.position.x = 15; plane.position.y = 0; plane.position.z = 0; scene.add(plane); //方块 var cubeGeometry = new THREE.CubeGeometry(4, 4, 4); var cubeMaterial = new THREE.MeshBasicMaterial( {color: 0xff0000, wireframe: true} ); var cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.position.x = -4; cube.position.y = 3; cube.position.z = 0; scene.add(cube); //球体 var sphereGeometry = new THREE.SphereGeometry(4, 20, 20); var sphereMaterial = new THREE.MeshBasicMaterial( {color: 0x7777ff, wireframe: true} ); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.x = 20; sphere.position.y = 4; sphere.position.z = 2; scene.add(sphere); //相机 camera.position.x = -30; camera.position.y = 40; camera.position.z = 30; camera.lookAt(scene.position); //指向场景的中心 //将renderer挂接到<div>元素 $("#WebGL-output").append(renderer.domElement); renderer.render(scene, camera); }); </script>
1.5 添加材质、灯光和阴影
光源
//光源 var spotLight = new THREE.SpotLight( 0xffffff ); spotLight.position.set( -40, 60, -10 ); scene.add( spotLight );
1.6 用动画扩展你的首个场景
setInterval( function, interval ); 并没有跟显示器的重画同步,这可能会导致较高的CPU使用率,降低系统效率,引入requestAnimationFrame()方法
<script type="text/javascript" src="../libs/stats.js"></script>
1.7 使用dat.GUI库简化试验
Google创建的dat.GUI的库
// GUI var controls = new function() { this.rotationSpeed = 0.02; this.bouncingSpeed = 0.03; } var gui = new dat.GUI(); gui.add(controls, 'rotationSpeed', 0, 0.5); gui.add(controls, 'bouncingSpeed', 0, 0.5);
1.8 使用ASCII效果
使用ASCII效果,你可以把漂亮的动画场景变成一个复古的、文本画风格的动画,而这只需要几行代码
<!DOCTYPE html> <html> <head> <title>Example 01.01 - Basic skeleton </title> <script type="text/javascript" src="../libs/three.js"></script> <script type="text/javascript" src="../libs/stats.js"></script> <script type="text/javascript" src="../libs/dat.gui.js"></script> <script type="text/javascript" src="../libs/jquery-1.9.0.js"></script> <style> body{ margin: 0; overflow: hidden; } </style> </head> <body> <div id="Stats-output"></div> <div id="WebGL-output"></div> <script type="text/javascript"> function initStats() { var stats = new Stats(); stats.setMode(0); stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; $("#Stats-output").append( stats.domElement ); return stats; } $(function () { // 统计图 var stats = initStats(); // here we'll put the Three.js stuff var scene = new THREE.Scene(); //场景 //相机 var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000); //渲染器 var renderer = new THREE.WebGLRenderer(); renderer.setClearColorHex(0xEEEEEE); renderer.setSize(window.innerWidth, window.innerHeight); //坐标轴 var axes = new THREE.AxisHelper(20); scene.add(axes); //平面 var planeGeometry = new THREE.PlaneGeometry(60, 20, 1, 1); //var planeMaterial = new THREE.MeshBasicMaterial( {color: 0xcccccc} ); //材质 var planeMaterial = new THREE.MeshLambertMaterial( {color: 0xffffff} ); //材质 var plane = new THREE.Mesh(planeGeometry, planeMaterial); //合并到网格对象 plane.rotation.x = -0.5*Math.PI; plane.position.x = 15; plane.position.y = 0; plane.position.z = 0; scene.add(plane); //方块 var cubeGeometry = new THREE.CubeGeometry(4, 4, 4); //var cubeMaterial = new THREE.MeshBasicMaterial( {color: 0xff0000, wireframe: true} ); var cubeMaterial = new THREE.MeshLambertMaterial( {color: 0xff0000 } ); var cube = new THREE.Mesh(cubeGeometry, cubeMaterial); cube.position.x = -4; cube.position.y = 3; cube.position.z = 0; scene.add(cube); //球体 var sphereGeometry = new THREE.SphereGeometry(4, 20, 20); //var sphereMaterial = new THREE.MeshBasicMaterial( {color: 0x7777ff, wireframe: true} ); var sphereMaterial = new THREE.MeshBasicMaterial( {color: 0x7777ff} ); var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial); sphere.position.x = 20; sphere.position.y = 4; sphere.position.z = 2; scene.add(sphere); //相机 camera.position.x = -30; camera.position.y = 40; camera.position.z = 30; camera.lookAt(scene.position); //指向场景的中心 //光源 var spotLight = new THREE.SpotLight( 0xffffff ); spotLight.position.set( -40, 60, -10 ); scene.add( spotLight ); // 渲染 function renderScene() { stats.update(); requestAnimationFrame(renderScene); renderer.render(scene, camera); } // GUI var controls = new function() { this.rotationSpeed = 0.02; this.bouncingSpeed = 0.03; } var gui = new dat.GUI(); gui.add(controls, 'rotationSpeed', 0, 0.5); gui.add(controls, 'bouncingSpeed', 0, 0.5); //动画 var step = 0; function render() { //转动方块 cube.rotation.x += controls.rotationSpeed; cube.rotation.y += controls.rotationSpeed; cube.rotation.z += controls.rotationSpeed; //弹跳球 step += controls.bouncingSpeed; sphere.position.x = 20 + (10*(Math.cos(step))); //创建一条光滑的轨迹 sphere.position.y = 2 + (10*Math.abs(Math.sin(step))); requestAnimationFrame(render); renderer.render(scene, camera); } //将renderer挂接到<div>元素 $("#WebGL-output").append(renderer.domElement); renderScene(); render(); }); </script> </body> </html>