|
@@ -0,0 +1,315 @@
|
|
|
+<!DOCTYPE html>
|
|
|
+<html lang="en">
|
|
|
+ <head>
|
|
|
+ <title>three.js webgl - interactive - buffergeometry</title>
|
|
|
+ <meta charset="utf-8">
|
|
|
+ <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
|
|
|
+ <style>
|
|
|
+ body {
|
|
|
+ color: #cccccc;
|
|
|
+ font-family:Monospace;
|
|
|
+ font-size:13px;
|
|
|
+ text-align:center;
|
|
|
+
|
|
|
+ background-color: #050505;
|
|
|
+ margin: 0px;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+
|
|
|
+ #info {
|
|
|
+ position: absolute;
|
|
|
+ top: 0px; width: 100%;
|
|
|
+ padding: 5px;
|
|
|
+ }
|
|
|
+
|
|
|
+ a {
|
|
|
+
|
|
|
+ color: #0080ff;
|
|
|
+ }
|
|
|
+
|
|
|
+ </style>
|
|
|
+ </head>
|
|
|
+ <body>
|
|
|
+
|
|
|
+ <div id="container"></div>
|
|
|
+ <div id="info"><a href="http://threejs.org" target="_blank">three.js</a> webgl - interactive - buffergeometry</div>
|
|
|
+
|
|
|
+ <script src="../build/three.min.js"></script>
|
|
|
+
|
|
|
+ <script src="js/Detector.js"></script>
|
|
|
+ <script src="js/libs/stats.min.js"></script>
|
|
|
+
|
|
|
+ <script>
|
|
|
+
|
|
|
+ if ( ! Detector.webgl ) Detector.addGetWebGLMessage();
|
|
|
+
|
|
|
+ var container, stats;
|
|
|
+
|
|
|
+ var camera, scene, renderer;
|
|
|
+
|
|
|
+ var projector, raycaster, mouse, points = [];
|
|
|
+
|
|
|
+ var mesh, line;
|
|
|
+
|
|
|
+ init();
|
|
|
+ animate();
|
|
|
+
|
|
|
+ function init() {
|
|
|
+
|
|
|
+ container = document.getElementById( 'container' );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ camera = new THREE.PerspectiveCamera( 27, window.innerWidth / window.innerHeight, 1, 3500 );
|
|
|
+ camera.position.z = 2750;
|
|
|
+
|
|
|
+ scene = new THREE.Scene();
|
|
|
+ scene.fog = new THREE.Fog( 0x050505, 2000, 3500 );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ scene.add( new THREE.AmbientLight( 0x444444 ) );
|
|
|
+
|
|
|
+ var light1 = new THREE.DirectionalLight( 0xffffff, 0.5 );
|
|
|
+ light1.position.set( 1, 1, 1 );
|
|
|
+ scene.add( light1 );
|
|
|
+
|
|
|
+ var light2 = new THREE.DirectionalLight( 0xffffff, 1.5 );
|
|
|
+ light2.position.set( 0, -1, 0 );
|
|
|
+ scene.add( light2 );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ var triangles = 5000;
|
|
|
+
|
|
|
+ var geometry = new THREE.BufferGeometry();
|
|
|
+
|
|
|
+ geometry.addAttribute( 'position', Float32Array, triangles * 3, 3 );
|
|
|
+ geometry.addAttribute( 'normal', Float32Array, triangles * 3, 3 );
|
|
|
+ geometry.addAttribute( 'color', Float32Array, triangles * 3, 3 );
|
|
|
+
|
|
|
+ var positions = geometry.attributes.position.array;
|
|
|
+ var normals = geometry.attributes.normal.array;
|
|
|
+ var colors = geometry.attributes.color.array;
|
|
|
+
|
|
|
+ var color = new THREE.Color();
|
|
|
+
|
|
|
+ var n = 800, n2 = n/2; // triangles spread in the cube
|
|
|
+ var d = 120, d2 = d/2; // individual triangle size
|
|
|
+
|
|
|
+ var pA = new THREE.Vector3();
|
|
|
+ var pB = new THREE.Vector3();
|
|
|
+ var pC = new THREE.Vector3();
|
|
|
+
|
|
|
+ var cb = new THREE.Vector3();
|
|
|
+ var ab = new THREE.Vector3();
|
|
|
+
|
|
|
+ for ( var i = 0; i < positions.length; i += 9 ) {
|
|
|
+
|
|
|
+ // positions
|
|
|
+
|
|
|
+ var x = Math.random() * n - n2;
|
|
|
+ var y = Math.random() * n - n2;
|
|
|
+ var z = Math.random() * n - n2;
|
|
|
+
|
|
|
+ var ax = x + Math.random() * d - d2;
|
|
|
+ var ay = y + Math.random() * d - d2;
|
|
|
+ var az = z + Math.random() * d - d2;
|
|
|
+
|
|
|
+ var bx = x + Math.random() * d - d2;
|
|
|
+ var by = y + Math.random() * d - d2;
|
|
|
+ var bz = z + Math.random() * d - d2;
|
|
|
+
|
|
|
+ var cx = x + Math.random() * d - d2;
|
|
|
+ var cy = y + Math.random() * d - d2;
|
|
|
+ var cz = z + Math.random() * d - d2;
|
|
|
+
|
|
|
+ positions[ i ] = ax;
|
|
|
+ positions[ i + 1 ] = ay;
|
|
|
+ positions[ i + 2 ] = az;
|
|
|
+
|
|
|
+ positions[ i + 3 ] = bx;
|
|
|
+ positions[ i + 4 ] = by;
|
|
|
+ positions[ i + 5 ] = bz;
|
|
|
+
|
|
|
+ positions[ i + 6 ] = cx;
|
|
|
+ positions[ i + 7 ] = cy;
|
|
|
+ positions[ i + 8 ] = cz;
|
|
|
+
|
|
|
+ // flat face normals
|
|
|
+
|
|
|
+ pA.set( ax, ay, az );
|
|
|
+ pB.set( bx, by, bz );
|
|
|
+ pC.set( cx, cy, cz );
|
|
|
+
|
|
|
+ cb.subVectors( pC, pB );
|
|
|
+ ab.subVectors( pA, pB );
|
|
|
+ cb.cross( ab );
|
|
|
+
|
|
|
+ cb.normalize();
|
|
|
+
|
|
|
+ var nx = cb.x;
|
|
|
+ var ny = cb.y;
|
|
|
+ var nz = cb.z;
|
|
|
+
|
|
|
+ normals[ i ] = nx;
|
|
|
+ normals[ i + 1 ] = ny;
|
|
|
+ normals[ i + 2 ] = nz;
|
|
|
+
|
|
|
+ normals[ i + 3 ] = nx;
|
|
|
+ normals[ i + 4 ] = ny;
|
|
|
+ normals[ i + 5 ] = nz;
|
|
|
+
|
|
|
+ normals[ i + 6 ] = nx;
|
|
|
+ normals[ i + 7 ] = ny;
|
|
|
+ normals[ i + 8 ] = nz;
|
|
|
+
|
|
|
+ // colors
|
|
|
+
|
|
|
+ var vx = ( x / n ) + 0.5;
|
|
|
+ var vy = ( y / n ) + 0.5;
|
|
|
+ var vz = ( z / n ) + 0.5;
|
|
|
+
|
|
|
+ color.setRGB( vx, vy, vz );
|
|
|
+
|
|
|
+ colors[ i ] = color.r;
|
|
|
+ colors[ i + 1 ] = color.g;
|
|
|
+ colors[ i + 2 ] = color.b;
|
|
|
+
|
|
|
+ colors[ i + 3 ] = color.r;
|
|
|
+ colors[ i + 4 ] = color.g;
|
|
|
+ colors[ i + 5 ] = color.b;
|
|
|
+
|
|
|
+ colors[ i + 6 ] = color.r;
|
|
|
+ colors[ i + 7 ] = color.g;
|
|
|
+ colors[ i + 8 ] = color.b;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ geometry.computeBoundingSphere();
|
|
|
+
|
|
|
+ var material = new THREE.MeshPhongMaterial( {
|
|
|
+ color: 0xaaaaaa, ambient: 0xaaaaaa, specular: 0xffffff, shininess: 250,
|
|
|
+ side: THREE.DoubleSide, vertexColors: THREE.VertexColors
|
|
|
+ } );
|
|
|
+
|
|
|
+ mesh = new THREE.Mesh( geometry, material );
|
|
|
+ scene.add( mesh );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ projector = new THREE.Projector();
|
|
|
+ raycaster = new THREE.Raycaster();
|
|
|
+
|
|
|
+ mouse = new THREE.Vector2();
|
|
|
+
|
|
|
+ var geometry = new THREE.BufferGeometry();
|
|
|
+ geometry.addAttribute( 'position', Float32Array, 4, 3 );
|
|
|
+
|
|
|
+ var material = new THREE.LineBasicMaterial( { color: 0xffffff, linewidth: 2, transparent: true } );
|
|
|
+
|
|
|
+ line = new THREE.Line( geometry, material );
|
|
|
+ scene.add( line );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ renderer = new THREE.WebGLRenderer( { antialias: false } );
|
|
|
+ renderer.setClearColor( scene.fog.color, 1 );
|
|
|
+ renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
+
|
|
|
+ container.appendChild( renderer.domElement );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ stats = new Stats();
|
|
|
+ stats.domElement.style.position = 'absolute';
|
|
|
+ stats.domElement.style.top = '0px';
|
|
|
+ container.appendChild( stats.domElement );
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ window.addEventListener( 'resize', onWindowResize, false );
|
|
|
+ document.addEventListener( 'mousemove', onDocumentMouseMove, false );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function onWindowResize() {
|
|
|
+
|
|
|
+ camera.aspect = window.innerWidth / window.innerHeight;
|
|
|
+ camera.updateProjectionMatrix();
|
|
|
+
|
|
|
+ renderer.setSize( window.innerWidth, window.innerHeight );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function onDocumentMouseMove( event ) {
|
|
|
+
|
|
|
+ event.preventDefault();
|
|
|
+
|
|
|
+ mouse.x = ( event.clientX / window.innerWidth ) * 2 - 1;
|
|
|
+ mouse.y = - ( event.clientY / window.innerHeight ) * 2 + 1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+
|
|
|
+ function animate() {
|
|
|
+
|
|
|
+ requestAnimationFrame( animate );
|
|
|
+
|
|
|
+ render();
|
|
|
+ stats.update();
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ function render() {
|
|
|
+
|
|
|
+ var time = Date.now() * 0.001;
|
|
|
+
|
|
|
+ mesh.rotation.x = time * 0.15;
|
|
|
+ mesh.rotation.y = time * 0.25;
|
|
|
+
|
|
|
+ var vector = new THREE.Vector3( mouse.x, mouse.y, 1 );
|
|
|
+ projector.unprojectVector( vector, camera );
|
|
|
+
|
|
|
+ raycaster.set( camera.position, vector.sub( camera.position ).normalize() );
|
|
|
+
|
|
|
+ var intersects = raycaster.intersectObject( mesh );
|
|
|
+
|
|
|
+ if ( intersects.length > 0 ) {
|
|
|
+
|
|
|
+ var intersect = intersects[ 0 ];
|
|
|
+
|
|
|
+ var object = intersect.object;
|
|
|
+ var positions = object.geometry.attributes.position.array;
|
|
|
+
|
|
|
+ for ( var i = 0, j = 0; i < 4; i ++, j += 3 ) {
|
|
|
+
|
|
|
+ var index = intersect.indices[ i % 3 ] * 3;
|
|
|
+
|
|
|
+ line.geometry.attributes.position.array[ j ] = positions[ index ];
|
|
|
+ line.geometry.attributes.position.array[ j + 1 ] = positions[ index + 1 ];
|
|
|
+ line.geometry.attributes.position.array[ j + 2 ] = positions[ index + 2 ];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ mesh.updateMatrix();
|
|
|
+
|
|
|
+ line.geometry.applyMatrix( mesh.matrix );
|
|
|
+
|
|
|
+ line.visible = true;
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ line.visible = false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ renderer.render( scene, camera );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ </script>
|
|
|
+
|
|
|
+ </body>
|
|
|
+</html>
|