Prechádzať zdrojové kódy

Added STL exporter which can export a whole scene, or the given meshes to STL file format.

kovacsv 12 rokov pred
rodič
commit
e9474838a9
1 zmenil súbory, kde vykonal 96 pridanie a 0 odobranie
  1. 96 0
      examples/js/exporters/STLExporter.js

+ 96 - 0
examples/js/exporters/STLExporter.js

@@ -0,0 +1,96 @@
+/**
+ * @author kovacsv / http://kovacsv.hu/
+ */
+ 
+THREE.STLExporter = function () {
+	this.stlContent = '';
+};
+
+THREE.STLExporter.prototype = {
+	constructor: THREE.STLExporter,
+	
+	exportScene : function (scene) {
+		var meshes = [];
+		
+		var current;
+		scene.traverse (function (current) {
+			if (current instanceof THREE.Mesh) {
+				meshes.push (current);
+			}
+		});
+		
+		return this.exportMeshes (meshes);
+	},
+	
+	exportMesh : function (mesh) {
+		return this.exportMeshes ([mesh]);
+	},
+	
+	exportMeshes : function (meshes) {
+		this.addLineToContent ('solid exported');
+		
+		var i, j, mesh, geometry, face, matrix, position;
+		var normal, vertex1, vertex2, vertex3;
+		for (i = 0; i < meshes.length; i++) {
+			mesh = meshes[i];
+			
+			geometry = mesh.geometry;
+			matrix = mesh.matrix;
+			position = mesh.position;
+			
+			for (j = 0; j < geometry.faces.length; j++) {
+				face = geometry.faces[j];
+				normal = face.normal;
+				if (face instanceof THREE.Face3) {
+					vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
+					vertex2 = this.getTransformedPosition (geometry.vertices[face.b], matrix, position);
+					vertex3 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
+					this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
+				} else if (face instanceof THREE.Face4) {
+					vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
+					vertex2 = this.getTransformedPosition (geometry.vertices[face.b], matrix, position);
+					vertex3 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
+					this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
+
+					vertex1 = this.getTransformedPosition (geometry.vertices[face.a], matrix, position);
+					vertex2 = this.getTransformedPosition (geometry.vertices[face.c], matrix, position);
+					vertex3 = this.getTransformedPosition (geometry.vertices[face.d], matrix, position);
+					this.addTriangleToContent (normal, vertex1, vertex2, vertex3);
+				}
+			}
+		};
+		
+		this.addLineToContent ('endsolid exported');
+		return this.stlContent;
+	},
+	
+	clearContent : function ()
+	{
+		this.stlContent = '';
+	},
+	
+	addLineToContent : function (line) {
+		this.stlContent += line + '\n';
+	},
+	
+	addTriangleToContent : function (normal, vertex1, vertex2, vertex3) {
+		this.addLineToContent ('\tfacet normal ' + normal.x + ' ' + normal.y + ' ' + normal.z);
+		this.addLineToContent ('\t\touter loop');
+		this.addLineToContent ('\t\t\tvertex ' + vertex1.x + ' ' + vertex1.y + ' ' + vertex1.z);
+		this.addLineToContent ('\t\t\tvertex ' + vertex2.x + ' ' + vertex2.y + ' ' + vertex2.z);
+		this.addLineToContent ('\t\t\tvertex ' + vertex3.x + ' ' + vertex3.y + ' ' + vertex3.z);
+		this.addLineToContent ('\t\tendloop');
+		this.addLineToContent ('\tendfacet');
+	},
+	
+	getTransformedPosition : function (vertex, matrix, position) {
+		var result = vertex.clone ();
+		if (matrix !== undefined) {
+			result.applyMatrix4 (matrix);
+		}
+		if (position !== undefined) {
+			result.add (position);
+		}
+		return result;
+	}
+};