webgl_objconvert_test.html 15.8 KB
Newer Older
U
unknown 已提交
1 2 3
<!DOCTYPE HTML>
<html lang="en">
	<head>
4
		<title>three.js webgl - io - OBJ converter</title>
U
unknown 已提交
5 6 7
		<meta charset="utf-8">
		<style type="text/css">
			body {
8
				background:#fff;
9
				padding:0;
10 11
				margin:0;
				overflow:hidden;
12 13
				font-family:georgia;
				text-align:center;
U
unknown 已提交
14
			}
15 16
			h1 { }
			a { color:skyblue }
17
			canvas { pointer-events:none; z-index:10; }
18
			#log { position:absolute; top:0; display:block; text-align:left; z-index:1000; pointer-events:none; }
19 20 21
			#d { text-align:center; margin:1em 0 -15.7em 0; z-index:0; position:relative; display:block }
			.button { background:#000; color:#fff; padding:0.2em 0.5em; cursor:pointer }
			.inactive { background:#999; color:#eee }
U
unknown 已提交
22 23
		</style>
	</head>
24

25 26 27 28 29 30 31 32
	<body>
		<div id="d">
			<h1>OBJ to Three.js converter test</h1>

			<span id="rcanvas" class="button inactive">2d canvas renderer</span>
			<span id="rwebgl" class="button">WebGL renderer</span>
			<br/>

33
			<p>Models by <a href="http://sketchup.google.com/3dwarehouse/details?mid=2c6fd128fca34052adc5f5b98d513da1">Reallusion</a>
34
			<a href="http://sketchup.google.com/3dwarehouse/details?mid=f526cc4abf7cb68d76cab47c765b7255">iClone</a>.
35

36
			<p>Using a modified version of <a href="http://github.com/alteredq/three.js">Three.js</a> by mrdoob.
37

38
			<br/>
39
			<p>Best viewed in Chrome 9 or Firefox 4 using WebGL renderer.
40 41
			<p>Canvas renderer is very slow on anything other than Chrome.
		</div>
42

43
		<pre id="log"></pre>
44

M
Mr.doob 已提交
45
<!--
46
		<script type="text/javascript" src="../build/Three.js"></script>
M
Mr.doob 已提交
47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
-->
		<script type="text/javascript" src="../src/Three.js"></script>
		<script type="text/javascript" src="../src/core/Color.js"></script>
		<script type="text/javascript" src="../src/core/Vector2.js"></script>
		<script type="text/javascript" src="../src/core/Vector3.js"></script>
		<script type="text/javascript" src="../src/core/Vector4.js"></script>
		<script type="text/javascript" src="../src/core/Ray.js"></script>
		<script type="text/javascript" src="../src/core/Rectangle.js"></script>
		<script type="text/javascript" src="../src/core/Matrix3.js"></script>
		<script type="text/javascript" src="../src/core/Matrix4.js"></script>
		<script type="text/javascript" src="../src/core/Object3D.js"></script>
		<script type="text/javascript" src="../src/core/Quaternion.js"></script>
		<script type="text/javascript" src="../src/core/Vertex.js"></script>
		<script type="text/javascript" src="../src/core/Face3.js"></script>
		<script type="text/javascript" src="../src/core/Face4.js"></script>
		<script type="text/javascript" src="../src/core/UV.js"></script>
		<script type="text/javascript" src="../src/core/Geometry.js"></script>
		<script type="text/javascript" src="../src/core/Spline.js"></script>
		<script type="text/javascript" src="../src/animation/AnimationHandler.js"></script>
		<script type="text/javascript" src="../src/animation/Animation.js"></script>
		<script type="text/javascript" src="../src/cameras/Camera.js"></script>
		<script type="text/javascript" src="../src/lights/Light.js"></script>
		<script type="text/javascript" src="../src/lights/AmbientLight.js"></script>
		<script type="text/javascript" src="../src/lights/DirectionalLight.js"></script>
		<script type="text/javascript" src="../src/lights/PointLight.js"></script>
		<script type="text/javascript" src="../src/materials/Material.js"></script>
		<script type="text/javascript" src="../src/materials/Mappings.js"></script>
		<script type="text/javascript" src="../src/materials/LineBasicMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshBasicMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshLambertMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshPhongMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshDepthMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshNormalMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshFaceMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/MeshShaderMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/ParticleBasicMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/ParticleCircleMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/ParticleDOMMaterial.js"></script>
		<script type="text/javascript" src="../src/materials/Texture.js"></script>
		<script type="text/javascript" src="../src/materials/RenderTarget.js"></script>
		<script type="text/javascript" src="../src/materials/Uniforms.js"></script>
		<script type="text/javascript" src="../src/objects/Particle.js"></script>
		<script type="text/javascript" src="../src/objects/ParticleSystem.js"></script>
		<script type="text/javascript" src="../src/objects/Line.js"></script>
		<script type="text/javascript" src="../src/objects/Mesh.js"></script>
		<script type="text/javascript" src="../src/objects/Bone.js"></script>
		<script type="text/javascript" src="../src/objects/SkinnedMesh.js"></script>
		<script type="text/javascript" src="../src/objects/Ribbon.js"></script>
		<script type="text/javascript" src="../src/objects/Sound.js"></script>
		<script type="text/javascript" src="../src/objects/LOD.js"></script>
		<script type="text/javascript" src="../src/scenes/Scene.js"></script>
		<script type="text/javascript" src="../src/scenes/Fog.js"></script>
		<script type="text/javascript" src="../src/scenes/FogExp2.js"></script>
		<script type="text/javascript" src="../src/renderers/Projector.js"></script>
		<script type="text/javascript" src="../src/renderers/DOMRenderer.js"></script>
		<script type="text/javascript" src="../src/renderers/CanvasRenderer.js"></script>
		<script type="text/javascript" src="../src/renderers/SVGRenderer.js"></script>
		<script type="text/javascript" src="../src/renderers/WebGLShaders.js"></script>
		<script type="text/javascript" src="../src/renderers/WebGLRenderer.js"></script>
		<script type="text/javascript" src="../src/renderers/SoundRenderer.js"></script>
		<script type="text/javascript" src="../src/renderers/renderables/RenderableObject.js"></script>
		<script type="text/javascript" src="../src/renderers/renderables/RenderableFace3.js"></script>
		<script type="text/javascript" src="../src/renderers/renderables/RenderableParticle.js"></script>
		<script type="text/javascript" src="../src/renderers/renderables/RenderableLine.js"></script>
		<script type="text/javascript" src="../src/extras/GeometryUtils.js"></script>
		<script type="text/javascript" src="../src/extras/ImageUtils.js"></script>
		<script type="text/javascript" src="../src/extras/SceneUtils.js"></script>
		<script type="text/javascript" src="../src/extras/ShaderUtils.js"></script>
		<script type="text/javascript" src="../src/extras/cameras/QuakeCamera.js"></script>
		<script type="text/javascript" src="../src/extras/cameras/PathCamera.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Cube.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Cylinder.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Icosahedron.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Lathe.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Plane.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Sphere.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/Torus.js"></script>
		<script type="text/javascript" src="../src/extras/geometries/TorusKnot.js"></script>
		<script type="text/javascript" src="../src/extras/io/Loader.js"></script>
		<script type="text/javascript" src="../src/extras/io/JSONLoader.js"></script>
		<script type="text/javascript" src="../src/extras/io/BinaryLoader.js"></script>
		<script type="text/javascript" src="../src/extras/objects/MarchingCubes.js"></script>
		
M
Mr.doob 已提交
130
		<script type="text/javascript" src="js/Detector.js"></script>
131
		<script type="text/javascript" src="js/RequestAnimationFrame.js"></script>
U
unknown 已提交
132 133 134 135 136 137
		<script type="text/javascript" src="js/Stats.js"></script>

		<script type="text/javascript">

			var SCREEN_WIDTH = window.innerWidth;
			var SCREEN_HEIGHT = window.innerHeight;
138
			var FLOOR = -250;
U
unknown 已提交
139

140
			var container,stats;
U
unknown 已提交
141

142
			var camera, scene;
U
unknown 已提交
143 144 145 146
			var canvasRenderer, webglRenderer;

			var mesh, zmesh, geometry;

147 148 149 150
			var mouseX = 0, mouseY = 0;

			var windowHalfX = window.innerWidth / 2;
			var windowHalfY = window.innerHeight / 2;
U
unknown 已提交
151

152 153
			var render_canvas = 1, render_gl = 1;
			var has_gl = 0;
154

155 156
			var bcanvas = document.getElementById("rcanvas");
			var bwebgl = document.getElementById("rwebgl");
157

U
unknown 已提交
158 159 160
			document.addEventListener('mousemove', onDocumentMouseMove, false);

			init();
161
			animate();
162

163 164 165
			render_canvas = !has_gl;
			bwebgl.style.display = has_gl ? "inline" : "none";
			bcanvas.className = render_canvas ? "button" : "button inactive";
166

U
unknown 已提交
167 168 169 170 171 172
			function init() {

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

				camera = new THREE.Camera( 75, SCREEN_WIDTH / SCREEN_HEIGHT, 1, 100000 );
173 174
				camera.position.z = 500;
				camera.updateMatrix();
U
unknown 已提交
175 176

				scene = new THREE.Scene();
177

178
				// GROUND
179

180 181 182 183 184 185 186 187 188 189 190 191 192
				var x = document.createElement( "canvas" );
				var xc = x.getContext("2d");
				x.width = x.height = 128;
				xc.fillStyle = "#fff";
				xc.fillRect(0, 0, 128, 128);
				xc.fillStyle = "#000";
				xc.fillRect(0, 0, 64, 64);
				xc.fillStyle = "#999";
				xc.fillRect(32, 32, 32, 32);
				xc.fillStyle = "#000";
				xc.fillRect(64, 64, 64, 64);
				xc.fillStyle = "#555";
				xc.fillRect(96, 96, 32, 32);
193 194

				var xm = new THREE.MeshBasicMaterial( { map: new THREE.Texture( x, THREE.UVMapping, THREE.RepeatWrapping, THREE.RepeatWrapping ) } );
A
alteredq 已提交
195 196
				xm.map.needsUpdate = true;
				
197
				geometry = new Plane( 100, 100, 15, 10 );
A
alteredq 已提交
198 199 200 201
				for( var i = 0; i < geometry.faceVertexUvs[ 0 ].length; i++ ) {
					
					var uvs = geometry.faceVertexUvs[ 0 ][ i ];
					
202
					for ( j = 0, jl = uvs.length; j < jl; j++ ) {
A
alteredq 已提交
203 204 205 206
					
						uvs[ j ].u *= 10;
						uvs[ j ].v *= 10;

207
					}
208

209 210 211 212 213 214 215
				}
				mesh = new THREE.Mesh( geometry, xm );
				mesh.position.x = 0;
				mesh.position.y = FLOOR;
				mesh.position.z = 0;
				mesh.rotation.x = 1.57;
				mesh.scale.x = mesh.scale.y = mesh.scale.z = 10;
216
				mesh.doubleSided = true;
217 218
				mesh.updateMatrix();
				scene.addObject(mesh);
219

220
				// SPHERES
221

222 223
				var material_spheres = new THREE.MeshLambertMaterial( { color: 0xdddddd } ),
					sphere = new Sphere( 100, 16, 8 );
224
				for (var i=0; i<10; i++) {
225
					mesh = new THREE.Mesh( sphere, material_spheres );
226 227 228 229 230 231 232 233
					mesh.position.x = 500 * (Math.random() - 0.5);
					mesh.position.y = 300 * (Math.random() - 0) + FLOOR;
					mesh.position.z = 100 * (Math.random() - 1);
					mesh.scale.x = mesh.scale.y = mesh.scale.z = 0.25 * (Math.random() + 0.5);
					mesh.overdraw = true;
					mesh.updateMatrix();
					scene.addObject(mesh);
				}
234

U
unknown 已提交
235 236 237 238 239 240 241

				// LIGHTS

				var ambient = new THREE.AmbientLight( 0x221100 );
				scene.addLight( ambient );

				var directionalLight = new THREE.DirectionalLight( 0xffeedd );
242 243
				directionalLight.position.y = -70;
				directionalLight.position.z = 100;
U
unknown 已提交
244 245 246 247
				directionalLight.position.normalize();
				scene.addLight( directionalLight );

				var pointLight = new THREE.PointLight( 0xff0000, 1 );
248
				//scene.addLight( pointLight );
U
unknown 已提交
249 250


251 252
				if ( render_gl ) {
					try {
253
						webglRenderer = new THREE.WebGLRenderer();
254
						webglRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
255
						webglRenderer.domElement.style.position = "relative";
256 257 258 259 260 261 262 263 264 265 266 267
						container.appendChild( webglRenderer.domElement );
						has_gl = 1;
					}
					catch (e) {
					}
				}

				if( render_canvas ) {
					canvasRenderer = new THREE.CanvasRenderer();
					canvasRenderer.setSize( SCREEN_WIDTH, SCREEN_HEIGHT );
					container.appendChild( canvasRenderer.domElement );
				}
U
unknown 已提交
268 269 270 271

				stats = new Stats();
				stats.domElement.style.position = 'absolute';
				stats.domElement.style.top = '0px';
272
				stats.domElement.style.zIndex = 100;
U
unknown 已提交
273
				container.appendChild( stats.domElement );
274

275 276
				bcanvas.addEventListener("click", toggleCanvas, false);
				bwebgl.addEventListener("click", toggleWebGL, false);
277

M
Mr.doob 已提交
278
				var loader = new THREE.JSONLoader(),
279 280
					callbackMale   = function( geometry ) { createScene( geometry,  90, 50, FLOOR, 105 ) },
					callbackFemale = function( geometry ) { createScene( geometry, -80, 50, FLOOR, 0 ) };
281

M
Mr.doob 已提交
282 283
				//loader.load( { model: "obj/male02/Male02_slim.js", callback: callbackMale } );
				//loader.load( { model: "obj/female02/Female02_slim.js", callback: callbackFemale } );
284

285 286
				//loader.loadBinary( { model: "obj/male02/Male02_bin.js", callback: callbackMale } );
				//loader.loadBinary( { model: "obj/female02/Female02_bin.js", callback: callbackFemale } );
287 288

			}
U
unknown 已提交
289

290
			function createScene( geometry, x, y, z, b ) {
291

292
				zmesh = new THREE.Mesh( geometry, new THREE.MeshFaceMaterial() );
293 294 295 296 297 298 299
				zmesh.position.x = x;
				zmesh.position.z = y;
				zmesh.position.y = z;
				zmesh.scale.x = zmesh.scale.y = zmesh.scale.z = 3;
				zmesh.overdraw = true;
				zmesh.updateMatrix();
				scene.addObject(zmesh);
300

301
				createMaterialsPalette( geometry.materials, 100, b );
302

U
unknown 已提交
303 304
			}

305
			function createMaterialsPalette( materials, size, bottom ) {
306

307
				for ( var i = 0; i < materials.length; ++i ) {
308

309 310 311 312 313 314 315 316 317
					// material
					mesh = new THREE.Mesh( new Plane( size, size ), materials[i] );
					mesh.position.x = i * (size + 5) - ( ( materials.length - 1 )* ( size + 5 )/2);
					mesh.position.y = FLOOR + size/2 + bottom;
					mesh.position.z = -100;
					mesh.scale.x = mesh.scale.y = mesh.scale.z = 1;
					mesh.doubleSided = true;
					mesh.updateMatrix();
					scene.addObject(mesh);
318

319 320 321 322 323 324 325 326 327
					// number
					var x = document.createElement( "canvas" );
					var xc = x.getContext("2d");
					x.width = x.height = 128;
					xc.shadowColor = "#000";
					xc.shadowBlur = 7;
					xc.fillStyle = "orange";
					xc.font = "50pt arial bold";
					xc.fillText(i, 10, 64);
328

M
Mr.doob 已提交
329
					var xm = new THREE.MeshBasicMaterial( { map: new THREE.Texture( x ) } );
A
alteredq 已提交
330
					xm.map.needsUpdate = true;
331

332 333 334 335 336 337 338 339 340
					mesh = new THREE.Mesh( new Plane( size, size ), xm );
					mesh.position.x = i * (size + 5) - ( ( materials.length - 1 )* ( size + 5 )/2);
					mesh.position.y = FLOOR + size/2 + bottom;
					mesh.position.z = -99;
					mesh.scale.x = mesh.scale.y = mesh.scale.z = 1;
					mesh.doubleSided = true;
					mesh.updateMatrix();
					scene.addObject(mesh);
				}
341

342
			}
343

U
unknown 已提交
344 345 346 347 348 349 350
			function onDocumentMouseMove(event) {

				mouseX = ( event.clientX - windowHalfX );
				mouseY = ( event.clientY - windowHalfY );

			}

351 352 353 354 355 356 357 358 359 360 361 362
			//

			function animate() {

				requestAnimationFrame( animate );

				render();
				stats.update();

			}

			function render() {
U
unknown 已提交
363 364 365 366 367

				camera.position.x += ( mouseX - camera.position.x ) * .05;
				camera.position.y += ( - mouseY - camera.position.y ) * .05;
				camera.updateMatrix();

368 369 370 371
				if ( zmesh && 0 ) {
					zmesh.rotation.y += 0.005;
					zmesh.updateMatrix();
				}
M
Mr.doob 已提交
372

U
unknown 已提交
373 374 375 376 377
				if ( render_canvas ) canvasRenderer.render( scene, camera );
				if ( render_gl && has_gl ) webglRenderer.render( scene, camera );

			}

378
			function log( text ) {
379

380 381
				var e = document.getElementById("log");
				e.innerHTML = text + "<br/>" + e.innerHTML;
382

383
			}
384

385
			function toggleCanvas() {
386

387 388
				render_canvas = !render_canvas;
				bcanvas.className = render_canvas ? "button" : "button inactive";
389

390 391
				render_gl = !render_canvas;
				bwebgl.className = render_gl ? "button" : "button inactive";
392

393 394
				if( has_gl )
					webglRenderer.domElement.style.display = render_gl ? "block" : "none";
395

396
				canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
397

398
			}
399

400
			function toggleWebGL() {
401

402 403
				render_gl = !render_gl;
				bwebgl.className = render_gl ? "button" : "button inactive";
404

405 406
				render_canvas = !render_gl;
				bcanvas.className = render_canvas ? "button" : "button inactive";
407

408 409
				if( has_gl )
					webglRenderer.domElement.style.display = render_gl ? "block" : "none";
410

411
				canvasRenderer.domElement.style.display = render_canvas ? "block" : "none";
412

413
			}
U
unknown 已提交
414 415 416 417
		</script>

	</body>
</html>