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?

Author: José Pereda, 2015-04-30

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, ...).

Application d'échantillonneur

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:

STL

 1
Author: José Pereda, 2015-04-30 16:42:18