|
@@ -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;
|
|
|
|