Fast Quadric Mesh Simplification JS port

July 17, 2016 ยท View on GitHub

three.js webgl - modifier - Fast Quadric Mesh Simplification
	<script src="../build/three.js"></script>
	<script src="js/controls/OrbitControls.js"></script>
	<!-- <script src="js/modifiers/SimplifyModifier.js"></script> -->
	<script src="MeshSimplify.js"></script>
	<script src="js/libs/stats.min.js"></script>

	<script>

		var container, stats;

		var camera, controls, scene, renderer;

		var cube, mesh, material;

		var boxGeometry = new THREE.BoxGeometry( 80, 80, 80, 4, 4, 4 );
		var torusGeometry = new THREE.TorusGeometry( 50, 25, 256, 256, Math.PI * 2 );
		var sphereGeometry = new THREE.SphereGeometry( 50, 15, 15 );
		var planeGeometry = new THREE.PlaneGeometry( 100, 100, 6, 6 );
		var torusKnotGeometry = new THREE.TorusKnotGeometry(100, 25, 256, 256)
		var textGeometry;

		var loader = new THREE.FontLoader();
		loader.load( 'fonts/helvetiker_regular.typeface.json', function ( font ) {

				textGeometry = new THREE.TextGeometry( '&', {
				size: 200,
				height: 50,
				curveSegments: 1,
				font: font
			} );

		} );

		var modifer = new THREE.SimplifyModifier();
		var meshes = [];
		var count = 0;


		init();
		animate();


		function addStuff( geometry ) {
			count ++;

			var simplified = modifer.modify( geometry, geometry.vertices.length * 0.5 | 0 );

			console.error('simplified', simplified.faces.length, simplified.vertices.length);

			var wireframe = new THREE.MeshBasicMaterial({
				color: Math.random() * 0xffffff,
				wireframe: true
			});

			var materialNormal = new THREE.MeshNormalMaterial({
				transparent: true,
				opacity: 0.7

			});

			mesh = THREE.SceneUtils.createMultiMaterialObject( simplified, [
				material,
				wireframe,
				// materialNormal
			]);

			mesh.position.x = -200;
			mesh.position.y = count * 150 - 300;

			scene.add( mesh );
			meshes.push( mesh );


			mesh = THREE.SceneUtils.createMultiMaterialObject( geometry, [
				material,
				wireframe,
				// materialNormal
			]);

			mesh.position.x = 200;
			mesh.position.y = count * 150 - 300;
			scene.add( mesh );
			meshes.push ( mesh );

		}

		function init() {

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

			info = document.createElement( 'div' );
			info.style.position = 'absolute';
			info.style.top = '10px';
			info.style.width = '100%';
			info.style.textAlign = 'center';
			info.innerHTML = '50% Vertex Reduction using SimplifyModifier';
			container.appendChild( info );

			camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
			camera.position.z = 500;

			scene = new THREE.Scene();

			var light = new THREE.PointLight( 0xffffff, 1.5 );
			light.position.set( 1000, 1000, 2000 );
			scene.add( light );


			// addStuff( boxGeometry );
			// addStuff( planeGeometry );
			// addStuff( sphereGeometry );
			// addStuff( torusGeometry );
			addStuff( torusKnotGeometry );

			renderer = new THREE.WebGLRenderer( { antialias: true } );
			renderer.setClearColor( 0xf0f0f0 );
			renderer.setPixelRatio( window.devicePixelRatio );
			renderer.setSize( window.innerWidth, window.innerHeight );
			container.appendChild( renderer.domElement );

			stats = new Stats();
			container.appendChild( stats.dom );

			//

			controls = new THREE.OrbitControls( camera, renderer.domElement );

			window.addEventListener( 'resize', onWindowResize, false );

		}

		function onWindowResize() {

			camera.aspect = window.innerWidth / window.innerHeight;
			camera.updateProjectionMatrix();

			renderer.setSize( window.innerWidth, window.innerHeight );

		}

		//

		function animate() {

			meshes.forEach( m => {
				m.rotation.x += 0.01;
				m.rotation.y += 0.01;
				m.rotation.z += 0.01;
			})

			requestAnimationFrame( animate );

			controls.update();

			stats.begin();
			render();
			stats.end();

		}

		function render() {

			renderer.render( scene, camera );

		}

	</script>

</body>