STLExporter.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /**
  2. * @author kovacsv / http://kovacsv.hu/
  3. */
  4. THREE.STLExporter = function () {
  5. this.stlContent = '';
  6. };
  7. THREE.STLExporter.prototype = {
  8. constructor: THREE.STLExporter,
  9. exportScene : function (scene) {
  10. var meshes = [];
  11. var current;
  12. scene.traverse (function (current) {
  13. if (current instanceof THREE.Mesh) {
  14. meshes.push (current);
  15. }
  16. });
  17. return this.exportMeshes (meshes);
  18. },
  19. exportMesh : function (mesh) {
  20. return this.exportMeshes ([mesh]);
  21. },
  22. exportMeshes : function (meshes) {
  23. this.addLineToContent ('solid exported');
  24. var i, j, mesh, geometry, face, matrix, position;
  25. var normal, vertex1, vertex2, vertex3;
  26. for (i = 0; i < meshes.length; i++) {
  27. mesh = meshes[i];
  28. geometry = mesh.geometry;
  29. matrix = mesh.matrix;
  30. position = mesh.position;
  31. for (j = 0; j < geometry.faces.length; j++) {
  32. face = geometry.faces[j];
  33. normal = face.normal;
  34. if (face instanceof THREE.Face3) {
  35. vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
  36. vertex2 = this.getTransformedPosition (geometry.vertices[face.b], matrix, position);
  37. vertex3 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
  38. this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
  39. } else if (face instanceof THREE.Face4) {
  40. vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
  41. vertex2 = this.getTransformedPosition (geometry.vertices[face.b], matrix, position);
  42. vertex3 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
  43. this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
  44. vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
  45. vertex2 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
  46. vertex3 = this.getTransformedPosition (geometry.vertices[face.d], matrix, position);
  47. this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
  48. }
  49. }
  50. };
  51. this.addLineToContent ('endsolid exported');
  52. return this.stlContent;
  53. },
  54. clearContent : function ()
  55. {
  56. this.stlContent = '';
  57. },
  58. addLineToContent : function (line) {
  59. this.stlContent += line + '\n';
  60. },
  61. addTriangleToContent : function (normal, vertex1, vertex2, vertex3) {
  62. this.addLineToContent ('\tfacet normal ' + normal.x + ' ' + normal.y + ' ' + normal.z);
  63. this.addLineToContent ('\t\touter loop');
  64. this.addLineToContent ('\t\t\tvertex ' + vertex1.x + ' ' + vertex1.y + ' ' + vertex1.z);
  65. this.addLineToContent ('\t\t\tvertex ' + vertex2.x + ' ' + vertex2.y + ' ' + vertex2.z);
  66. this.addLineToContent ('\t\t\tvertex ' + vertex3.x + ' ' + vertex3.y + ' ' + vertex3.z);
  67. this.addLineToContent ('\t\tendloop');
  68. this.addLineToContent ('\tendfacet');
  69. },
  70. getTransformedPosition : function (vertex, matrix, position) {
  71. var result = vertex.clone ();
  72. if (matrix !== undefined) {
  73. result.applyMatrix4 (matrix);
  74. }
  75. if (position !== undefined) {
  76. result.add (position);
  77. }
  78. return result;
  79. }
  80. };