javafx - 将 JavaFX 模型导出到 STL 文件

标签 javafx 3d java-3d javafx-3d

我想在 JavaFX 中生成一些形状并将其导出为 STL 格式以进行 3D 打印。有图书馆可以帮助导出吗?

最佳答案

对于与 JavaFX 3D 相关的第一部分,我建议您查看 FXyz library .

您会发现一个扩展的自定义形状库,例如:圆锥体、金字塔、SegmentedSphere、球体、环面、SegmentedTorus、棱柱、 Spring 、CurvedSpring、平截头体、二十面体、结...

另外,看看采样器 application ,您可以在其中轻松尝试所有这些形状和不同的选项(灯光、 Material 、纹理......)。

Sampler application

另一个选择是 JCSG project ,这将通过 bool 运算创建 CSG(构造实体几何)形状。

对于第二部分,将 TriangleMesh 导出到 STL,据我所知,JavaFX 没有实现。

在提到的 FXyz 库中,您可以找到一个 OBJ exporter 。仅当您使用 JCSG 时,除了 OBJ 导出器 CSG.toObj() 之外,还有一个 STL 导出器 CSG.toSTLString()

无论如何,一旦你有了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());

}

这是使用 3D 模型浏览器从 InteractiveMesh 导出的形状的图片加载STL文件:

STL

关于javafx - 将 JavaFX 模型导出到 STL 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29971199/

相关文章:

javascript - 3D 立方体创建和处理该立方体上的事件

Java-3d 碰撞检测

Java3d : Texture is not applied to OBJ model properly

java - 无法使用已安装的 java 3d

java - JavaFX 多线程导致 java.lang.IllegalStateException : Not on FX application thread

JavaFX 2 : How to load stylesheet into a Scene subclass distributed as part of a library?

JavaFX 对话 - 游戏

java - 在 3d 空间中渲染三角形面

java - 在 Java 3D 中拾取形状

java - 使用 JfxPanel 从 JavaFX WebView 打印