Esporta il modello JavaFX in file STL
Vorrei generare alcune forme in JavaFX ed esportarlo in formato STL per la stampa 3D. C'è una biblioteca là fuori per aiutare con l'esportazione?
1 answers
Per la prima parte, relativa a JavaFX 3D, ti suggerisco di dare un'occhiata alla libreria FXyz .
Troverete una libreria extense di forme personalizzate come: Cono, Piramide, SegmentedSphere, Sferoide, Toro, SegmentedTorus, Prisma, Primavera, CurvedSpring, Frustum, Icosaedro, Nodo,...
Inoltre, dai un'occhiata al campionatore applicazione, dove puoi provare facilmente tutte queste forme e le diverse opzioni (luci, materiali, trame, ...).
Un'altra opzione è il progetto JCSG , che creerà forme CSG (Geometria solida costruttiva) con operazioni booleane.
Per la seconda parte, esportando in STL a TriangleMesh
, per quanto ne so non esiste alcuna implementazione per JavaFX.
Nella libreria FXyz menzionata puoi trovare un OBJ exporter. Solo se stai lavorando con JCSG, c'è un esportatore STL CSG.toStlString()
, oltre a quello OBJ CSG.toObj()
.
Ad ogni modo, una volta che hai il tuo TriangleMesh
, dato il formato STL , è possibile creare facilmente un metodo di esportazione:
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());
}
}
}
E ora si può facilmente esportare una qualsiasi delle forme create:
@Override
public void start(Stage primaryStage) throws IOException {
FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
MeshUtils.mesh2STL("frustum.stl", cone.getMesh());
}
Questa è un'immagine della forma esportata utilizzando il browser del modello 3D da InteractiveMesh per caricare il file STL: