浏览代码

Added webvr_paint and webvr_sculpt. Removed webvr_vive.

Mr.doob 7 年之前
父节点
当前提交
8c24c6fddc
共有 4 个文件被更改,包括 750 次插入260 次删除
  1. 2 1
      examples/files.js
  2. 446 0
      examples/webvr_paint.html
  3. 302 0
      examples/webvr_sculpt.html
  4. 0 259
      examples/webvr_vive.html

+ 2 - 1
examples/files.js

@@ -327,10 +327,11 @@ var files = {
 		"webvr_dragging",
 		"webvr_lorenzattractor",
 		"webvr_panorama",
+		"webvr_paint",
 		"webvr_rollercoaster",
 		"webvr_sandbox",
+		"webvr_sculpt",
 		"webvr_video",
-		"webvr_vive",
 		"webvr_vive_paint",
 		"webvr_vive_sculpt"
 	],

+ 446 - 0
examples/webvr_paint.html

@@ -0,0 +1,446 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webvr - paint</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
+		<!-- Origin Trial Token, feature = WebVR (For Chrome M62+), origin = https://threejs.org, expires = 2018-08-30 -->
+		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2018-08-30" content="Ag80lPFLAvRyqP2W5I5XBzACxrTAQTWa3cXebXzq+WzW66nlQa6lvejGg1gdAMrzYbY6jUWp8g08kEnzb6svVgcAAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUzNTYzNjYxOX0=">
+		<!-- Origin Trial Token, feature = WebXR Device API, origin = https://threejs.org, expires = 2018-08-28 -->
+		<meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-08-28" content="Ag7nJS0Q6nBKfmRY1XLKHslnz73amLhaf8RoFpYz36MpMq0oa30AETLXer74BIwa3t8uDXlR0n4W9f/o674Rqw4AAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUzNTQxNDQwMH0=">
+		<!-- Origin Trial Token, feature = WebXR Gamepad Support, origin = https://threejs.org, expires = 2018-08-28 -->
+		<meta http-equiv="origin-trial" data-feature="WebXR Gamepad Support" data-expires="2018-08-28" content="AsflqqNG2L/Eepy8xSwCYwWH5U7w3nN7Ak137jGxMeBFz9lqQVcMBqMTcMw6ZkxThB7ZM2Cn7hgPqX++ZlgC9wMAAABYeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkdhbWVwYWRTdXBwb3J0IiwiZXhwaXJ5IjoxNTM1NDE0NDAwfQ==">
+		<style>
+			body {
+				font-family: Monospace;
+				background-color: #101010;
+				color: #fff;
+				margin: 0px;
+				overflow: hidden;
+			}
+			a {
+				color: #f00;
+			}
+		</style>
+	</head>
+	<body>
+
+		<script src="../build/three.js"></script>
+		<script src="js/vr/WebVR.js"></script>
+
+		<script src="js/loaders/OBJLoader.js"></script>
+
+		<script>
+
+			var container;
+			var camera, scene, renderer;
+			var controller1, controller2;
+
+			var line;
+			var shapes = {};
+
+			var up = new THREE.Vector3( 0, 1, 0 );
+			var vector = new THREE.Vector3();
+
+			var vector1 = new THREE.Vector3();
+			var vector2 = new THREE.Vector3();
+			var vector3 = new THREE.Vector3();
+			var vector4 = new THREE.Vector3();
+
+			var point4 = new THREE.Vector3();
+			var point5 = new THREE.Vector3();
+
+			init();
+			initGeometry();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				var info = document.createElement( 'div' );
+				info.style.position = 'absolute';
+				info.style.top = '10px';
+				info.style.width = '100%';
+				info.style.textAlign = 'center';
+				info.innerHTML = '<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - htc vive - paint';
+				container.appendChild( info );
+
+				scene = new THREE.Scene();
+				scene.background = new THREE.Color( 0x222222 );
+
+				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 50 );
+
+				var geometry = new THREE.BoxBufferGeometry( 0.5, 0.8, 0.5 );
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0x444444,
+					roughness: 1.0,
+					metalness: 0.0
+				} );
+				var table = new THREE.Mesh( geometry, material );
+				table.position.y = 0.35;
+				table.position.z = 0.85;
+				table.castShadow = true;
+				table.receiveShadow = true;
+				scene.add( table );
+
+				/*
+				var table = new THREE.Mesh( geometry, material );
+				table.position.y = 0.35;
+				table.position.z = -0.85;
+				table.castShadow = true;
+				table.receiveShadow = true;
+				scene.add( table );
+				*/
+
+				var geometry = new THREE.PlaneBufferGeometry( 4, 4 );
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0x222222,
+					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.GridHelper( 20, 40, 0x111111, 0x111111 ) );
+
+				scene.add( new THREE.HemisphereLight( 0x888877, 0x777788 ) );
+
+				var light = new THREE.DirectionalLight( 0xffffff );
+				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 );
+
+				// scene.add( new THREE.DirectionalLightHelper( light ) );
+				// scene.add( new THREE.CameraHelper( light.shadow.camera ) );
+
+				//
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.gammaInput = true;
+				renderer.gammaOutput = true;
+				renderer.shadowMap.enabled = true;
+				renderer.vr.enabled = true;
+				container.appendChild( renderer.domElement );
+
+				document.body.appendChild( WEBVR.createButton( renderer ) );
+
+				// controllers
+
+				function onSelectStart() {
+
+					this.userData.isSelecting = true;
+
+				}
+
+				function onSelectEnd() {
+
+					this.userData.isSelecting = false;
+
+				}
+
+				controller1 = renderer.vr.getController( 0 );
+				controller1.addEventListener( 'selectstart', onSelectStart );
+				controller1.addEventListener( 'selectend', onSelectEnd );
+				controller1.userData.points = [ new THREE.Vector3(), new THREE.Vector3() ];
+				controller1.userData.matrices = [ new THREE.Matrix4(), new THREE.Matrix4() ];
+				scene.add( controller1 );
+
+				controller2 = renderer.vr.getController( 1 );
+				controller2.addEventListener( 'selectstart', onSelectStart );
+				controller2.addEventListener( 'selectend', onSelectEnd );
+				controller2.userData.points = [ new THREE.Vector3(), new THREE.Vector3() ];
+				controller2.userData.matrices = [ new THREE.Matrix4(), new THREE.Matrix4() ];
+				scene.add( controller2 );
+
+				var loader = new THREE.OBJLoader();
+				loader.setPath( 'models/obj/vive-controller/' );
+				loader.load( 'vr_controller_vive_1_5.obj', function ( object ) {
+
+					var loader = new THREE.TextureLoader();
+					loader.setPath( 'models/obj/vive-controller/' );
+
+					var controller = object.children[ 0 ];
+					controller.material.map = loader.load( 'onepointfive_texture.png' );
+					controller.material.specularMap = loader.load( 'onepointfive_spec.png' );
+					controller.castShadow = true;
+					controller.receiveShadow = true;
+
+					// var pivot = new THREE.Group();
+					// var pivot = new THREE.Mesh( new THREE.BoxBufferGeometry( 0.01, 0.01, 0.01 ) );
+					var pivot = new THREE.Mesh( new THREE.IcosahedronBufferGeometry( 0.01, 2 ) );
+					pivot.name = 'pivot';
+					pivot.position.y = -0.016;
+					pivot.position.z = -0.043;
+					pivot.rotation.x = Math.PI / 5.5;
+					controller.add( pivot );
+
+					controller1.add( controller.clone() );
+
+					pivot.material = pivot.material.clone();
+					controller2.add( controller.clone() );
+
+				} );
+
+				//
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function initGeometry() {
+
+				var geometry = new THREE.BufferGeometry();
+
+				var positions = new THREE.BufferAttribute( new Float32Array( 1000000 * 3 ), 3 );
+				positions.dynamic = true;
+				geometry.addAttribute( 'position', positions );
+
+				var normals = new THREE.BufferAttribute( new Float32Array( 1000000 * 3 ), 3 );
+				normals.dynamic = true;
+				geometry.addAttribute( 'normal', normals );
+
+				var colors = new THREE.BufferAttribute( new Float32Array( 1000000 * 3 ), 3 );
+				colors.dynamic = true;
+				geometry.addAttribute( 'color', colors );
+
+				geometry.drawRange.count = 0;
+
+				//
+
+				/*
+				var path = "textures/cube/SwedishRoyalCastle/";
+				var format = '.jpg';
+				var urls = [
+					path + 'px' + format, path + 'nx' + format,
+					path + 'py' + format, path + 'ny' + format,
+					path + 'pz' + format, path + 'nz' + format
+				];
+
+				var reflectionCube = new THREE.CubeTextureLoader().load( urls );
+				*/
+
+				var material = new THREE.MeshStandardMaterial( {
+					roughness: 0.9,
+					metalness: 0.0,
+					// envMap: reflectionCube,
+					vertexColors: THREE.VertexColors,
+					side: THREE.DoubleSide
+				} );
+
+				line = new THREE.Mesh( geometry, material );
+				line.frustumCulled = false;
+				line.castShadow = true;
+				line.receiveShadow = true;
+				scene.add( line );
+
+				// Shapes
+				shapes[ 'tube' ] = getTubeShapes( 1.0 );
+			}
+
+			function getTubeShapes( size ) {
+
+				var PI2 = Math.PI * 2;
+
+				var sides = 10;
+				var array = [];
+				var radius = 0.01 * size;
+
+				for( var i = 0; i < sides; i ++ ) {
+
+					var angle = ( i / sides ) * PI2;
+					array.push( new THREE.Vector3( Math.sin( angle ) * radius, Math.cos( angle ) * radius, 0 ) );
+
+				}
+
+				return array;
+			}
+
+
+			function stroke( controller, point1, point2, matrix1, matrix2 ) {
+
+				var color = new THREE.Color( 0xffffff );
+				var size = 1;
+
+				var shapes = getTubeShapes( size );
+
+				var geometry = line.geometry;
+				var attributes = geometry.attributes;
+				var count = geometry.drawRange.count;
+
+				var positions = attributes.position.array;
+				var normals = attributes.normal.array;
+				var colors = attributes.color.array;
+
+				for ( var j = 0, jl = shapes.length; j < jl; j ++ ) {
+
+					var vertex1 = shapes[ j ];
+					var vertex2 = shapes[ ( j + 1 ) % jl ];
+
+					// positions
+
+					vector1.copy( vertex1 );
+					vector1.applyMatrix4( matrix2 );
+					vector1.add( point2 );
+
+					vector2.copy( vertex2 );
+					vector2.applyMatrix4( matrix2 );
+					vector2.add( point2 );
+
+					vector3.copy( vertex2 );
+					vector3.applyMatrix4( matrix1 );
+					vector3.add( point1 );
+
+					vector4.copy( vertex1 );
+					vector4.applyMatrix4( matrix1 );
+					vector4.add( point1 );
+
+					vector1.toArray( positions, ( count + 0 ) * 3 );
+					vector2.toArray( positions, ( count + 1 ) * 3 );
+					vector4.toArray( positions, ( count + 2 ) * 3 );
+
+					vector2.toArray( positions, ( count + 3 ) * 3 );
+					vector3.toArray( positions, ( count + 4 ) * 3 );
+					vector4.toArray( positions, ( count + 5 ) * 3 );
+
+					// normals
+
+					vector1.copy( vertex1 );
+					vector1.applyMatrix4( matrix2 );
+					vector1.normalize();
+
+					vector2.copy( vertex2 );
+					vector2.applyMatrix4( matrix2 );
+					vector2.normalize();
+
+					vector3.copy( vertex2 );
+					vector3.applyMatrix4( matrix1 );
+					vector3.normalize();
+
+					vector4.copy( vertex1 );
+					vector4.applyMatrix4( matrix1 );
+					vector4.normalize();
+
+					vector1.toArray( normals, ( count + 0 ) * 3 );
+					vector2.toArray( normals, ( count + 1 ) * 3 );
+					vector4.toArray( normals, ( count + 2 ) * 3 );
+
+					vector2.toArray( normals, ( count + 3 ) * 3 );
+					vector3.toArray( normals, ( count + 4 ) * 3 );
+					vector4.toArray( normals, ( count + 5 ) * 3 );
+
+					// colors
+
+					color.toArray( colors, ( count + 0 ) * 3 );
+					color.toArray( colors, ( count + 1 ) * 3 );
+					color.toArray( colors, ( count + 2 ) * 3 );
+
+					color.toArray( colors, ( count + 3 ) * 3 );
+					color.toArray( colors, ( count + 4 ) * 3 );
+					color.toArray( colors, ( count + 5 ) * 3 );
+
+					count += 6;
+
+				}
+
+				geometry.drawRange.count = count;
+
+			}
+
+			function updateGeometry( start, end ) {
+
+				if ( start === end ) return;
+
+				var offset = start * 3;
+				var count = ( end - start ) * 3;
+
+				var geometry = line.geometry;
+				var attributes = geometry.attributes;
+
+				attributes.position.updateRange.offset = offset;
+				attributes.position.updateRange.count = count;
+				attributes.position.needsUpdate = true;
+
+				attributes.normal.updateRange.offset = offset;
+				attributes.normal.updateRange.count = count;
+				attributes.normal.needsUpdate = true;
+
+				attributes.color.updateRange.offset = offset;
+				attributes.color.updateRange.count = count;
+				attributes.color.needsUpdate = true;
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function handleController( controller ) {
+
+				var pivot = controller.getObjectByName( 'pivot' );
+
+				if ( pivot ) {
+
+					var matrix = pivot.matrixWorld;
+
+					var point1 = controller.userData.points[ 0 ];
+					var point2 = controller.userData.points[ 1 ];
+
+					var matrix1 = controller.userData.matrices[ 0 ];
+					var matrix2 = controller.userData.matrices[ 1 ];
+
+					point1.setFromMatrixPosition( matrix );
+					matrix1.lookAt( point2, point1, up );
+
+					if ( controller.userData.isSelecting === true ) {
+
+						stroke( controller, point1, point2, matrix1, matrix2 );
+
+					}
+
+					point2.copy( point1 );
+					matrix2.copy( matrix1 );
+
+				}
+
+			}
+
+			function animate() {
+
+				renderer.setAnimationLoop( render );
+
+			}
+
+			function render() {
+
+				var count = line.geometry.drawRange.count;
+
+				handleController( controller1 );
+				handleController( controller2 );
+
+				updateGeometry( count, line.geometry.drawRange.count );
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+	</body>
+</html>

+ 302 - 0
examples/webvr_sculpt.html

@@ -0,0 +1,302 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<title>three.js webvr - sculpt</title>
+		<meta charset="utf-8">
+		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
+		<!-- Origin Trial Token, feature = WebVR (For Chrome M62+), origin = https://threejs.org, expires = 2018-08-30 -->
+		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2018-08-30" content="Ag80lPFLAvRyqP2W5I5XBzACxrTAQTWa3cXebXzq+WzW66nlQa6lvejGg1gdAMrzYbY6jUWp8g08kEnzb6svVgcAAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUzNTYzNjYxOX0=">
+		<!-- Origin Trial Token, feature = WebXR Device API, origin = https://threejs.org, expires = 2018-08-28 -->
+		<meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-08-28" content="Ag7nJS0Q6nBKfmRY1XLKHslnz73amLhaf8RoFpYz36MpMq0oa30AETLXer74BIwa3t8uDXlR0n4W9f/o674Rqw4AAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUzNTQxNDQwMH0=">
+		<!-- Origin Trial Token, feature = WebXR Gamepad Support, origin = https://threejs.org, expires = 2018-08-28 -->
+		<meta http-equiv="origin-trial" data-feature="WebXR Gamepad Support" data-expires="2018-08-28" content="AsflqqNG2L/Eepy8xSwCYwWH5U7w3nN7Ak137jGxMeBFz9lqQVcMBqMTcMw6ZkxThB7ZM2Cn7hgPqX++ZlgC9wMAAABYeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkdhbWVwYWRTdXBwb3J0IiwiZXhwaXJ5IjoxNTM1NDE0NDAwfQ==">
+		<style>
+			body {
+				font-family: Monospace;
+				background-color: #101010;
+				color: #fff;
+				margin: 0px;
+				overflow: hidden;
+			}
+			a {
+				color: #f00;
+			}
+		</style>
+	</head>
+	<body>
+
+		<script src="../build/three.js"></script>
+		<script src="js/vr/WebVR.js"></script>
+
+		<script src="js/loaders/OBJLoader.js"></script>
+		<script src="js/MarchingCubes.js"></script>
+
+		<script>
+
+			var container;
+			var camera, scene, renderer;
+			var controller1, controller2;
+
+			var blob, vector;
+
+			var points = [];
+
+			init();
+			initBlob();
+			animate();
+
+			function init() {
+
+				container = document.createElement( 'div' );
+				document.body.appendChild( container );
+
+				var info = document.createElement( 'div' );
+				info.style.position = 'absolute';
+				info.style.top = '10px';
+				info.style.width = '100%';
+				info.style.textAlign = 'center';
+				info.innerHTML = '<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - htc vive - sculpt';
+				container.appendChild( info );
+
+				scene = new THREE.Scene();
+				scene.background = new THREE.Color( 0x222222 );
+
+				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 50 );
+
+				var geometry = new THREE.BoxBufferGeometry( 0.5, 0.8, 0.5 );
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0x444444,
+					roughness: 1.0,
+					metalness: 0.0
+				} );
+				var table = new THREE.Mesh( geometry, material );
+				table.position.y = 0.35;
+				table.position.z = 0.85;
+				table.castShadow = true;
+				table.receiveShadow = true;
+				scene.add( table );
+
+				var geometry = new THREE.PlaneBufferGeometry( 4, 4 );
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0x222222,
+					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.GridHelper( 20, 40, 0x111111, 0x111111 ) );
+
+				scene.add( new THREE.HemisphereLight( 0x888877, 0x777788 ) );
+
+				var light = new THREE.DirectionalLight( 0xffffff );
+				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 );
+
+				// scene.add( new THREE.DirectionalLightHelper( light ) );
+				// scene.add( new THREE.CameraHelper( light.shadow.camera ) );
+
+				//
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setPixelRatio( window.devicePixelRatio );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				renderer.gammaInput = true;
+				renderer.gammaOutput = true;
+				renderer.shadowMap.enabled = true;
+				renderer.vr.enabled = true;
+				container.appendChild( renderer.domElement );
+
+				document.body.appendChild( WEBVR.createButton( renderer ) );
+
+				// controllers
+
+				function onSelectStart() {
+
+					this.userData.isSelecting = true;
+
+				}
+
+				function onSelectEnd() {
+
+					this.userData.isSelecting = false;
+
+				}
+
+				controller1 = renderer.vr.getController( 0 );
+				controller1.addEventListener( 'selectstart', onSelectStart );
+				controller1.addEventListener( 'selectend', onSelectEnd );
+				controller1.userData.id = 0;
+				scene.add( controller1 );
+
+				controller2 = renderer.vr.getController( 1 );
+				controller2.addEventListener( 'selectstart', onSelectStart );
+				controller2.addEventListener( 'selectend', onSelectEnd );
+				controller2.userData.id = 1;
+				scene.add( controller2 );
+
+				var loader = new THREE.OBJLoader();
+				loader.setPath( 'models/obj/vive-controller/' );
+				loader.load( 'vr_controller_vive_1_5.obj', function ( object ) {
+
+					var loader = new THREE.TextureLoader();
+					loader.setPath( 'models/obj/vive-controller/' );
+
+					var controller = object.children[ 0 ];
+					controller.material.map = loader.load( 'onepointfive_texture.png' );
+					controller.material.specularMap = loader.load( 'onepointfive_spec.png' );
+					controller.castShadow = true;
+					controller.receiveShadow = true;
+
+					// var pivot = new THREE.Mesh( new THREE.BoxBufferGeometry( 0.01, 0.01, 0.01 ) );
+					var pivot = new THREE.Mesh( new THREE.IcosahedronBufferGeometry( 0.002, 2 ), blob.material );
+					pivot.name = 'pivot';
+					pivot.position.y = -0.016;
+					pivot.position.z = -0.043;
+					pivot.rotation.x = Math.PI / 5.5;
+					controller.add( pivot );
+
+					var range = new THREE.Mesh( new THREE.IcosahedronGeometry( 0.03, 3 ), new THREE.MeshBasicMaterial( { opacity: 0.25, transparent: true } ) );
+					pivot.add( range );
+
+					controller1.add( controller.clone() );
+					controller2.add( controller.clone() );
+
+				} );
+
+
+				//
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function initBlob() {
+
+				/*
+				var path = "textures/cube/SwedishRoyalCastle/";
+				var format = '.jpg';
+				var urls = [
+					path + 'px' + format, path + 'nx' + format,
+					path + 'py' + format, path + 'ny' + format,
+					path + 'pz' + format, path + 'nz' + format
+				];
+
+				var reflectionCube = new THREE.CubeTextureLoader().load( urls );
+				*/
+
+				var material = new THREE.MeshStandardMaterial( {
+					color: 0xffffff,
+					// envMap: reflectionCube,
+					roughness: 0.9,
+					metalness: 0.0
+				} );
+
+				blob = new THREE.MarchingCubes( 64, material, true );
+				blob.position.y = 1;
+				scene.add( blob );
+
+				initPoints();
+
+			}
+
+			function initPoints() {
+
+				points = [
+					{ position: new THREE.Vector3(), strength:   0.04, subtract: 10 },
+					{ position: new THREE.Vector3(), strength: - 0.08, subtract: 10 }
+				];
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			//
+
+			function animate() {
+
+				renderer.setAnimationLoop( render );
+
+			}
+
+			function transformPoint( vector ) {
+
+				vector.x = ( vector.x + 1.0 ) / 2.0;
+				vector.y = ( vector.y / 2.0 );
+				vector.z = ( vector.z + 1.0 ) / 2.0;
+
+			}
+
+			function handleController( controller ) {
+
+				var pivot = controller.getObjectByName( 'pivot' );
+
+				if ( pivot ) {
+
+					var id = controller.userData.id;
+					var matrix = pivot.matrixWorld;
+
+					points[ id ].position.setFromMatrixPosition( matrix );
+					transformPoint( points[ id ].position );
+
+					if ( controller.userData.isSelecting ) {
+
+						var strength = points[ id ].strength / 2;
+
+						var vector = new THREE.Vector3().setFromMatrixPosition( matrix );
+
+						transformPoint( vector );
+
+						points.push( { position: vector, strength: strength, subtract: 10 } );
+
+					}
+
+				}
+
+			}
+
+			function updateBlob() {
+
+				blob.reset();
+
+				for ( var i = 0; i < points.length; i ++ ) {
+
+					var point = points[ i ];
+					var position = point.position;
+
+					blob.addBall( position.x, position.y, position.z, point.strength, point.subtract );
+
+				}
+
+			}
+
+			function render() {
+
+				handleController( controller1 );
+				handleController( controller2 );
+
+				updateBlob();
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+	</body>
+</html>

+ 0 - 259
examples/webvr_vive.html

@@ -1,259 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-	<head>
-		<title>three.js webvr - htc vive</title>
-		<meta charset="utf-8">
-		<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
-		<!-- Origin Trial Token, feature = WebVR (For Chrome M62+), origin = https://threejs.org, expires = 2018-08-30 -->
-		<meta http-equiv="origin-trial" data-feature="WebVR (For Chrome M62+)" data-expires="2018-08-30" content="Ag80lPFLAvRyqP2W5I5XBzACxrTAQTWa3cXebXzq+WzW66nlQa6lvejGg1gdAMrzYbY6jUWp8g08kEnzb6svVgcAAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJWUjEuMU02MiIsImV4cGlyeSI6MTUzNTYzNjYxOX0=">
-		<!-- Origin Trial Token, feature = WebXR Device API, origin = https://threejs.org, expires = 2018-08-28 -->
-		<meta http-equiv="origin-trial" data-feature="WebXR Device API" data-expires="2018-08-28" content="Ag7nJS0Q6nBKfmRY1XLKHslnz73amLhaf8RoFpYz36MpMq0oa30AETLXer74BIwa3t8uDXlR0n4W9f/o674Rqw4AAABQeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkRldmljZSIsImV4cGlyeSI6MTUzNTQxNDQwMH0=">
-		<!-- Origin Trial Token, feature = WebXR Gamepad Support, origin = https://threejs.org, expires = 2018-08-28 -->
-		<meta http-equiv="origin-trial" data-feature="WebXR Gamepad Support" data-expires="2018-08-28" content="AsflqqNG2L/Eepy8xSwCYwWH5U7w3nN7Ak137jGxMeBFz9lqQVcMBqMTcMw6ZkxThB7ZM2Cn7hgPqX++ZlgC9wMAAABYeyJvcmlnaW4iOiJodHRwczovL3RocmVlanMub3JnOjQ0MyIsImZlYXR1cmUiOiJXZWJYUkdhbWVwYWRTdXBwb3J0IiwiZXhwaXJ5IjoxNTM1NDE0NDAwfQ==">
-		<style>
-			body {
-				font-family: Monospace;
-				background-color: #101010;
-				color: #fff;
-				margin: 0px;
-				overflow: hidden;
-			}
-			a {
-				color: #f00;
-			}
-		</style>
-	</head>
-	<body>
-
-		<script src="../build/three.js"></script>
-
-		<script src="js/vr/ViveController.js"></script>
-		<script src="js/vr/WebVR.js"></script>
-
-		<script src="js/loaders/OBJLoader.js"></script>
-
-		<script>
-
-			var clock = new THREE.Clock();
-
-			var container;
-			var camera, scene, renderer;
-			var controller1, controller2;
-
-			var room;
-
-			init();
-			animate();
-
-			function init() {
-
-				container = document.createElement( 'div' );
-				document.body.appendChild( container );
-
-				var info = document.createElement( 'div' );
-				info.style.position = 'absolute';
-				info.style.top = '10px';
-				info.style.width = '100%';
-				info.style.textAlign = 'center';
-				info.innerHTML = '<a href="http://threejs.org" target="_blank" rel="noopener">three.js</a> webgl - htc vive';
-				container.appendChild( info );
-
-				scene = new THREE.Scene();
-				scene.background = new THREE.Color( 0x505050 );
-
-				camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.1, 10 );
-
-				room = new THREE.Mesh(
-					new THREE.BoxBufferGeometry( 6, 6, 6, 8, 8, 8 ),
-					new THREE.MeshBasicMaterial( { color: 0x404040, wireframe: true } )
-				);
-				room.position.y = 3;
-				scene.add( room );
-
-				scene.add( new THREE.HemisphereLight( 0x606060, 0x404040 ) );
-
-				var light = new THREE.DirectionalLight( 0xffffff );
-				light.position.set( 1, 1, 1 ).normalize();
-				scene.add( light );
-
-				var geometry = new THREE.BoxBufferGeometry( 0.2, 0.2, 0.2 );
-
-				for ( var i = 0; i < 200; i ++ ) {
-
-					var object = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial( { color: Math.random() * 0xffffff } ) );
-
-					object.position.x = Math.random() * 4 - 2;
-					object.position.y = Math.random() * 4 - 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.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;
-
-					room.add( object );
-
-				}
-
-				var material = new THREE.MeshStandardMaterial();
-
-				var loader = new THREE.OBJLoader();
-				loader.setPath( 'models/obj/cerberus/' );
-				loader.load( 'Cerberus.obj', function ( group ) {
-
-					// var material = new THREE.MeshBasicMaterial( { wireframe: true } );
-
-					var loader = new THREE.TextureLoader();
-					loader.setPath( 'models/obj/cerberus/' );
-
-					material.roughness = 1;
-					material.metalness = 1;
-
-					material.map = loader.load( 'Cerberus_A.jpg' );
-					material.roughnessMap = loader.load( 'Cerberus_R.jpg' );
-					material.metalnessMap = loader.load( 'Cerberus_M.jpg' );
-					material.normalMap = loader.load( 'Cerberus_N.jpg' );
-
-					material.map.wrapS = THREE.RepeatWrapping;
-					material.roughnessMap.wrapS = THREE.RepeatWrapping;
-					material.metalnessMap.wrapS = THREE.RepeatWrapping;
-					material.normalMap.wrapS = THREE.RepeatWrapping;
-
-					group.traverse( function ( child ) {
-
-						if ( child instanceof THREE.Mesh ) {
-
-							child.material = material;
-
-						}
-
-					} );
-
-					group.position.y = - 2;
-					group.rotation.y = - Math.PI / 2;
-					room.add( group );
-
-				} );
-
-				var loader = new THREE.CubeTextureLoader();
-				loader.setPath( 'textures/cube/pisa/' );
-				material.envMap = loader.load( [
-					"px.png", "nx.png",
-					"py.png", "ny.png",
-					"pz.png", "nz.png"
-				] );
-
-				//
-
-				renderer = new THREE.WebGLRenderer( { antialias: true } );
-				renderer.setPixelRatio( window.devicePixelRatio );
-				renderer.setSize( window.innerWidth, window.innerHeight );
-				renderer.vr.enabled = true;
-				container.appendChild( renderer.domElement );
-
-				document.body.appendChild( WEBVR.createButton( renderer ) );
-
-				// controllers
-
-				controller1 = new THREE.ViveController( 0 );
-				controller1.standingMatrix = renderer.vr.getStandingMatrix();
-				scene.add( controller1 );
-
-				controller2 = new THREE.ViveController( 1 );
-				controller2.standingMatrix = renderer.vr.getStandingMatrix();
-				scene.add( controller2 );
-
-				var loader = new THREE.OBJLoader();
-				loader.setPath( 'models/obj/vive-controller/' );
-				loader.load( 'vr_controller_vive_1_5.obj', function ( object ) {
-
-					var loader = new THREE.TextureLoader();
-					loader.setPath( 'models/obj/vive-controller/' );
-
-					var controller = object.children[ 0 ];
-					controller.material.map = loader.load( 'onepointfive_texture.png' );
-					controller.material.specularMap = loader.load( 'onepointfive_spec.png' );
-
-					controller1.add( object.clone() );
-					controller2.add( object.clone() );
-
-				} );
-
-				//
-
-				window.addEventListener( 'resize', onWindowResize, false );
-
-			}
-
-			function onWindowResize() {
-
-				camera.aspect = window.innerWidth / window.innerHeight;
-				camera.updateProjectionMatrix();
-
-				renderer.setSize( window.innerWidth, window.innerHeight );
-
-			}
-
-			function animate() {
-
-				renderer.setAnimationLoop( render );
-
-			}
-
-			//
-
-			function render() {
-
-				var delta = clock.getDelta() * 60;
-
-				controller1.update();
-				controller2.update();
-
-				for ( var i = 0; i < room.children.length; i ++ ) {
-
-					var cube = room.children[ i ];
-
-					if ( cube.geometry instanceof THREE.BoxBufferGeometry === false ) continue;
-
-					// cube.position.add( cube.userData.velocity );
-
-					if ( cube.position.x < - 3 || cube.position.x > 3 ) {
-
-						cube.position.x = THREE.Math.clamp( cube.position.x, - 3, 3 );
-						cube.userData.velocity.x = - cube.userData.velocity.x;
-
-					}
-
-					if ( cube.position.y < - 3 || cube.position.y > 3 ) {
-
-						cube.position.y = THREE.Math.clamp( cube.position.y, - 3, 3 );
-						cube.userData.velocity.y = - cube.userData.velocity.y;
-
-					}
-
-					if ( cube.position.z < - 3 || cube.position.z > 3 ) {
-
-						cube.position.z = THREE.Math.clamp( cube.position.z, - 3, 3 );
-						cube.userData.velocity.z = - cube.userData.velocity.z;
-
-					}
-
-					cube.rotation.x += 0.01 * delta;
-
-				}
-
-				renderer.render( scene, camera );
-
-			}
-
-		</script>
-	</body>
-</html>