4 <title>three.js webgl - materials - bump map [Lee Perry-Smith]</title>
6 <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
21 top: 0px; width: 100%;
24 font-family:Monospace;
31 background:rgb(200,100,0) !important;
36 #vt, #vt a { color:orange; }
42 <a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> - webgl bump mapping without tangents using <a href="http://mmikkelsen3d.blogspot.sk/2011/07/derivative-maps.html">Morten Mikkelsen's</a> method -
43 <a href="http://graphics.cs.williams.edu/data/meshes.xml#14" target="_blank" rel="noopener">Lee Perry-Smith</a> head
46 <script src="../build/three.js"></script>
48 <script src="js/Detector.js"></script>
49 <script src="js/libs/stats.min.js"></script>
53 if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
55 var statsEnabled = true;
57 var container, stats, loader;
59 var camera, scene, renderer;
71 var windowHalfX = window.innerWidth / 2;
72 var windowHalfY = window.innerHeight / 2;
79 container = document.createElement( 'div' );
80 document.body.appendChild( container );
84 camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 10000 );
85 camera.position.z = 1200;
87 scene = new THREE.Scene();
88 scene.background = new THREE.Color( 0x060708 );
92 scene.add( new THREE.HemisphereLight( 0x443333, 0x111122 ) );
94 spotLight = new THREE.SpotLight( 0xffffbb, 2 );
95 spotLight.position.set( 0.5, 0, 1 );
96 spotLight.position.multiplyScalar( 700 );
97 scene.add( spotLight );
99 spotLight.castShadow = true;
101 spotLight.shadow.mapSize.width = 2048;
102 spotLight.shadow.mapSize.height = 2048;
104 spotLight.shadow.camera.near = 200;
105 spotLight.shadow.camera.far = 1500;
107 spotLight.shadow.camera.fov = 40;
109 spotLight.shadow.bias = -0.005;
113 var mapHeight = new THREE.TextureLoader().load( "obj/leeperrysmith/Infinite-Level_02_Disp_NoSmoothUV-4096.jpg" );
115 var material = new THREE.MeshPhongMaterial( {
123 loader = new THREE.JSONLoader();
124 loader.load( "obj/leeperrysmith/LeePerrySmith.js", function( geometry ) { createScene( geometry, 100, material ) } );
126 renderer = new THREE.WebGLRenderer( { antialias: false } );
127 renderer.setPixelRatio( window.devicePixelRatio );
128 renderer.setSize( window.innerWidth, window.innerHeight );
129 container.appendChild( renderer.domElement );
131 renderer.shadowMap.enabled = true;
132 renderer.shadowMap.renderReverseSided = false;
136 renderer.gammaInput = true;
137 renderer.gammaOutput = true;
141 if ( statsEnabled ) {
144 container.appendChild( stats.dom );
150 document.addEventListener( 'mousemove', onDocumentMouseMove, false );
151 window.addEventListener( 'resize', onWindowResize, false );
155 function createScene( geometry, scale, material ) {
157 mesh = new THREE.Mesh( geometry, material );
159 mesh.position.y = - 50;
160 mesh.scale.set( scale, scale, scale );
162 mesh.castShadow = true;
163 mesh.receiveShadow = true;
171 function onWindowResize( event ) {
173 renderer.setSize( window.innerWidth, window.innerHeight );
175 camera.aspect = window.innerWidth / window.innerHeight;
176 camera.updateProjectionMatrix();
180 function onDocumentMouseMove( event ) {
182 mouseX = ( event.clientX - windowHalfX );
183 mouseY = ( event.clientY - windowHalfY );
191 requestAnimationFrame( animate );
194 if ( statsEnabled ) stats.update();
200 targetX = mouseX * .001;
201 targetY = mouseY * .001;
205 mesh.rotation.y += 0.05 * ( targetX - mesh.rotation.y );
206 mesh.rotation.x += 0.05 * ( targetY - mesh.rotation.x );
210 renderer.render( scene, camera );