webgl_collisions_normal.html 5.0 KB
Newer Older
1 2 3 4 5 6
<!doctype html>
<html lang="en">
	<head> 
		<title>three.js webgl - intersection: ray/mesh readinf normal</title> 
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
M
Mr.doob 已提交
7
		<style> 
8 9 10 11 12 13 14 15
			body {
				font-family: Monospace;
				background-color: #f0f0f0;
				margin: 0px;
				overflow: hidden;
			}
			 
			#oldie { background-color: #ddd !important }
M
Mr.doob 已提交
16

17 18 19 20 21 22 23 24 25 26
			#info {
				position: absolute;
				top: 30px; left: 10px; width: 800px;
				color: #000000;
				padding: 5px;
				font-family: Monospace;
				font-size: 13px;
				text-align: left;
				z-index:100;
			}
M
Mr.doob 已提交
27

28 29 30 31 32 33 34 35 36 37 38 39
			#options {
				position: absolute;
				top: 10px; left: 10px; width: 800px;
				color: #000000;
				padding: 5px;
				font-family: Monospace;
				font-size: 13px;
				text-align: left;
				z-index:100;
			}
		</style>
		 
M
Mr.doob 已提交
40 41 42
		<script src="../build/Three.js"></script> 
		<script src="js/RequestAnimationFrame.js"></script>
		<script src="js/Stats.js"></script>
M
Mr.doob 已提交
43

M
Mr.doob 已提交
44
		<script> 
M
Mr.doob 已提交
45

46 47
			var camera, scene, projector, renderer,
			info, mouse = { x: 0, y: 0 }, sun, loader, stats, line;
M
Mr.doob 已提交
48

49
			var meshes = [];
M
Mr.doob 已提交
50

51 52
			var theta = 0;
			var camdist = 500;
M
Mr.doob 已提交
53

54
			var totalFaces = 0, totalColliders = 0;
M
Mr.doob 已提交
55

56
			function init() {
M
Mr.doob 已提交
57

58 59
				container = document.createElement( 'div' );
				document.body.appendChild( container );
M
Mr.doob 已提交
60
	
61
				info = document.getElementById("info");
M
Mr.doob 已提交
62
	
63 64
				camera = new THREE.Camera( 40, window.innerWidth / window.innerHeight, 1, 10000 );
				camera.position.z = camdist;
M
Mr.doob 已提交
65
	
66
				loader = new THREE.JSONLoader(  );
M
Mr.doob 已提交
67

68
				scene = new THREE.Scene();
M
Mr.doob 已提交
69

70
				projector = new THREE.Projector();
M
Mr.doob 已提交
71

72 73 74
				renderer = new THREE.WebGLRenderer();
				renderer.setSize( window.innerWidth, window.innerHeight );
				container.appendChild( renderer.domElement );
M
Mr.doob 已提交
75
	
76 77
				var ambientLight = new THREE.AmbientLight( 0x606060 );
				scene.add( ambientLight );
M
Mr.doob 已提交
78

79 80 81
				sun = new THREE.DirectionalLight( 0xffffff );
				sun.position = camera.position.clone();
				scene.add( sun );
M
Mr.doob 已提交
82
	
83
				loadCube();
M
Mr.doob 已提交
84
	
85
				var lineMat = new THREE.LineBasicMaterial( { color: 0xff0000, opacity: 1, linewidth: 3 } );
M
Mr.doob 已提交
86
	
87 88 89
				var geom = new THREE.Geometry();
				geom.vertices.push( new THREE.Vertex( new THREE.Vector3(-100, 0, 0) ) );
				geom.vertices.push( new THREE.Vertex( new THREE.Vector3( 100, 0, 0) ) );
M
Mr.doob 已提交
90
	
91 92
				line = new THREE.Line(geom, lineMat);
				scene.add( line );
M
Mr.doob 已提交
93

94 95 96 97
				stats = new Stats();
				stats.domElement.style.position = 'absolute';
				stats.domElement.style.top = '0px';
				container.appendChild( stats.domElement );
M
Mr.doob 已提交
98

99 100
				container.onmousemove = onDocumentMouseMove;
				animate();
M
Mr.doob 已提交
101

102
			}
M
Mr.doob 已提交
103

