【问题标题】:Texturing an Imported Triangle Mesh Javafx纹理导入的三角形网格 Javafx
【发布时间】:2017-05-22 17:19:03
【问题描述】:

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

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

【问题讨论】:

  • JavaFx 有一个可以创建三角形的多边形类。这将使您能够更好地控制每个三角形可以做什么。
  • 您是否在 Blender 中创建了图像并且它没有被导入?您可以使用任何 3D 建模工作室创建纹理。如果您想动态编辑图像,您必须首先进行图像处理或在 JavaFX 中创建图像。

标签: java javafx 3d textures javafx-3d


【解决方案1】:

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

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

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

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

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

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

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

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

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

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);
    });
}

运行应用程序:

点击正面绿脸后:

【讨论】:

  • 不幸的是,我导入的文件太复杂了,无法在搅拌机之外简单地生成,我特别关注的是总共 1,050,625 张面孔,所以在 JavaFX 中简单地生成它不是一种选择我必须导入它。
  • 在 JavaFX 模型中拥有纹理的唯一方法是最初使用 Blender 模型导出它们。我以前用 .OBJ 模型做过。请参阅此project。注意 *.obj 文件已经包含每个面的纹理坐标。
  • 我可以在软件运行时编辑导入的纹理吗?另外,我现在用的是STL,但是可以换成OBJ,材质有很大区别吗?
  • 一旦你有了一个三角形网格,你总是可以通过用鼠标选择它的一个面,所以改变纹理是一个切换索引的问题,正如我在我的示例中向你展示的那样。问题可能在于找出新值的正确值。
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2015-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
相关资源
最近更新 更多