STLExporter.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. console.warn( "THREE.STLExporter: As part of the transition to ES6 Modules, the files in 'examples/js' were deprecated in May 2020 (r117) and will be deleted in December 2020 (r124). You can find more information about developing using ES6 Modules in https://threejs.org/docs/index.html#manual/en/introduction/Import-via-modules." );
  2. /**
  3. * @author kovacsv / http://kovacsv.hu/
  4. * @author mrdoob / http://mrdoob.com/
  5. * @author mudcube / http://mudcu.be/
  6. * @author Mugen87 / https://github.com/Mugen87
  7. *
  8. * Usage:
  9. * var exporter = new THREE.STLExporter();
  10. *
  11. * // second argument is a list of options
  12. * var data = exporter.parse( mesh, { binary: true } );
  13. *
  14. */
  15. THREE.STLExporter = function () {};
  16. THREE.STLExporter.prototype = {
  17. constructor: THREE.STLExporter,
  18. parse: ( function () {
  19. var vector = new THREE.Vector3();
  20. var normalMatrixWorld = new THREE.Matrix3();
  21. return function parse( scene, options ) {
  22. if ( options === undefined ) options = {};
  23. var binary = options.binary !== undefined ? options.binary : false;
  24. //
  25. var objects = [];
  26. var triangles = 0;
  27. scene.traverse( function ( object ) {
  28. if ( object.isMesh ) {
  29. var geometry = object.geometry;
  30. if ( geometry.isBufferGeometry ) {
  31. geometry = new THREE.Geometry().fromBufferGeometry( geometry );
  32. }
  33. if ( geometry.isGeometry ) {
  34. triangles += geometry.faces.length;
  35. objects.push( {
  36. geometry: geometry,
  37. matrixWorld: object.matrixWorld
  38. } );
  39. }
  40. }
  41. } );
  42. if ( binary ) {
  43. var offset = 80; // skip header
  44. var bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;
  45. var arrayBuffer = new ArrayBuffer( bufferLength );
  46. var output = new DataView( arrayBuffer );
  47. output.setUint32( offset, triangles, true ); offset += 4;
  48. for ( var i = 0, il = objects.length; i < il; i ++ ) {
  49. var object = objects[ i ];
  50. var vertices = object.geometry.vertices;
  51. var faces = object.geometry.faces;
  52. var matrixWorld = object.matrixWorld;
  53. normalMatrixWorld.getNormalMatrix( matrixWorld );
  54. for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
  55. var face = faces[ j ];
  56. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  57. output.setFloat32( offset, vector.x, true ); offset += 4; // normal
  58. output.setFloat32( offset, vector.y, true ); offset += 4;
  59. output.setFloat32( offset, vector.z, true ); offset += 4;
  60. var indices = [ face.a, face.b, face.c ];
  61. for ( var k = 0; k < 3; k ++ ) {
  62. vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
  63. output.setFloat32( offset, vector.x, true ); offset += 4; // vertices
  64. output.setFloat32( offset, vector.y, true ); offset += 4;
  65. output.setFloat32( offset, vector.z, true ); offset += 4;
  66. }
  67. output.setUint16( offset, 0, true ); offset += 2; // attribute byte count
  68. }
  69. }
  70. return output;
  71. } else {
  72. var output = '';
  73. output += 'solid exported\n';
  74. for ( var i = 0, il = objects.length; i < il; i ++ ) {
  75. var object = objects[ i ];
  76. var vertices = object.geometry.vertices;
  77. var faces = object.geometry.faces;
  78. var matrixWorld = object.matrixWorld;
  79. normalMatrixWorld.getNormalMatrix( matrixWorld );
  80. for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
  81. var face = faces[ j ];
  82. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  83. output += '\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
  84. output += '\t\touter loop\n';
  85. var indices = [ face.a, face.b, face.c ];
  86. for ( var k = 0; k < 3; k ++ ) {
  87. vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
  88. output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
  89. }
  90. output += '\t\tendloop\n';
  91. output += '\tendfacet\n';
  92. }
  93. }
  94. output += 'endsolid exported\n';
  95. return output;
  96. }
  97. };
  98. }() )
  99. };