JavaFX纹理化导入的3D对象

时间:2015-04-11 14:54:17

标签: 3d textures javafx-8 collada

所以我试图使用InteractiveMesh的ColModelImporterJFX将collada .dae文件导入Javafx场景。

我已经从jar工作和渲染到场景中导入了模型,但是没有关于将PhongMaterials添加到返回的MeshViews的任何有用文档。

ColModelImporter station = new ColModelImporter();
station.setResourceBaseUrl(ClassLoader.getSystemResource("models/Station"));
station.read(ClassLoader.getSystemResource("models/station.dae"));

返回的节点数组中唯一的节点似乎是一个包含所有节点的组。

Group model = (Group)(station.getImport()[0]);
root.getChildren().addAll(model);

我所知道的是getNamedMaterials()方法返回一个材料图,但不知道如何实际应用它们。

Map<String, PhongMaterial> tex = station.getNamedMaterials();

虽然我确实找到了一种方法将材质单独应用到每个MeshView(组模型包含另一个包含所有MeshView节点的组),但它根本无法帮助我,因为我无法知道哪个材料与MeshView一起使用。

for (int i = 0; i < ((Group) model.getChildren().get(0)).getChildren().size(); i++) {
        ((MeshView) ((Group) model.getChildren().get(0)).getChildren().get(i)).setMaterial(somematerial);
}

我确实用ModelBrowserJFX试用了我的3D模型,它可以正常工作。

representation

所有帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

PhongMaterials已被应用,但是它们的URL不正确(至少我是这种情况)。如果您使用 windows TIFF 文件,则可能会出现这样的纹理,您将无法通过 JavaFX Image 上传。

此代码将向您显示问题所在。

URL url = getClass().getResource("/models/hst.3ds");
ModelImporter modelImporter = new TdsModelImporter();
modelImporter.read(url);
Node[] nodes = (Node[]) modelImporter.getImport();
Map<String, PhongMaterial> mapTexs = modelImporter.getNamedMaterials();
Iterator<String> it = mapTexs.keySet().iterator();
while (it.hasNext()) {
    PhongMaterial material = mapTexs.get(it.next());
    if(Objects.nonNull(material.getBumpMap())) {
       printErrors(material.getBumpMap());
    }
    if(Objects.nonNull(material.getDiffuseMap())) {
       printErrors(material.getDiffuseMap());
    }
    if(Objects.nonNull(material.getSpecularMap())) {
       printErrors(material.getSpecularMap());
    }
}

private void printErrors(Image image) {
    System.out.println(image.getException().getMessage());
}

方法1

您将需要使用正确的URL更改图片,然后设置单独的 PhongMaterial 。如您所见,我在 src 中创建了一个名为textures的文件夹,然后在其中添加了所有纹理。这种方法有一个很大的缺点。变量 key 的值必须与纹理文件的名称相同。

URL url = getClass().getResource("/models/hst.3ds");
ModelImporter modelImporter = new TdsModelImporter();
modelImporter.read(url);
Node[] nodes = (Node[]) modelImporter.getImport();
Map<String, PhongMaterial> mapTexs = modelImporter.getNamedMaterials();
Iterator<String> it = mapTexs.keySet().iterator();
while (it.hasNext()) {
      String key = it.next();
      mapTexs.get(key).setDiffuseMap(new Image("/textures/" + key + ".bmp"));
}

方法2

您在此处添加了纹理,模型位于项目中。因此,就我而言,它们与模型的位置相同,这意味着我会将它们放入文件夹models中。这种方法比以前的方法容易得多。

使用的模型不属于我。它是由DigitalSpace Corporation制造的。