Преглед на файлове

Merge pull request #5457 from Colmea/dev

OBJExporter: handle children objects
Mr.doob преди 10 години
родител
ревизия
5f9e8ca8a1
променени са 1 файла, в които са добавени 59 реда и са изтрити 30 реда
  1. 59 30
      examples/js/exporters/OBJExporter.js

+ 59 - 30
examples/js/exporters/OBJExporter.js

@@ -8,59 +8,88 @@ THREE.OBJExporter.prototype = {
 
 	constructor: THREE.OBJExporter,
 
-	parse: function ( geometry ) {
-
+	parse: function ( object ) {
 		var output = '';
 
-		for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
+		var indexVertex = 0;
+		var indexVertexUvs = 0
+		var indexNormals = 0;
 
-			var vertex = geometry.vertices[ i ];
-			output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
+		var parseObject = function ( child ) {
 
-		}
+			var nbVertex, nbVertexUvs, nbNormals;
+			nbVertex = nbVertexUvs = nbNormals = 0;
 
-		// uvs
+			var geometry = object.geometry;
 
-		for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
+			output += 'o ' + object.id + '\n';
 
-			var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
+			if (object.geometry) {
+				for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
 
-			for ( var j = 0; j < vertexUvs.length; j ++ ) {
+					var vertex = geometry.vertices[ i ].clone();
+					vertex.applyMatrix4( object.matrixWorld );
 
-				var uv = vertexUvs[ j ];
-				output += 'vt ' + uv.x + ' ' + uv.y + '\n';
+					output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
 
-			}
+					nbVertex++;
+				}
 
-		}
+				// uvs
 
-		// normals
+				for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
 
-		for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
+					var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
 
-			var normals = geometry.faces[ i ].vertexNormals;
+					for ( var j = 0; j < vertexUvs.length; j ++ ) {
 
-			for ( var j = 0; j < normals.length; j ++ ) {
+						var uv = vertexUvs[ j ];
+						vertex.applyMatrix4( object.matrixWorld );
 
-				var normal = normals[ j ];
-				output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
+						output += 'vt ' + uv.x + ' ' + uv.y + '\n';
 
-			}
+						nbVertexUvs++;
+					}
+
+				}
+
+				// 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 ++ ) {
 
-		// faces
+						var normal = normals[ j ];
+						output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
 
-		for ( var i = 0, j = 1, l = geometry.faces.length; i < l; i ++, j += 3 ) {
+						nbNormals++;
+					}
 
-			var face = geometry.faces[ i ];
+				}
+
+				// faces
+
+				for ( var i = 0, j = 1, l = geometry.faces.length; i < l; i ++, j += 3 ) {
+
+					var face = geometry.faces[ i ];
+
+					output += 'f ';
+					output += ( indexVertex + face.a + 1 ) + '/' + ( indexVertexUvs + j ) + '/' + ( indexNormals + j ) + ' ';
+					output += ( indexVertex + face.b + 1 ) + '/' + ( indexVertexUvs + j + 1 ) + '/' + ( indexNormals + j + 1 ) + ' ';
+					output += ( indexVertex + face.c + 1 ) + '/' + ( indexVertexUvs + j + 2 ) + '/' + ( indexNormals + j + 2 ) + '\n';
+
+				}
+			}
 
-			output += 'f ';
-			output += ( face.a + 1 ) + '/' + ( j ) + '/' + ( j ) + ' ';
-			output += ( face.b + 1 ) + '/' + ( j + 1 ) + '/' + ( j + 1 ) + ' ';
-			output += ( face.c + 1 ) + '/' + ( j + 2 ) + '/' + ( j + 2 ) + '\n';
+			// update index
+			indexVertex += nbVertex;
+			indexVertexUvs += nbVertexUvs
+			indexNormals += nbNormals
+		};
 
-		}
+		object.traverse( parseObject );
 
 		return output;