1

我在 Blender 中创建了一个导出到 STL 的设计,并使用StlModelImporterJFX将其导入我的 JavaFX 程序并运行它。一切运行良好,应用程序正常工作,只是缺少一件事......纹理,所以基本上,我想使用我导入的网格并创建一个如下所示的图像,用于更小的设计。

在此处输入图像描述

是否有任何程序或算法可用于创建如下图所示的图像,以后可以手动编辑并用作整个三角形网格的纹理?另外,是否可以在程序中实时编辑此图像并在运行时换掉颜色?对不起,如果这措辞不好,如果您需要任何澄清,我可以提供。

4

1 回答 1

2

当您使用第三方 3D 导入器导入 3D 模型时,您对生成的 TriangleMesh 的控制较少。如果要为模型提供纹理特征,则必须编辑导出的文件并添加纹理坐标,这不是最好的方法。

但是,如果您可以从头开始生成网格,则可以轻松地在其上应用纹理。

这个问题展示了如何定义纹理坐标并使用相同的网络图像来提供二十面体的纹理。

根据该问题的答案,可以在没有实际图像的情况下定义纹理,只需使用调色板即可。

您可以在运行时轻松更改它们,即当您单击一张脸时,您可以更改该脸的颜色。

Fxyz使用 TexturedMesh,旨在轻松地将纹理应用于 3D 形状。

您可以在那里找到许多原语,例如icosahedron

这个问题显示了二十面体上不同纹理模式的结果。

这个简短的片段展示了如何在面上应用纹理,并在运行时更改它:

private int numColors = 10;

@Override
public void start(Stage primaryStage) {
    PerspectiveCamera camera = new PerspectiveCamera(true);   
    camera.setTranslateZ(-5);

    IcosahedronMesh icoFaces = new IcosahedronMesh(100, 0);
    icoFaces.setTextureModeFaces(numColors);
    icoFaces.getTransforms().addAll(new Rotate(20, Rotate.X_AXIS), new Rotate(-10, Rotate.Y_AXIS));

    final Group group = new Group(icoFaces);

    Scene scene = new Scene(group, 600, 400, true, SceneAntialiasing.BALANCED);
    scene.setCamera(camera);

    primaryStage.setScene(scene);
    primaryStage.setTitle(("Icosahedron - FXyz3D"));
    primaryStage.show(); 

    icoFaces.setOnMouseClicked(e -> {
        ObservableFaceArray faces = ((TriangleMesh) icoFaces.getMesh()).getFaces();
        int selectedFace = e.getPickResult().getIntersectedFace();

        int colorId = faces.get(6 * selectedFace + 1);
        int newColorId = colorId + 1 >= numColors ? 0 : colorId + 1;
        faces.set(6 * selectedFace + 1, newColorId);
        faces.set(6 * selectedFace + 3, newColorId);
        faces.set(6 * selectedFace + 5, newColorId);
    });
}

运行应用程序:

二十面体

点击正面的绿脸后:

具有新面纹理的二十面体

于 2017-05-22T09:17:58.997 回答