Exporter le modèle JavaFX vers un fichier STL
Je voudrais générer des formes dans JavaFX et les exporter au format STL pour l'impression 3D. Existe-t-il une bibliothèque pour aider à l'exportation?
1 answers
Pour la première partie, liée à JavaFX 3D, je vous suggère de jeter un œil à la bibliothèque FXyz .
Vous trouverez une bibliothèque extense de formes personnalisées comme: Cône, Pyramide, SegmentedSphere, Sphéroïde, Tore, SegmentedTorus, Prisme, Ressort, CurvedSpring, Frustum, Icosaèdre, Noeud,...
Aussi, jetez un oeil à l'application sampler , où vous pouvez essayer facilement toutes ces formes et les différentes options (lumières, matériaux, textures, ...).
Une autre option est le projet JCSG , qui créera des formes CSG (Géométrie solide constructive) avec des opérations booléennes.
Pour la deuxième partie, exportation vers STL a TriangleMesh
, pour autant que je sache, il n'y a pas d'implémentation pour JavaFX.
Dans la bibliothèque Fxyz mentionnée, vous pouvez trouver un OBJ exporter. Seulement si vous travaillez avec JCSG, il existe un exportateur STL CSG.toStlString()
, en plus de celui OBJ CSG.toObj()
.
De toute façon, une fois que vous avez votre TriangleMesh
, étant donné le format STL , vous pouvez facilement créer une méthode d'exportateur:
public class MeshUtils {
public static void mesh2STL(String fileName, Mesh mesh) throws IOException{
if(!(mesh instanceof TriangleMesh)){
return;
}
// Get faces
ObservableFaceArray faces = ((TriangleMesh)mesh).getFaces();
int[] f=new int[faces.size()];
faces.toArray(f);
// Get vertices
ObservableFloatArray points = ((TriangleMesh)mesh).getPoints();
float[] p = new float[points.size()];
points.toArray(p);
StringBuilder sb = new StringBuilder();
sb.append("solid meshFX\n");
// convert faces to polygons
for(int i=0; i<faces.size()/6; i++){
int i0=f[6*i], i1=f[6*i+2], i2=f[6*i+4];
Point3D pA=new Point3D(p[3*i0], p[3*i0+1], p[3*i0+2]);
Point3D pB=new Point3D(p[3*i1], p[3*i1+1], p[3*i1+2]);
Point3D pC=new Point3D(p[3*i2], p[3*i2+1], p[3*i2+2]);
Point3D pN=pB.subtract(pA).crossProduct(pC.subtract(pA)).normalize();
sb.append(" facet normal ").append(pN.getX()).append(" ").append(pN.getY()).append(" ").append(pN.getZ()).append("\n");
sb.append(" outer loop\n");
sb.append(" vertex ").append(pA.getX()).append(" ").append(pA.getY()).append(" ").append(pA.getZ()).append("\n");
sb.append(" vertex ").append(pB.getX()).append(" ").append(pB.getY()).append(" ").append(pB.getZ()).append("\n");
sb.append(" vertex ").append(pC.getX()).append(" ").append(pC.getY()).append(" ").append(pC.getZ()).append("\n");
sb.append(" endloop\n");
sb.append(" endfacet\n");
}
sb.append("endsolid meshFX\n");
// write file
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(fileName), Charset.forName("UTF-8"),
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
writer.write(sb.toString());
}
}
}
Et maintenant, vous pouvez facilement exporter les formes que vous créez:
@Override
public void start(Stage primaryStage) throws IOException {
FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
MeshUtils.mesh2STL("frustum.stl", cone.getMesh());
}
Il s'agit d'une image de la forme exportée à l'aide du navigateur de modèles 3D à partir de InteractiveMesh pour charger le fichier STL: