STLBinaryExporter.js 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. /**
  2. * @author kovacsv / http://kovacsv.hu/
  3. * @author mrdoob / http://mrdoob.com/
  4. * @author mudcube / http://mudcu.be/
  5. */
  6. THREE.STLBinaryExporter = function () {};
  7. THREE.STLBinaryExporter.prototype = {
  8. constructor: THREE.STLBinaryExporter,
  9. parse: ( function () {
  10. var vector = new THREE.Vector3();
  11. var normalMatrixWorld = new THREE.Matrix3();
  12. return function parse( scene ) {
  13. var triangles = 0;
  14. scene.traverse( function ( object ) {
  15. if ( ! ( object instanceof THREE.Mesh ) ) return;
  16. triangles += object.geometry.faces.length;
  17. } );
  18. var offset = 80; // skip header
  19. var bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;
  20. var arrayBuffer = new ArrayBuffer( bufferLength );
  21. var output = new DataView( arrayBuffer );
  22. output.setUint32( offset, triangles, true ); offset += 4;
  23. scene.traverse( function ( object ) {
  24. if ( ! ( object instanceof THREE.Mesh ) ) return;
  25. if ( ! ( object.geometry instanceof THREE.Geometry ) ) return;
  26. var geometry = object.geometry;
  27. var matrixWorld = object.matrixWorld;
  28. var vertices = geometry.vertices;
  29. var faces = geometry.faces;
  30. normalMatrixWorld.getNormalMatrix( matrixWorld );
  31. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  32. var face = faces[ i ];
  33. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  34. output.setFloat32( offset, vector.x, true ); offset += 4; // normal
  35. output.setFloat32( offset, vector.y, true ); offset += 4;
  36. output.setFloat32( offset, vector.z, true ); offset += 4;
  37. var indices = [ face.a, face.b, face.c ];
  38. for ( var j = 0; j < 3; j ++ ) {
  39. vector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld );
  40. output.setFloat32( offset, vector.x, true ); offset += 4; // vertices
  41. output.setFloat32( offset, vector.y, true ); offset += 4;
  42. output.setFloat32( offset, vector.z, true ); offset += 4;
  43. }
  44. output.setUint16( offset, 0, true ); offset += 2; // attribute byte count
  45. }
  46. } );
  47. return output;
  48. };
  49. }() )
  50. };