STLBinaryExporter.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. };