<!DOCTYPE html> <html lang="en"> <head> <title>three.js webgl - materials - cube reflection / refraction [Walt]</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <style> body { background:#000; color:#fff; padding:0; margin:0; overflow:hidden; font-family:georgia; text-align:center; } a { color: #ff0080; text-decoration: none; } a:hover { color: #0080ff; } canvas { pointer-events:none; z-index:10; } #d { text-align:center; margin:1em 0 -7.5em 0; z-index:1000; position:relative; display:block } .button { background:orange; color:#fff; padding:0.2em 0.5em; cursor:pointer } .inactive { background:#999; color:#eee } #oldie { margin-top:11em !important } </style> </head> <body> <div id="d"> <p><a href="http://threejs.org">Three.js</a> cube mapping demo <p>Walt Disney head by <a href="http://davidoreilly.com/post/18087489343/disneyhead" target="_blank">David OReilly</a> <p>Texture by <a href="http://www.humus.name/index.php?page=Textures" target="_blank">Humus</a> </div> <script src="../build/three.min.js"></script> <script src="js/loaders/BinaryLoader.js"></script> <script src="js/Detector.js"></script> <script src="js/libs/stats.min.js"></script> <script> if ( ! Detector.webgl ) Detector.addGetWebGLMessage(); var container, stats; var camera, scene, renderer; var cameraCube, sceneCube; var mesh, geometry; var loader; var pointLight; var mouseX = 0; var mouseY = 0; var windowHalfX = window.innerWidth / 2; var windowHalfY = window.innerHeight / 2; document.addEventListener('mousemove', onDocumentMouseMove, false); init(); animate(); function init() { container = document.createElement( 'div' ); document.body.appendChild( container ); camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 5000 ); camera.position.z = 2000; cameraCube = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 1, 100 ); scene = new THREE.Scene(); sceneCube = new THREE.Scene(); // LIGHTS var ambient = new THREE.AmbientLight( 0xffffff ); scene.add( ambient ); pointLight = new THREE.PointLight( 0xffffff, 2 ); scene.add( pointLight ); // light representation var sphere = new THREE.SphereGeometry( 100, 16, 8 ); var mesh = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( { color: 0xffaa00 } ) ); mesh.scale.set( 0.05, 0.05, 0.05 ); pointLight.add( mesh ); var path = "textures/cube/SwedishRoyalCastle/"; var format = '.jpg'; var urls = [ path + 'px' + format, path + 'nx' + format, path + 'py' + format, path + 'ny' + format, path + 'pz' + format, path + 'nz' + format ]; var reflectionCube = THREE.ImageUtils.loadTextureCube( urls ); reflectionCube.format = THREE.RGBFormat; var refractionCube = new THREE.CubeTexture( reflectionCube.image, THREE.CubeRefractionMapping ); refractionCube.format = THREE.RGBFormat; //var cubeMaterial3 = new THREE.MeshPhongMaterial( { color: 0x000000, specular:0xaa0000, envMap: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.25 } ); var cubeMaterial3 = new THREE.MeshLambertMaterial( { color: 0xff6600, envMap: reflectionCube, combine: THREE.MixOperation, reflectivity: 0.3 } ); var cubeMaterial2 = new THREE.MeshLambertMaterial( { color: 0xffee00, envMap: refractionCube, refractionRatio: 0.95 } ); var cubeMaterial1 = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: reflectionCube } ) // Skybox var shader = THREE.ShaderLib[ "cube" ]; shader.uniforms[ "tCube" ].value = reflectionCube; var material = new THREE.ShaderMaterial( { fragmentShader: shader.fragmentShader, vertexShader: shader.vertexShader, uniforms: shader.uniforms, depthWrite: false, side: THREE.BackSide } ), mesh = new THREE.Mesh( new THREE.BoxGeometry( 100, 100, 100 ), material ); sceneCube.add( mesh ); // renderer = new THREE.WebGLRenderer(); renderer.setPixelRatio( window.devicePixelRatio ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.autoClear = false; container.appendChild( renderer.domElement ); // stats = new Stats(); stats.domElement.style.position = 'absolute'; stats.domElement.style.top = '0px'; stats.domElement.style.zIndex = 100; container.appendChild( stats.domElement ); // loader = new THREE.BinaryLoader( true ); document.body.appendChild( loader.statusDomElement ); loader.load( "obj/walt/WaltHead_bin.js", function( geometry ) { createScene( geometry, cubeMaterial1, cubeMaterial2, cubeMaterial3 ) } ); // window.addEventListener( 'resize', onWindowResize, false ); } function onWindowResize() { windowHalfX = window.innerWidth / 2; windowHalfY = window.innerHeight / 2; camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); cameraCube.aspect = window.innerWidth / window.innerHeight; cameraCube.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } function createScene( geometry, m1, m2, m3 ) { var s = 15; var mesh = new THREE.Mesh( geometry, m1 ); mesh.position.z = - 100; mesh.scale.x = mesh.scale.y = mesh.scale.z = s; scene.add( mesh ); var mesh = new THREE.Mesh( geometry, m2 ); mesh.position.x = - 900; mesh.position.z = - 100; mesh.scale.x = mesh.scale.y = mesh.scale.z = s; scene.add( mesh ); var mesh = new THREE.Mesh( geometry, m3 ); mesh.position.x = 900; mesh.position.z = - 100; mesh.scale.x = mesh.scale.y = mesh.scale.z = s; scene.add( mesh ); loader.statusDomElement.style.display = "none"; } function onDocumentMouseMove(event) { mouseX = ( event.clientX - windowHalfX ) * 4; mouseY = ( event.clientY - windowHalfY ) * 4; } // function animate() { requestAnimationFrame( animate ); render(); stats.update(); } function render() { var timer = -0.0002 * Date.now(); pointLight.position.x = 1500 * Math.cos( timer ); pointLight.position.z = 1500 * Math.sin( timer ); camera.position.x += ( mouseX - camera.position.x ) * .05; camera.position.y += ( - mouseY - camera.position.y ) * .05; camera.lookAt( scene.position ); cameraCube.rotation.copy( camera.rotation ); renderer.render( sceneCube, cameraCube ); renderer.render( scene, camera ); } </script> </body> </html>