materials_cubemap.html 7.1 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 20 21 22 23 24 25
			canvas { pointer-events:none; z-index:10; position:relative; }
			#log { position:absolute; top:50px; text-align:left; display:block; z-index:100 }
			#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

106 107 108
				var cubeMaterial3 = new THREE.MeshLambertMaterial( { color: 0xffaa00, env_map: new THREE.TextureCube( images ) } );
				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 已提交
109 110 111

				createCube( 10000, images );

112
				webglRenderer = new THREE.WebGLRenderer( scene );
M
Mr.doob 已提交
113 114 115
				webglRenderer.setSize( window.innerWidth, window.innerHeight );
				webglRenderer.autoClear = false;
				webglRenderer.setFaceCulling( 0 );
116 117 118 119 120 121 122
				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 已提交
123

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

			}

M
Mr.doob 已提交
129 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
			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 已提交
157
			function createCube( size, images ) {
M
Mr.doob 已提交
158

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

				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 已提交
167 168
			}

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

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

173 174 175 176 177 178 179
				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 已提交
180

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

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

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

187 188 189 190
					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 已提交
191

192 193 194
				}

				return images;
M
Mr.doob 已提交
195

196
			}
M
Mr.doob 已提交
197

198 199
			function onDocumentMouseMove(event) {

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

			}

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

207 208 209 210
			function loop() {

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

				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 );
219 220

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

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

				stats.update();

			}

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

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

235 236 237 238 239
			}
		</script>

	</body>
</html>