JavaFX对导入的3D对象进行纹理处理

JavaFX对导入的3D对象进行纹理处理,3d,textures,javafx-8,collada,3d,Textures,Javafx 8,Collada,因此,我试图通过InteractiveMesh使用ColModelImporterJFX将collada.dae文件导入Javafx场景 我已经从jar导入了模型并将其渲染到场景中,但是没有任何关于将PhongMaterials添加到返回的MeshView的有用文档 ColModelImporter station = new ColModelImporter(); station.setResourceBaseUrl(ClassLoader.getSystemResource("models/

因此,我试图通过InteractiveMesh使用ColModelImporterJFX将collada.dae文件导入Javafx场景

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

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();
Map 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);
}
for(int i=0;i<((组)model.getChildren().get(0)).getChildren().size();i++){
((MeshView)((组)model.getChildren().get(0)).getChildren().get(i)).setMaterial(somematerial);
}
我确实用ModelBrowserJFX试用了我的3D模型,它可以正常工作


感谢所有帮助。

PhongMaterials已经应用,但它们的URL不正确(至少我是这样)。如果您使用windowsTIFF文件,则可能会发生这样的纹理,您将无法通过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());
}
URL=getClass().getResource(“/models/hst.3ds”);
ModelImporter ModelImporter=新的TdsModelImporter();
modelImporter.read(url);
节点[]节点=(节点[])modelImporter.getImport();
Map mapTexs=modelImporter.getNamedMaterials();
迭代器it=mapTexs.keySet().Iterator();
while(it.hasNext()){
PhongMaterial material=mapTexs.get(it.next());
if(Objects.nonNull(material.getBumpMap())){
打印错误(material.getBumpMap());
}
if(Objects.nonNull(material.getDiffuseMap())){
打印错误(material.getDiffuseMap());
}
if(Objects.nonNull(material.getSpecularMap())){
打印错误(material.getSpecularMap());
}
}
私有void打印错误(图像){
System.out.println(image.getException().getMessage());
}
方法1

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

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"));
}
URL=getClass().getResource(“/models/hst.3ds”);
ModelImporter ModelImporter=新的TdsModelImporter();
modelImporter.read(url);
节点[]节点=(节点[])modelImporter.getImport();
Map mapTexs=modelImporter.getNamedMaterials();
迭代器it=mapTexs.keySet().Iterator();
while(it.hasNext()){
String key=it.next();
get(key).setDiffuseMap(新图像(“/textures/”+key+”.bmp”);
}
方法2

将纹理添加到项目中模型所在的位置。所以,在我的例子中,它们和我的模型具有相同的位置,这意味着我将把它们放入文件夹中。这种方法比以前的方法简单得多


使用的模型不在我的范围内。它由DigitalSpace公司制造。

您是否尝试过不使用该材料?不同的网格视图应已应用其材质。这就是为什么使用模型浏览器可以看到它们。是的,它们都是白色的:/可能是因为光线。有灯光吗?我刚刚在InteractiveMesh尝试了collada示例,我不必添加材质。这确实让我想到可能纹理的位置不正确。。。我怀疑getResourceBaseUrl是否有多大作用。是的,我有灯光,还有很多在场景中有纹理(基本体)的对象,所以这确实有效