将 JavaFX 模型导出到 STL 文件
Export JavaFX model to STL file
我想在 JavaFX 中生成一些形状并将其导出为 STL 格式以进行 3D 打印。是否有图书馆可以帮助导出?
关于JavaFX 3D的第一部分,我建议你看看FXyz library。
您会发现一个扩展的自定义形状库,例如:圆锥体、金字塔、SegmentedSphere、球体、圆环体、SegmentedTorus、棱柱体、Spring、曲线Spring、截锥体、二十面体、结。 ..
另外,看看采样器 application,您可以在其中轻松尝试所有这些形状和不同的选项(灯光、材质、纹理...)。
另一个选项是 JCSG project,它将使用布尔运算创建 CSG(构造实体几何)形状。
对于第二部分,导出到 STL TriangleMesh
,据我所知,JavaFX 没有实现。
在提到的 FXyz 库中,您可以找到一个 OBJ exporter。只有在使用 JCSG 时,才会有一个 STL 导出器 CSG.toStlString()
,除了 OBJ 导出器 CSG.toObj()
.
无论如何,一旦你有了 TriangleMesh
,给定 STL format,你就可以轻松地创建一个导出器方法:
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());
}
}
}
现在您可以轻松导出您创建的任何形状:
@Override
public void start(Stage primaryStage) throws IOException {
FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
MeshUtils.mesh2STL("frustum.stl", cone.getMesh());
}
这是使用 InteractiveMesh 的 3D 模型浏览器加载 STL 文件的导出形状的图片:
我想在 JavaFX 中生成一些形状并将其导出为 STL 格式以进行 3D 打印。是否有图书馆可以帮助导出?
关于JavaFX 3D的第一部分,我建议你看看FXyz library。
您会发现一个扩展的自定义形状库,例如:圆锥体、金字塔、SegmentedSphere、球体、圆环体、SegmentedTorus、棱柱体、Spring、曲线Spring、截锥体、二十面体、结。 ..
另外,看看采样器 application,您可以在其中轻松尝试所有这些形状和不同的选项(灯光、材质、纹理...)。
另一个选项是 JCSG project,它将使用布尔运算创建 CSG(构造实体几何)形状。
对于第二部分,导出到 STL TriangleMesh
,据我所知,JavaFX 没有实现。
在提到的 FXyz 库中,您可以找到一个 OBJ exporter。只有在使用 JCSG 时,才会有一个 STL 导出器 CSG.toStlString()
,除了 OBJ 导出器 CSG.toObj()
.
无论如何,一旦你有了 TriangleMesh
,给定 STL format,你就可以轻松地创建一个导出器方法:
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());
}
}
}
现在您可以轻松导出您创建的任何形状:
@Override
public void start(Stage primaryStage) throws IOException {
FrustumMesh cone = new FrustumMesh(1,0.2,4,2);
MeshUtils.mesh2STL("frustum.stl", cone.getMesh());
}
这是使用 InteractiveMesh 的 3D 模型浏览器加载 STL 文件的导出形状的图片: