|
@@ -2,250 +2,250 @@
|
|
|
* @author mrdoob / http://mrdoob.com/
|
|
|
*/
|
|
|
|
|
|
- THREE.OBJExporter = function () {};
|
|
|
+THREE.OBJExporter = function () {};
|
|
|
|
|
|
- THREE.OBJExporter.prototype = {
|
|
|
+THREE.OBJExporter.prototype = {
|
|
|
|
|
|
- constructor: THREE.OBJExporter,
|
|
|
+ constructor: THREE.OBJExporter,
|
|
|
|
|
|
- parse: function ( object ) {
|
|
|
+ parse: function ( object ) {
|
|
|
|
|
|
- var output = '';
|
|
|
+ var output = '';
|
|
|
|
|
|
- var indexVertex = 0;
|
|
|
- var indexVertexUvs = 0;
|
|
|
- var indexNormals = 0;
|
|
|
+ var indexVertex = 0;
|
|
|
+ var indexVertexUvs = 0;
|
|
|
+ var indexNormals = 0;
|
|
|
|
|
|
- var vertex = new THREE.Vector3();
|
|
|
- var normal = new THREE.Vector3();
|
|
|
- var uv = new THREE.Vector2();
|
|
|
+ var vertex = new THREE.Vector3();
|
|
|
+ var normal = new THREE.Vector3();
|
|
|
+ var uv = new THREE.Vector2();
|
|
|
|
|
|
- var i, j, m, face = [];
|
|
|
+ var i, j, m, face = [];
|
|
|
|
|
|
- var parseMesh = function ( mesh ) {
|
|
|
+ var parseMesh = function ( mesh ) {
|
|
|
|
|
|
- var nbVertex = 0;
|
|
|
- var nbNormals = 0;
|
|
|
- var nbVertexUvs = 0;
|
|
|
+ var nbVertex = 0;
|
|
|
+ var nbNormals = 0;
|
|
|
+ var nbVertexUvs = 0;
|
|
|
|
|
|
- var geometry = mesh.geometry;
|
|
|
+ var geometry = mesh.geometry;
|
|
|
|
|
|
- var normalMatrixWorld = new THREE.Matrix3();
|
|
|
+ var normalMatrixWorld = new THREE.Matrix3();
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
+ if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
- geometry = new THREE.BufferGeometry().setFromObject( mesh );
|
|
|
+ geometry = new THREE.BufferGeometry().setFromObject( mesh );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- // shortcuts
|
|
|
- var vertices = geometry.getAttribute( 'position' );
|
|
|
- var normals = geometry.getAttribute( 'normal' );
|
|
|
- var uvs = geometry.getAttribute( 'uv' );
|
|
|
- var indices = geometry.getIndex();
|
|
|
+ // shortcuts
|
|
|
+ var vertices = geometry.getAttribute( 'position' );
|
|
|
+ var normals = geometry.getAttribute( 'normal' );
|
|
|
+ var uvs = geometry.getAttribute( 'uv' );
|
|
|
+ var indices = geometry.getIndex();
|
|
|
|
|
|
- // name of the mesh object
|
|
|
- output += 'o ' + mesh.name + '\n';
|
|
|
+ // name of the mesh object
|
|
|
+ output += 'o ' + mesh.name + '\n';
|
|
|
|
|
|
- // vertices
|
|
|
+ // vertices
|
|
|
|
|
|
- if( vertices !== undefined ) {
|
|
|
+ if( vertices !== undefined ) {
|
|
|
|
|
|
- for ( i = 0; i < vertices.count ; i ++, nbVertex++ ) {
|
|
|
+ for ( i = 0; i < vertices.count ; i ++, nbVertex++ ) {
|
|
|
|
|
|
- vertex.x = vertices.getX( i );
|
|
|
- vertex.y = vertices.getY( i );
|
|
|
- vertex.z = vertices.getZ( i );
|
|
|
+ vertex.x = vertices.getX( i );
|
|
|
+ vertex.y = vertices.getY( i );
|
|
|
+ vertex.z = vertices.getZ( i );
|
|
|
|
|
|
- // transfrom the vertex to world space
|
|
|
- vertex.applyMatrix4( mesh.matrixWorld );
|
|
|
+ // transfrom the vertex to world space
|
|
|
+ vertex.applyMatrix4( mesh.matrixWorld );
|
|
|
|
|
|
- // transform the vertex to export format
|
|
|
- output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
|
|
|
+ // transform the vertex to export format
|
|
|
+ output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // uvs
|
|
|
+ // uvs
|
|
|
|
|
|
- if( uvs !== undefined ) {
|
|
|
+ if( uvs !== undefined ) {
|
|
|
|
|
|
- for ( i = 0; i < uvs.count ; i ++, nbVertexUvs++ ) {
|
|
|
+ for ( i = 0; i < uvs.count ; i ++, nbVertexUvs++ ) {
|
|
|
|
|
|
- uv.x = uvs.getX( i );
|
|
|
- uv.y = uvs.getY( i );
|
|
|
+ uv.x = uvs.getX( i );
|
|
|
+ uv.y = uvs.getY( i );
|
|
|
|
|
|
- // transform the uv to export format
|
|
|
- output += 'vt ' + uv.x + ' ' + uv.y + '\n';
|
|
|
+ // transform the uv to export format
|
|
|
+ output += 'vt ' + uv.x + ' ' + uv.y + '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // normals
|
|
|
+ // normals
|
|
|
|
|
|
- if( normals !== undefined ) {
|
|
|
+ if( normals !== undefined ) {
|
|
|
|
|
|
- normalMatrixWorld.getNormalMatrix( mesh.matrixWorld );
|
|
|
+ normalMatrixWorld.getNormalMatrix( mesh.matrixWorld );
|
|
|
|
|
|
- for ( i = 0; i < normals.count ; i ++, nbNormals++ ) {
|
|
|
+ for ( i = 0; i < normals.count ; i ++, nbNormals++ ) {
|
|
|
|
|
|
- normal.x = normals.getX( i );
|
|
|
- normal.y = normals.getY( i );
|
|
|
- normal.z = normals.getZ( i );
|
|
|
+ normal.x = normals.getX( i );
|
|
|
+ normal.y = normals.getY( i );
|
|
|
+ normal.z = normals.getZ( i );
|
|
|
|
|
|
- // transfrom the normal to world space
|
|
|
- normal.applyMatrix3( normalMatrixWorld );
|
|
|
+ // transfrom the normal to world space
|
|
|
+ normal.applyMatrix3( normalMatrixWorld );
|
|
|
|
|
|
- // transform the normal to export format
|
|
|
- output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
|
|
|
+ // transform the normal to export format
|
|
|
+ output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // faces
|
|
|
+ // faces
|
|
|
|
|
|
- if( indices !== null ) {
|
|
|
+ if( indices !== null ) {
|
|
|
|
|
|
- for ( i = 0; i < indices.count ; i += 3 ) {
|
|
|
+ for ( i = 0; i < indices.count ; i += 3 ) {
|
|
|
|
|
|
- for( m = 0; m < 3; m ++ ){
|
|
|
+ for( m = 0; m < 3; m ++ ){
|
|
|
|
|
|
- j = indices.getX( i + m ) + 1;
|
|
|
+ j = indices.getX( i + m ) + 1;
|
|
|
|
|
|
- face[ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j );
|
|
|
+ face[ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // transform the face to export format
|
|
|
- output += 'f ' + face.join( ' ' ) + "\n";
|
|
|
+ // transform the face to export format
|
|
|
+ output += 'f ' + face.join( ' ' ) + "\n";
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- for ( i = 0; i < vertices.count ; i += 3 ) {
|
|
|
+ for ( i = 0; i < vertices.count ; i += 3 ) {
|
|
|
|
|
|
- for( m = 0; m < 3; m ++ ){
|
|
|
+ for( m = 0; m < 3; m ++ ){
|
|
|
|
|
|
- j = i + m + 1;
|
|
|
+ j = i + m + 1;
|
|
|
|
|
|
- face[ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j );
|
|
|
+ face[ m ] = ( indexVertex + j ) + '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + '/' + ( indexNormals + j );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // transform the face to export format
|
|
|
- output += 'f ' + face.join( ' ' ) + "\n";
|
|
|
+ // transform the face to export format
|
|
|
+ output += 'f ' + face.join( ' ' ) + "\n";
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- console.warn( 'THREE.OBJExporter.parseMesh(): geometry type unsupported', geometry );
|
|
|
+ console.warn( 'THREE.OBJExporter.parseMesh(): geometry type unsupported', geometry );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- // update index
|
|
|
- indexVertex += nbVertex;
|
|
|
- indexVertexUvs += nbVertexUvs;
|
|
|
- indexNormals += nbNormals;
|
|
|
+ // update index
|
|
|
+ indexVertex += nbVertex;
|
|
|
+ indexVertexUvs += nbVertexUvs;
|
|
|
+ indexNormals += nbNormals;
|
|
|
|
|
|
- };
|
|
|
+ };
|
|
|
|
|
|
- var parseLine = function( line ) {
|
|
|
+ var parseLine = function( line ) {
|
|
|
|
|
|
- var geometry = line.geometry;
|
|
|
- var type = line.type;
|
|
|
+ var geometry = line.geometry;
|
|
|
+ var type = line.type;
|
|
|
|
|
|
- if ( geometry instanceof THREE.Geometry ) {
|
|
|
+ if ( geometry instanceof THREE.Geometry ) {
|
|
|
|
|
|
- geometry = new THREE.BufferGeometry().setFromObject( line );
|
|
|
+ geometry = new THREE.BufferGeometry().setFromObject( line );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
+ if ( geometry instanceof THREE.BufferGeometry ) {
|
|
|
|
|
|
- // shortcuts
|
|
|
- var vertices = geometry.getAttribute( 'position' );
|
|
|
- var indices = geometry.getIndex();
|
|
|
+ // shortcuts
|
|
|
+ var vertices = geometry.getAttribute( 'position' );
|
|
|
+ var indices = geometry.getIndex();
|
|
|
|
|
|
- // name of the line object
|
|
|
- output += 'o ' + line.name + '\n';
|
|
|
+ // name of the line object
|
|
|
+ output += 'o ' + line.name + '\n';
|
|
|
|
|
|
- if( vertices !== undefined ) {
|
|
|
+ if( vertices !== undefined ) {
|
|
|
|
|
|
- for ( i = 0; i < vertices.count ; i ++ ) {
|
|
|
+ for ( i = 0; i < vertices.count ; i ++ ) {
|
|
|
|
|
|
- vertex.x = vertices.getX( i );
|
|
|
- vertex.y = vertices.getY( i );
|
|
|
- vertex.z = vertices.getZ( i );
|
|
|
+ vertex.x = vertices.getX( i );
|
|
|
+ vertex.y = vertices.getY( i );
|
|
|
+ vertex.z = vertices.getZ( i );
|
|
|
|
|
|
- // transfrom the vertex to world space
|
|
|
- vertex.applyMatrix4( line.matrixWorld );
|
|
|
+ // transfrom the vertex to world space
|
|
|
+ vertex.applyMatrix4( line.matrixWorld );
|
|
|
|
|
|
- // transform the vertex to export format
|
|
|
- output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
|
|
|
+ // transform the vertex to export format
|
|
|
+ output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( type === 'Line' ) {
|
|
|
+ if ( type === 'Line' ) {
|
|
|
|
|
|
- output += 'l ';
|
|
|
+ output += 'l ';
|
|
|
|
|
|
- for ( j = 1; j <= vertices.count; j++ ) {
|
|
|
+ for ( j = 1; j <= vertices.count; j++ ) {
|
|
|
|
|
|
- output += j + ' ';
|
|
|
+ output += j + ' ';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- output += '\n';
|
|
|
+ output += '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( type === 'LineSegments' ) {
|
|
|
+ if ( type === 'LineSegments' ) {
|
|
|
|
|
|
- for ( j = 1, k = j + 1; j < vertices.count; j += 2, k = j + 1 ) {
|
|
|
+ for ( j = 1, k = j + 1; j < vertices.count; j += 2, k = j + 1 ) {
|
|
|
|
|
|
- output += 'l ' + j + ' ' + k + '\n';
|
|
|
+ output += 'l ' + j + ' ' + k + '\n';
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- } else {
|
|
|
+ } else {
|
|
|
|
|
|
- console.warn('THREE.OBJExporter.parseLine(): geometry type unsupported', geometry );
|
|
|
+ console.warn('THREE.OBJExporter.parseLine(): geometry type unsupported', geometry );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- };
|
|
|
+ };
|
|
|
|
|
|
- object.traverse( function ( child ) {
|
|
|
+ object.traverse( function ( child ) {
|
|
|
|
|
|
- if ( child instanceof THREE.Mesh ) {
|
|
|
+ if ( child instanceof THREE.Mesh ) {
|
|
|
|
|
|
- parseMesh( child );
|
|
|
+ parseMesh( child );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- if ( child instanceof THREE.Line ) {
|
|
|
+ if ( child instanceof THREE.Line ) {
|
|
|
|
|
|
- parseLine( child );
|
|
|
+ parseLine( child );
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- } );
|
|
|
+ } );
|
|
|
|
|
|
- return output;
|
|
|
+ return output;
|
|
|
|
|
|
- }
|
|
|
+ }
|
|
|
|
|
|
- };
|
|
|
+};
|