</pre><pre name="code" class="html"><!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Example 03.01 - Ambient Light</title> <script type="text/javascript" src="../libs/three.js"></script> <script type="text/javascript" src="../libs/OBJLoader.js"></script> <script type="text/javascript" src="../libs/MTLLoader.js"></script> <script type="text/javascript" src="../libs/OBJMTLLoader.js"></script> <script type="text/javascript" src="../libs/jquery-1.9.0.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/Detector.js"></script> <script type="text/javascript" src="../libs/OrbitControls.js"></script> <style> body { background:#000; color:#000; padding:0; margin:0; overflow:hidden; font-family:monospace; font-size:13px; text-align:center; } a { color:skyblue } #info { position: absolute; top: 0px; width: 100%; color: #fff; background:rgba(0,0,0,0.65); padding: 5px; text-align: center; z-index:100; display:block; } #stats { position: absolute; top:5px; left: 0; z-index: 100 } #stats #fps { background: transparent !important } #stats #fps #fpsText { color: #aaa !important } #stats #fps #fpsGraph { display: none } </style> </head> <body> <div id="Stats-output"> </div> <!-- Div which will hold the Output --> <div id="WebGL-output"> </div> <script type="text/javascript"> $(function () { var stats = initStats(); // create a scene, that will hold all our elements such as objects, cameras and lights. var scene = new THREE.Scene(); // create a camera, which defines where we're looking at. var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000); // SKYBOX /* var sceneCube; var textureCube; sceneCube = new THREE.Scene(); //sceneCube.add( camera ); var r = "textures/cube/pisa/"; var urls = [ r + "px.png", r + "nx.png", r + "py.png", r + "ny.png", r + "pz.png", r + "nz.png" ]; textureCube = THREE.ImageUtils.loadTextureCube( urls ); var shader = THREE.ShaderLib[ "cube" ]; shader.uniforms[ "tCube" ].value = textureCube; var material = new THREE.ShaderMaterial( { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: shader.uniforms, depthWrite: false, side: THREE.BackSide } ), mesh1 = new THREE.Mesh( new THREE.BoxGeometry( 100, 100, 100 ), material ); sceneCube.add( mesh1 ); */ // create a render and set the size var renderer = new THREE.WebGLRenderer(); renderer.setClearColorHex(0xffffff, 1.0); renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMapEnabled = true; //添加坐标轴 var axes = new THREE.AxisHelper( 20 ); scene.add(axes); // 创建一个平面 var planeGeometry = new THREE.PlaneGeometry(100,100, 1, 1); var planeMaterial = new THREE.MeshLambertMaterial({color: 0xededed}); var plane = new THREE.Mesh(planeGeometry, planeMaterial); plane.receiveShadow = true; // rotate and position the plane plane.rotation.x = -0.5 * Math.PI; plane.position.x = 15 plane.position.y = -20 plane.position.z = 0 scene.add(plane); //添加模型 var gui = new dat.GUI(); var mesh; var loader = new THREE.OBJMTLLoader(); loader.addEventListener('load', function (event) { var object = event.content; for(k in object.children){ object.children[k].castShadow = true; object.children[k].receiveShadow = true; } object.position.x = 20; object.position.y = 0; object.position.z = 0; object.scale.set(0.5, 0.5, 0.5); mesh = object; scene.add(mesh); }); loader.load('../assets/models/00.obj', '../assets/models/00.mtl', {side: THREE.DoubleSide}); // 相机在场景中的位置和指向 camera.position.x = -25; camera.position.y = 40; camera.position.z = 25; camera.lookAt(new THREE.Vector3(10, 0, 0)); //添加控制 var orbitControls = new THREE.OrbitControls(camera); orbitControls.autoRotate = true;//设置平面自动旋转 var clock = new THREE.Clock(); // 增加外界环境光照 var ambiColor = "#8b8a87"; var ambientLight = new THREE.AmbientLight(ambiColor); scene.add(ambientLight); // 为了增加阴影添加一个点光源 var spotLight = new THREE.SpotLight(0xffffff); spotLight.position.set(-40, 60, -10); spotLight.castShadow = true; scene.add(spotLight); // add the output of the renderer to the html element $("#WebGL-output").append(renderer.domElement); // call the render function var step = 0; var controls = new function () { this.rotationSpeed = 0.01; this.bouncingSpeed = 0; this.ambientColor = ambiColor; } var gui = new dat.GUI(); gui.addColor(controls, 'ambientColor').onChange(function (e) { ambientLight.color = new THREE.Color(e); }); render(); //监听窗口时间使其自适应 window.addEventListener( 'resize', onWindowResize, false ); window.addEventListener( 'mousemove', onDocumentMouseMove, false ); function render() { stats.update(); //sphere.rotation.y=step+=0.01; var delta = clock.getDelta(); orbitControls.update(delta); if (mesh) { // mesh.rotation.y+=0.006; mesh.rotation.y+=0.006;//只是水平旋转 //mesh.rotation.x += controls.rotationSpeed; //mesh.rotation.y += controls.rotationSpeed; //mesh.rotation.z += controls.rotationSpeed; } // render using requestAnimationFrame requestAnimationFrame(render); renderer.render(scene, camera); } function initStats() { var stats = new Stats(); stats.setMode(0); // 0: fps, 1: ms // Align top-left stats.domElement.style.position = 'absolute'; stats.domElement.style.left = '0px'; stats.domElement.style.top = '0px'; $("#Stats-output").append(stats.domElement); return stats; } //窗口监听事件 function onWindowResize( event ) { SCREEN_WIDTH = window.innerWidth; SCREEN_HEIGHT = window.innerHeight; renderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT ); camera.aspect = SCREEN_WIDTH / SCREEN_HEIGHT; camera.updateProjectionMatrix(); cameraCube.aspect = SCREEN_WIDTH / SCREEN_HEIGHT; cameraCube.updateProjectionMatrix(); } //鼠标监听事件 function onDocumentMouseMove(event) { mouseX = ( event.clientX - windowHalfX ); mouseY = ( event.clientY - windowHalfY ); } }); </script> </body> </html>