materials_cubemap.html 7.3 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<!DOCTYPE HTML>
<html lang="en">
	<head>
		<title>three.js - cube map WebGL</title>
		<meta charset="utf-8">
		<style type="text/css">
			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; }
M
Mr.doob 已提交
18

19
			canvas { pointer-events:none; z-index:10; position:relative; }
M
Mr.doob 已提交
20
			#log { position:absolute; top:50px; text-align:left; display:block; z-index:100; pointer-events:none; }
21 22 23 24 25
			#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 }
		</style>
	</head>
M
Mr.doob 已提交
26

27 28 29 30 31 32 33
	<body>
		<div id="d">
			<p><a href="http://github.com/mrdoob/three.js">Three.js</a> cube mapping demo

			<p>Walt Disney head by <a href="http://www.davidoreilly.com/2009/01/walt-disneys-head-on-a-plate" target="_blank">David OReilly</a>
			<p>Texture by <a href="http://www.humus.name/index.php?page=Textures" target="_blank">Humus</a>
		</div>
M
Mr.doob 已提交
34

35 36 37
		<pre id="log"></pre>

		<script type="text/javascript" src="../build/Three.js"></script> 
M
Mr.doob 已提交
38

39 40 41 42 43 44 45 46 47 48
		<script type="text/javascript" src="../src/extras/primitives/Sphere.js"></script>
		<script type="text/javascript" src="../src/extras/primitives/Plane.js"></script>
		<script type="text/javascript" src="../src/extras/io/Loader.js"></script>

		<script type="text/javascript" src="js/Stats.js"></script>

		<script type="text/javascript">

			var FLOOR = -250;

M
Mr.doob 已提交
49
			var container, stats;
50

M
Mr.doob 已提交
51 52
			var camera, scene, webglRenderer;
			var cameraCube, sceneCube;
53 54

			var mesh, zmesh, lightMesh, geometry;
M
Mr.doob 已提交
55

56
			var directionalLight, pointLight;
M
Mr.doob 已提交
57

58 59 60
			var mouseX = 0;
			var mouseY = 0;

M
Mr.doob 已提交
61 62 63
			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;

64 65 66
			document.addEventListener('mousemove', onDocumentMouseMove, false);

			init();
M
Mr.doob 已提交
67 68
			setInterval( loop, 1000 / 60 );

69 70 71 72 73
			function init() {

				container = document.createElement('div');
				document.body.appendChild(container);

M
Mr.doob 已提交
74
				camera = new THREE.Camera( 50, window.innerWidth / window.innerHeight, 1, 100000 );
75
				camera.position.z = 2000;
M
Mr.doob 已提交
76 77

				cameraCube = new THREE.Camera( 50, window.innerWidth / window.innerHeight, 1, 100000 );
78 79

				scene = new THREE.Scene();
M
Mr.doob 已提交
80
				sceneCube = new THREE.Scene();
81 82 83

				// LIGHTS

M
Mr.doob 已提交
84
				var ambient = new THREE.AmbientLight( 0xffffff );
85 86
				scene.addLight( ambient );

M
Mr.doob 已提交
87
				pointLight = new THREE.PointLight( 0xffffff, 2 );
88 89 90 91 92 93
				scene.addLight( pointLight );

				// light representation
				sphere = new Sphere( 100, 16, 8, 1 );
				lightMesh = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( { color:0xffaa00 } ) );
				lightMesh.position = pointLight.position;
M
Mr.doob 已提交
94
				lightMesh.scale.x = lightMesh.scale.y = lightMesh.scale.z = 0.05;
95 96 97 98
				scene.addObject(lightMesh);

				// material samples
				var r = "textures/cube/SwedishRoyalCastle/";
M
Mr.doob 已提交
99

100 101 102
				var urls = [ r + "px.jpg", r + "nx.jpg", 
							 r + "py.jpg", r + "ny.jpg", 
							 r + "pz.jpg", r + "nz.jpg" ];
M
Mr.doob 已提交
103

104
				var images = loadImageArray( urls );
M
Mr.doob 已提交
105

M
Mr.doob 已提交
106 107
				//var cubeMaterial3 = new THREE.MeshPhongMaterial( { color: 0x000000, specular:0xaa0000, env_map: new THREE.TextureCube( images ), combine: THREE.Mix, reflectivity: 0.25 } );
				var cubeMaterial3 = new THREE.MeshLambertMaterial( { color: 0xff6600, env_map: new THREE.TextureCube( images ), combine: THREE.Mix, reflectivity: 0.3 } );
108 109
				var cubeMaterial2 = new THREE.MeshLambertMaterial( { color: 0xffee00, env_map: new THREE.TextureCube( images ) } );
				var cubeMaterial1 = new THREE.MeshLambertMaterial( { color: 0xffffff, env_map: new THREE.TextureCube( images ) } )
M
Mr.doob 已提交
110 111 112

				createCube( 10000, images );

113
				webglRenderer = new THREE.WebGLRenderer( scene );
M
Mr.doob 已提交
114 115 116
				webglRenderer.setSize( window.innerWidth, window.innerHeight );
				webglRenderer.autoClear = false;
				webglRenderer.setFaceCulling( 0 );
