Mr.doob преди 12 години
родител
ревизия
2f2d6a0755
променени са 4 файла, в които са добавени 112 реда и са изтрити 7 реда
  1. 1 0
      editor/index.html
  2. 2 4
      editor/js/ui/Menubar.File.js
  3. 3 3
      editor/js/ui/Viewport.js
  4. 106 0
      examples/js/exporters/OBJExporter.js

+ 1 - 0
editor/index.html

@@ -81,6 +81,7 @@
 		<script src="../examples/js/loaders/ctm/CTMLoader.js"></script>
 		<script src="../examples/js/exporters/GeometryExporter.js"></script>
 		<script src="../examples/js/exporters/SceneExporter.js"></script>
+		<script src="../examples/js/exporters/OBJExporter.js"></script>
 
 		<script src="js/libs/signals.min.js"></script>
 

+ 2 - 4
editor/js/ui/Menubar.File.js

@@ -38,7 +38,7 @@ Menubar.File = function ( signals ) {
 	var option = new UI.Panel();
 	option.setClass( 'option' );
 	option.setTextContent( 'Export Geometry' );
-	option.onClick( function () { signals.exportGeometry.dispatch(); } );
+	option.onClick( function () { signals.exportGeometry.dispatch( { exporter: THREE.GeometryExporter } ); } );
 	options.add( option );
 
 	// export scene
@@ -49,15 +49,13 @@ Menubar.File = function ( signals ) {
 	option.onClick( function () { signals.exportScene.dispatch(); } );
 	options.add( option );
 
-	/*
 	// export OBJ
 
 	var option = new UI.Panel();
 	option.setClass( 'option' );
 	option.setTextContent( 'Export OBJ' );
-	option.onClick( function () { alert( 'Export OBJ' ) } );
+	option.onClick( function () { signals.exportGeometry.dispatch( { exporter: THREE.OBJExporter } ); } );
 	options.add( option );
-	*/
 
 	//
 

+ 3 - 3
editor/js/ui/Viewport.js

@@ -667,16 +667,16 @@ var Viewport = function ( signals ) {
 
 	} );
 
-	signals.exportGeometry.add( function () {
+	signals.exportGeometry.add( function ( object ) {
 
-		if ( !selected.geometry ) {
+		if ( selected.geometry === undefined ) {
 
 			console.warn( "Selected object doesn't have any geometry" );
 			return;
 
 		}
 
-		var output = new THREE.GeometryExporter().parse( selected.geometry );
+		var output = new object.exporter().parse( selected.geometry );
 
 		var blob = new Blob( [ output ], { type: 'text/plain' } );
 		var objectURL = URL.createObjectURL( blob );

+ 106 - 0
examples/js/exporters/OBJExporter.js

@@ -0,0 +1,106 @@
+/**
+ * @author mrdoob / http://mrdoob.com/
+ */
+
+THREE.OBJExporter = function () {};
+
+THREE.OBJExporter.prototype = {
+
+	constructor: THREE.OBJExporter,
+
+	parse: function ( geometry ) {
+
+		console.log( geometry );
+
+		var output = '';
+
+		for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
+
+			var vertex = geometry.vertices[ i ];
+			output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
+
+		}
+
+		// uvs
+
+		for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
+
+			var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
+
+			for ( var j = 0; j < vertexUvs.length; j ++ ) {
+
+				var uv = vertexUvs[ j ];
+				output += 'vt ' + uv.x + ' ' + uv.y + '\n';
+
+			}
+
+		}
+
+		// normals
+
+		for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
+
+			var normals = geometry.faces[ i ].vertexNormals;
+
+			for ( var j = 0; j < normals.length; j ++ ) {
+
+				var normal = normals[ j ];
+				output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
+
+			}
+
+		}
+
+		// map
+
+		var count = 1; // OBJ values start by 1
+		var map = [ count ];
+
+		for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
+
+			var face = geometry.faces[ i ];
+
+			if ( face instanceof THREE.Face3 ) {
+
+				count += 3;
+
+			} else if ( face instanceof THREE.Face4 ) {
+
+				count += 4;
+
+			}
+
+			map.push( count );
+
+		}
+
+		// faces
+
+		for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
+
+			var face = geometry.faces[ i ];
+
+			output += 'f ';
+
+			if ( face instanceof THREE.Face3 ) {
+
+				output += ( face.a + 1 ) + '/' + ( map[ i ] ) + '/' + ( map[ i ] ) + ' ';
+				output += ( face.b + 1 ) + '/' + ( map[ i ] + 1 ) + '/' + ( map[ i ] + 1 ) + ' ';
+				output += ( face.c + 1 ) + '/' + ( map[ i ] + 2 ) + '/' + ( map[ i ] + 2 ) + '\n';
+
+			} else if ( face instanceof THREE.Face4 ) {
+
+				output += ( face.a + 1 ) + '/' + ( map[ i ] ) + '/' + ( map[ i ] ) + ' ';
+				output += ( face.b + 1 ) + '/' + ( map[ i ] + 1 ) + '/' + ( map[ i ] + 1 ) + ' ';
+				output += ( face.c + 1 ) + '/' + ( map[ i ] + 2 ) + '/' + ( map[ i ] + 2 ) + ' ';
+				output += ( face.d + 1 ) + '/' + ( map[ i ] + 3 ) + '/' + ( map[ i ] + 3 ) + '\n';
+
+			}
+
+		}
+
+		return output;
+
+	}
+
+}