Forráskód Böngészése

Improved vive dragging example.

Mr.doob 9 éve
szülő
commit
e09f0fb684
1 módosított fájl, 61 hozzáadás és 27 törlés
  1. 61 27
      examples/webvr_vive_dragging.html

+ 61 - 27
examples/webvr_vive_dragging.html

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html lang="en">
 	<head>
-		<title>three.js webvr - htc vive</title>
+		<title>three.js webvr - htc vive - dragging</title>
 		<meta charset="utf-8">
 		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
 		<style>
@@ -46,7 +46,7 @@
 			var raycaster, intersected = [];
 			var tempMatrix = new THREE.Matrix4();
 
-			var room, group;
+			var group;
 
 			init();
 			animate();
@@ -65,48 +65,68 @@
 				container.appendChild( info );
 
 				scene = new THREE.Scene();
+				scene.background = new THREE.Color( 0x808080 );
 
 				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.1, 10 );
 				scene.add( camera );
 
-				room = new THREE.Mesh(
-					new THREE.BoxGeometry( 6, 6, 6, 8, 8, 8 ),
-					new THREE.MeshBasicMaterial( { color: 0x404040, wireframe: true } )
-				);
-				room.position.y = 3;
-				scene.add( room );
+				var geometry = new THREE.PlaneGeometry( 4, 4 );
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0xeeeeee,
+					roughness: 1.0,
+					metalness: 0.0
+				} );
+				var floor = new THREE.Mesh( geometry, material );
+				floor.rotation.x = - Math.PI / 2;
+				floor.receiveShadow = true;
+				scene.add( floor );
 
-				scene.add( new THREE.HemisphereLight( 0x606060, 0x404040 ) );
+				scene.add( new THREE.HemisphereLight( 0x808080, 0x606060 ) );
 
 				var light = new THREE.DirectionalLight( 0xffffff );
-				light.position.set( 1, 1, 1 ).normalize();
+				light.position.set( 0, 6, 0 );
+				light.castShadow = true;
+				light.shadow.camera.top = 2;
+				light.shadow.camera.bottom = -2;
+				light.shadow.camera.right = 2;
+				light.shadow.camera.left = -2;
+				light.shadow.mapSize.set( 4096, 4096 );
 				scene.add( light );
 
 				group = new THREE.Group();
 				scene.add( group );
 
-				var geometry = new THREE.BoxGeometry( 0.2, 0.2, 0.2 );
+				var geometries = [
+					new THREE.BoxGeometry( 0.2, 0.2, 0.2 ),
+					new THREE.ConeGeometry( 0.2, 0.2, 64 ),
+					new THREE.CylinderGeometry( 0.2, 0.2, 0.2, 64 ),
+					new THREE.IcosahedronGeometry( 0.2, 3 ),
+					new THREE.TorusGeometry( 0.2, 0.04, 64, 32 )
+				];
+
+				for ( var i = 0; i < 50; i ++ ) {
 
-				for ( var i = 0; i < 200; i ++ ) {
+					var geometry = geometries[ Math.floor( Math.random() * geometries.length ) ];
+					var material = new THREE.MeshStandardMaterial( {
+						color: Math.random() * 0xffffff,
+						roughness: 0.7,
+						metalness: 0.0
+					} );
 
-					var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
+					var object = new THREE.Mesh( geometry, material );
 
 					object.position.x = Math.random() * 4 - 2;
-					object.position.y = Math.random() * 6;
+					object.position.y = Math.random() * 2;
 					object.position.z = Math.random() * 4 - 2;
 
 					object.rotation.x = Math.random() * 2 * Math.PI;
 					object.rotation.y = Math.random() * 2 * Math.PI;
 					object.rotation.z = Math.random() * 2 * Math.PI;
 
-					object.scale.x = Math.random() + 0.5;
-					object.scale.y = Math.random() + 0.5;
-					object.scale.z = Math.random() + 0.5;
+					object.scale.setScalar( Math.random() + 0.5 );
 
-					object.userData.velocity = new THREE.Vector3();
-					object.userData.velocity.x = Math.random() * 0.01 - 0.005;
-					object.userData.velocity.y = Math.random() * 0.01 - 0.005;
-					object.userData.velocity.z = Math.random() * 0.01 - 0.005;
+					object.castShadow = true;
+					object.receiveShadow = true;
 
 					group.add( object );
 
@@ -115,10 +135,11 @@
 				//
 
 				renderer = new THREE.WebGLRenderer( { antialias: true } );
-				renderer.setClearColor( 0x505050 );
 				renderer.setPixelRatio( window.devicePixelRatio );
 				renderer.setSize( window.innerWidth, window.innerHeight );
-				renderer.sortObjects = false;
+				renderer.shadowMap.enabled = true;
+				renderer.gammaInput = true;
+				renderer.gammaOutput = true;
 				container.appendChild( renderer.domElement );
 
 				controls = new THREE.VRControls( camera );
@@ -158,8 +179,11 @@
 
 				var geometry = new THREE.Geometry();
 				geometry.vertices.push( new THREE.Vector3( 0, 0, 0 ) );
-				geometry.vertices.push( new THREE.Vector3( 0, 0, - 5 ) );
+				geometry.vertices.push( new THREE.Vector3( 0, 0, - 1 ) );
+
 				var line = new THREE.Line( geometry );
+				line.name = 'line';
+				line.scale.z = 5;
 
 				controller1.add( line.clone() );
 				controller2.add( line.clone() );
@@ -207,6 +231,7 @@
 					var object = intersection.object;
 					object.matrix.premultiply( tempMatrix );
 					object.matrix.decompose( object.position, object.quaternion, object.scale );
+					object.material.emissive.b = 1;
 					controller.add( object );
 
 					controller.userData.selected = object;
@@ -222,9 +247,9 @@
 				if ( controller.userData.selected !== undefined ) {
 
 					var object = controller.userData.selected;
-
 					object.matrix.premultiply( controller.matrixWorld );
 					object.matrix.decompose( object.position, object.quaternion, object.scale );
+					object.material.emissive.b = 0;
 					group.add( object );
 
 					controller.userData.selected = undefined;
@@ -251,13 +276,22 @@
 
 				if ( controller.userData.selected !== undefined ) return;
 
+				var line = controller.getObjectByName( 'line' );
 				var intersections = getIntersections( controller );
 
 				if ( intersections.length > 0 ) {
 
 					var intersection = intersections[ 0 ];
-					intersection.object.material.emissive.r = 1;
-					intersected.push( intersection.object );
+
+					var object = intersection.object;
+					object.material.emissive.r = 1;
+					intersected.push( object );
+
+					line.scale.z = intersection.distance;
+
+				} else {
+
+					line.scale.z = 5;
 
 				}