OBJExporter.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. /**
  2. * @author mrdoob / http://mrdoob.com/
  3. */
  4. THREE.OBJExporter = function () {};
  5. THREE.OBJExporter.prototype = {
  6. constructor: THREE.OBJExporter,
  7. parse: function ( object ) {
  8. var output = '';
  9. var indexVertex = 0;
  10. var indexVertexUvs = 0
  11. var indexNormals = 0;
  12. var parseObject = function ( child ) {
  13. var nbVertex, nbVertexUvs, nbNormals;
  14. nbVertex = nbVertexUvs = nbNormals = 0;
  15. var geometry = object.geometry;
  16. output += 'o ' + object.id + '\n';
  17. if (object.geometry) {
  18. for ( var i = 0, l = geometry.vertices.length; i < l; i ++ ) {
  19. var vertex = geometry.vertices[ i ].clone();
  20. vertex.applyMatrix4( object.matrixWorld );
  21. output += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\n';
  22. nbVertex++;
  23. }
  24. // uvs
  25. for ( var i = 0, l = geometry.faceVertexUvs[ 0 ].length; i < l; i ++ ) {
  26. var vertexUvs = geometry.faceVertexUvs[ 0 ][ i ];
  27. for ( var j = 0; j < vertexUvs.length; j ++ ) {
  28. var uv = vertexUvs[ j ];
  29. vertex.applyMatrix4( object.matrixWorld );
  30. output += 'vt ' + uv.x + ' ' + uv.y + '\n';
  31. nbVertexUvs++;
  32. }
  33. }
  34. // normals
  35. for ( var i = 0, l = geometry.faces.length; i < l; i ++ ) {
  36. var normals = geometry.faces[ i ].vertexNormals;
  37. for ( var j = 0; j < normals.length; j ++ ) {
  38. var normal = normals[ j ];
  39. output += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\n';
  40. nbNormals++;
  41. }
  42. }
  43. // faces
  44. for ( var i = 0, j = 1, l = geometry.faces.length; i < l; i ++, j += 3 ) {
  45. var face = geometry.faces[ i ];
  46. output += 'f ';
  47. output += ( indexVertex + face.a + 1 ) + '/' + ( indexVertexUvs + j ) + '/' + ( indexNormals + j ) + ' ';
  48. output += ( indexVertex + face.b + 1 ) + '/' + ( indexVertexUvs + j + 1 ) + '/' + ( indexNormals + j + 1 ) + ' ';
  49. output += ( indexVertex + face.c + 1 ) + '/' + ( indexVertexUvs + j + 2 ) + '/' + ( indexNormals + j + 2 ) + '\n';
  50. }
  51. }
  52. // update index
  53. indexVertex += nbVertex;
  54. indexVertexUvs += nbVertexUvs
  55. indexNormals += nbNormals
  56. };
  57. object.traverse( parseObject );
  58. return output;
  59. }
  60. }