104
			function loadCube(p) {
M
Mr.doob 已提交
105

106
				var onGeometry = function( geometry ) {	
M
Mr.doob 已提交
107
	
108 109 110
					var sx = 300;
					var sy = 240;
					var sz = 300;
M
Mr.doob 已提交
111
		
112
					addCube( new THREE.Vector3(	0,	0,	0), geometry );
M
Mr.doob 已提交
113
		
114
				};
M
Mr.doob 已提交
115 116

	
117 118
				loader.load( { model: "obj/suzanne/suzanneHi.js", callback: onGeometry } );
			}
M
Mr.doob 已提交
119

120
			function addCube( p, g) {
M
Mr.doob 已提交
121

122 123
				totalFaces += g.faces.length;
				totalColliders++;
M
Mr.doob 已提交
124

125 126
				var mesh = new THREE.Mesh( g, new THREE.MeshLambertMaterial( { color: 0x003300 } ) );
				mesh.position = p;
M
Mr.doob 已提交
127

128 129 130 131
				scene.add( mesh );
				var mc = THREE.CollisionUtils.MeshColliderWBox(mesh);
				THREE.Collisions.colliders.push( mc );
				meshes.push( mesh );
M
Mr.doob 已提交
132

133
			};
M
Mr.doob 已提交
134

135
			function onDocumentMouseMove( event ) {
M
Mr.doob 已提交
136

137 138 139
				event.preventDefault();	
				mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
				mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
M
Mr.doob 已提交
140

141
			};
M
Mr.doob 已提交
142 143


144
			function animate() {
M
Mr.doob 已提交
145

146
				requestAnimationFrame( animate );
M
Mr.doob 已提交
147

148 149
				var vector = new THREE.Vector3( mouse.x, mouse.y, 0.5 );
				projector.unprojectVector( vector, camera );
M
Mr.doob 已提交
150

151
				var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
M
Mr.doob 已提交
152
	
153
				if ( meshes.length == 0 ) return;
M
Mr.doob 已提交
154
	
155
				var i, l = meshes.length;
M
Mr.doob 已提交
156
	
157 158 159
				for ( i = 0; i < l; i++ ) {
					meshes[ i ].materials[ 0 ].color.setHex( 0x003300 );
				}
M
Mr.doob 已提交
160
	
161
				info.innerHTML = "";
M
Mr.doob 已提交
162 163


164
				var c = THREE.Collisions.rayCastNearest( ray );
M
Mr.doob 已提交
165
	
166
				if( c ) {
M
Mr.doob 已提交
167
	
168
					info.innerHTML += "Found @ normal " + vts(c.normal);
M
Mr.doob 已提交
169
		
170 171 172 173 174
					var poi = ray.origin.clone().addSelf( ray.direction.clone().multiplyScalar(c.distance) );
					line.geometry.vertices[0].position = poi;
					line.geometry.vertices[1].position = poi.clone().addSelf(c.normal.multiplyScalar(100));
					line.geometry.__dirtyVertices = true; 
					line.geometry.__dirtyElements = true;
M
Mr.doob 已提交
175
		
176
					c.mesh.materials[ 0 ].color.setHex( 0xbb0000 );
M
Mr.doob 已提交
177

178
				} else {
M
Mr.doob 已提交
179
	
180
					info.innerHTML += "No intersection";
M
Mr.doob 已提交
181

182
				}
M
Mr.doob 已提交
183

184 185 186
				camera.position.x = camdist * Math.cos( theta );
				camera.position.z = camdist * Math.sin( theta );
				camera.position.y = camdist/2 * Math.sin( theta * 2) ;
M
Mr.doob 已提交
187

188 189
				sun.position.copy( camera.position );
				sun.position.normalize();
M
Mr.doob 已提交
190

191
				theta += 0.005;		
M
Mr.doob 已提交
192

193
				renderer.render( scene, camera );
M
Mr.doob 已提交
194
	
195
				stats.update();
M
Mr.doob 已提交
196
	
197
			};
M
Mr.doob 已提交
198

199
			function vts(v) {
M
Mr.doob 已提交
200

201 202
				if(!v) return "undefined<br>";
				else return v.x.toFixed(2) + " , " + v.y.toFixed(2) + " , " + v.z.toFixed(2) + "<br>";
M
Mr.doob 已提交
203

204
			};
M
Mr.doob 已提交
205

206
		</script>
M
Mr.doob 已提交
207

208
	</head> 
M
Mr.doob 已提交
209

210 211 212 213
	<body onload="init();"> 
		<div id="info"></div>
		<div id="options"></div>
	</body> 
M
Mr.doob 已提交
214 215

</html>