STLBinaryExporter.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. var geometry = object.geometry;
  26. if ( geometry instanceof THREE.BufferGeometry ) {
  27. geometry = new THREE.Geometry().fromBufferGeometry( geometry );
  28. }
  29. if ( ! ( geometry instanceof THREE.Geometry ) ) return;
  30. var matrixWorld = object.matrixWorld;
  31. var vertices = geometry.vertices;
  32. var faces = geometry.faces;
  33. normalMatrixWorld.getNormalMatrix( matrixWorld );
  34. for ( var i = 0, l = faces.length; i < l; i ++ ) {
  35. var face = faces[ i ];
  36. vector.copy( face.normal ).applyMatrix3( normalMatrixWorld ).normalize();
  37. output.setFloat32( offset, vector.x, true ); offset += 4; // normal
  38. output.setFloat32( offset, vector.y, true ); offset += 4;
  39. output.setFloat32( offset, vector.z, true ); offset += 4;
  40. var indices = [ face.a, face.b, face.c ];
  41. for ( var j = 0; j < 3; j ++ ) {
  42. vector.copy( vertices[ indices[ j ] ] ).applyMatrix4( matrixWorld );
  43. output.setFloat32( offset, vector.x, true ); offset += 4; // vertices
  44. output.setFloat32( offset, vector.y, true ); offset += 4;
  45. output.setFloat32( offset, vector.z, true ); offset += 4;
  46. }
  47. output.setUint16( offset, 0, true ); offset += 2; // attribute byte count
  48. }
  49. } );
  50. return output;
  51. };
  52. }() )
  53. };