STLExporter.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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/#manual/en/introduction/Installation." );
  2. /**
  3. * Usage:
  4. * var exporter = new THREE.STLExporter();
  5. *
  6. * // second argument is a list of options
  7. * var data = exporter.parse( mesh, { binary: true } );
  8. *
  9. */
  10. THREE.STLExporter = function () {};
  11. THREE.STLExporter.prototype = {
  12. constructor: THREE.STLExporter,
  13. parse: ( function () {
  14. var vector = new THREE.Vector3();
  15. var normalMatrixWorld = new THREE.Matrix3();
  16. return function parse( scene, options ) {
  17. if ( options === undefined ) options = {};
  18. var binary = options.binary !== undefined ? options.binary : false;
  19. //
  20. var objects = [];
  21. var triangles = 0;
  22. scene.traverse( function ( object ) {
  23. if ( object.isMesh ) {
  24. var geometry = object.geometry;
  25. if ( geometry.isBufferGeometry ) {
  26. geometry = new THREE.Geometry().fromBufferGeometry( geometry );
  27. }
  28. if ( geometry.isGeometry ) {
  29. triangles += geometry.faces.length;
  30. objects.push( {
  31. geometry: geometry,
  32. matrixWorld: object.matrixWorld
  33. } );
  34. }
  35. }
  36. } );
  37. if ( binary ) {
  38. var offset = 80; // skip header
  39. var bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;
  40. var arrayBuffer = new ArrayBuffer( bufferLength );
  41. var output = new DataView( arrayBuffer );
  42. output.setUint32( offset, triangles, true ); offset += 4;
  43. for ( var i = 0, il = objects.length; i < il; i ++ ) {
  44. var object = objects[ i ];
  45. var vertices = object.geometry.vertices;
  46. var faces = object.geometry.faces;
  47. var matrixWorld = object.matrixWorld;
  48. normalMatrixWorld.getNormalMatrix( matrixWorld );
  49. for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
  50. var face = faces[ j ];
  51. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  52. output.setFloat32( offset, vector.x, true ); offset += 4; // normal
  53. output.setFloat32( offset, vector.y, true ); offset += 4;
  54. output.setFloat32( offset, vector.z, true ); offset += 4;
  55. var indices = [ face.a, face.b, face.c ];
  56. for ( var k = 0; k < 3; k ++ ) {
  57. vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
  58. output.setFloat32( offset, vector.x, true ); offset += 4; // vertices
  59. output.setFloat32( offset, vector.y, true ); offset += 4;
  60. output.setFloat32( offset, vector.z, true ); offset += 4;
  61. }
  62. output.setUint16( offset, 0, true ); offset += 2; // attribute byte count
  63. }
  64. }
  65. return output;
  66. } else {
  67. var output = '';
  68. output += 'solid exported\n';
  69. for ( var i = 0, il = objects.length; i < il; i ++ ) {
  70. var object = objects[ i ];
  71. var vertices = object.geometry.vertices;
  72. var faces = object.geometry.faces;
  73. var matrixWorld = object.matrixWorld;
  74. normalMatrixWorld.getNormalMatrix( matrixWorld );
  75. for ( var j = 0, jl = faces.length; j < jl; j ++ ) {
  76. var face = faces[ j ];
  77. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  78. output += '\tfacet normal ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
  79. output += '\t\touter loop\n';
  80. var indices = [ face.a, face.b, face.c ];
  81. for ( var k = 0; k < 3; k ++ ) {
  82. vector.copy( vertices[ indices[ k ] ] ).applyMatrix4( matrixWorld );
  83. output += '\t\t\tvertex ' + vector.x + ' ' + vector.y + ' ' + vector.z + '\n';
  84. }
  85. output += '\t\tendloop\n';
  86. output += '\tendfacet\n';
  87. }
  88. }
  89. output += 'endsolid exported\n';
  90. return output;
  91. }
  92. };
  93. }() )
  94. };