117 118 119 120 121 122 123
				container.appendChild( webglRenderer.domElement );

				stats = new Stats();
				stats.domElement.style.position = 'absolute';
				stats.domElement.style.top = '0px';
				stats.domElement.style.zIndex = 100;
				container.appendChild( stats.domElement );
M
Mr.doob 已提交
124

125 126 127 128 129
				var loader = new THREE.Loader();
				loader.loadBinary( "obj/walt/WaltHead_bin.js", function( geometry ) { createScene( geometry, cubeMaterial1, cubeMaterial2, cubeMaterial3 ) }, "obj/walt" );

			}

M
Mr.doob 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
			function addMesh( geometry, scale, x, y, z, rx, ry, rz, material ) {

				mesh = new THREE.Mesh( geometry, material );
				mesh.scale.x = mesh.scale.y = mesh.scale.z = scale;
				mesh.position.x = x;
				mesh.position.y = y;
				mesh.position.z = z;
				mesh.rotation.x = rx;
				mesh.rotation.y = ry;
				mesh.rotation.z = rz;
				scene.addObject(mesh);

			}

			function addCubeMesh( geometry, scale, x, y, z, rx, ry, rz, material ) {

				mesh = new THREE.Mesh( geometry, material );
				mesh.position.x = x;
				mesh.position.y = y;
				mesh.position.z = z;
				mesh.rotation.x = rx;
				mesh.rotation.y = ry;
				mesh.rotation.z = rz;
				mesh.scale.x = mesh.scale.y = mesh.scale.z = scale;
				sceneCube.addObject(mesh);

			}

A
alteredq 已提交
158
			function createCube( size, images ) {
M
Mr.doob 已提交
159

A
alteredq 已提交
160
				var hsize = size/2, plane = new Plane( size, size ), pi2 = Math.PI/2, pi = Math.PI;
M
Mr.doob 已提交
161 162 163 164 165 166 167

				addCubeMesh( plane, 1,      0,     0,  -hsize,  0,      0,  0, new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[5] ) } ) );
				addCubeMesh( plane, 1, -hsize,     0,       0,  0,    pi2,  0, new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[0] ) } ) );
				addCubeMesh( plane, 1,  hsize,     0,       0,  0,   -pi2,  0, new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[1] ) } ) );
				addCubeMesh( plane, 1,     0,  hsize,       0,  pi2,    0, pi, new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[2] ) } ) );
				addCubeMesh( plane, 1,     0, -hsize,       0, -pi2,    0, pi, new THREE.MeshBasicMaterial( { map: new THREE.Texture( images[3] ) } ) );

A
alteredq 已提交
168 169
			}

170
			function createScene( geometry, m1, m2, m3 ) {
M
Mr.doob 已提交
171

172
				var s = 15;
M
Mr.doob 已提交
173

174 175 176 177 178 179 180
				addMesh( geometry, s,      0, 0, -100, 0,0,0, m1 );
				addMesh( geometry, s,   -900, 0, -100, 0,0,0, m2 );
				addMesh( geometry, s,    900, 0, -100, 0,0,0, m3 );

			}

			function loadImageArray( urls ) {
M
Mr.doob 已提交
181

182
				var i, images = [];
M
Mr.doob 已提交
183

184
				images.loadCount = 0;
M
Mr.doob 已提交
185

186
				for ( i = 0; i < urls.length; ++i ) {
M
Mr.doob 已提交
187

188 189 190 191
					images[i] = new Image();
					images[i].loaded = 0;
					images[i].onload = function() { images.loadCount += 1; this.loaded = 1;/*log( images.loadCount );*/ }
					images[i].src = urls[i];
M
Mr.doob 已提交
192

193 194 195
				}

				return images;
M
Mr.doob 已提交
196

197
			}
M
Mr.doob 已提交
198

199 200
			function onDocumentMouseMove(event) {

M
Mr.doob 已提交
201 202
				mouseX = ( event.clientX - windowHalfX ) * 4;
				mouseY = ( event.clientY - windowHalfY ) * 4;
203 204 205 206

			}

			var r = 0;
M
Mr.doob 已提交
207

208 209 210 211
			function loop() {

				camera.position.x += ( mouseX - camera.position.x ) * .05;
				camera.position.y += ( - mouseY - camera.position.y ) * .05;
M
Mr.doob 已提交
212 213 214 215 216 217 218 219

				cameraCube.target.position.x = - camera.position.x;
				cameraCube.target.position.y = - camera.position.y;
				cameraCube.target.position.z = - camera.position.z;


				lightMesh.position.x = 1500 * Math.cos( r );
				lightMesh.position.z = 1500 * Math.sin( r );
220 221

				r += 0.01;
M
Mr.doob 已提交
222 223 224

				webglRenderer.clear();
				webglRenderer.render( sceneCube, cameraCube );
225 226 227 228 229 230 231
				webglRenderer.render( scene, camera );

				stats.update();

			}

			function log(text) {
M
Mr.doob 已提交
232

233 234
				var e = document.getElementById("log");
				e.innerHTML = text + "<br/>" + e.innerHTML;
M
Mr.doob 已提交
235

236 237 238 239 240
			}
		</script>

	</body>
</html>