javafx 3d导出到fxml或从fxml导入不正确或不完整

javafx 3d导出到fxml或从fxml导入不正确或不完整,3d,javafx,export,fxml,javafx-3d,3d,Javafx,Export,Fxml,Javafx 3d,我创建了一个简单的盒子模型,并使用纹理贴图创建了一个颜色插值图像。我使用在中找到的代码将模型导出到fxml 我有一个jpeg的彩色模型,我试图导出和结果导入模型,但我是新的堆栈溢出,我不允许张贴图像尚未 我也找不到附加导出的FXML文件内容的方法,但我很乐意与大家分享 当我使用标准FXMLLoader将fxml文件导入回我的应用程序时,颜色映射不可见。我不知道是出口不完整还是进口不正确。FXML文件似乎具有正确的网格和纹理贴图指针,但我没有看到纹理贴图的表示形式。我使用PhongMateria

我创建了一个简单的盒子模型,并使用纹理贴图创建了一个颜色插值图像。我使用在中找到的代码将模型导出到fxml

我有一个jpeg的彩色模型,我试图导出和结果导入模型,但我是新的堆栈溢出,我不允许张贴图像尚未

我也找不到附加导出的FXML文件内容的方法,但我很乐意与大家分享

当我使用标准FXMLLoader将fxml文件导入回我的应用程序时,颜色映射不可见。我不知道是出口不完整还是进口不正确。FXML文件似乎具有正确的网格和纹理贴图指针,但我没有看到纹理贴图的表示形式。我使用PhongMaterial setDiffuseMap方法将图像指定给材质对象,该材质对象是使用可写图像和PixelWriter创建一条颜色带而构建的。是否有人知道FXMLExporter是否支持导出以这种方式构造的PhongMaterial对象,或者FXMLImporter是否不支持导入这样的颜色贴图

根据Jose的建议,我对代码进行了更改,但遇到了一些问题

我将两个立方体的每个面定义为一个单独的三角形网格,认为最终我希望在选择场景中的对象时能够区分每个面。我有一个单一的PhongMaterial对象,它将图像作为漫反射贴图。我已经为我的两个立方体的每个面指定了相同的材质

导出模型时,导出方法尝试写入图像文件12次。似乎应该有一种方法来向模型定义传达正在使用单个phong材质,并且它基于单色图像


我在export方法中添加了代码,以记住用于导出FXML文件的文件名,以便根据FXML文件名(传递给exportImage()的完整路径名)为图像文件分配一个名称。如果没有路径,图像文件将存储在Eclipse工作区中,而不是与FXML文件存储在同一文件夹中。我不确定应该给fxmlImage.addProperty起什么名字(“url”,文件名)。是完整路径名还是文件名?如果我使用完整的路径名,那么我在FXML文件中有一个硬编码的路径,这似乎是个坏主意。我尝试保存URL名称,有完整路径和没有完整路径,两种方法都得到了相同的结果。。。这是因为当我导入FXML文件时,没有模型出现。我也试过有没有领先,结果是一样的。有人知道我可能做错了什么吗?

如果您在上的
3DViewer
项目中查看了
FXMLExporter
类的最新版本,您将看到,对于材质,仅导出漫反射颜色:

if (PhongMaterial.class.isAssignableFrom(aClass)) {
    res.add(new Property(aClass.getMethod("getDiffuseColor"), "diffuseColor"));
}
同样的情况也发生在你提到的项目中

您可以添加以下行:

res.add(new Property(aClass.getMethod("getDiffuseMap"), "diffuseMap"));
getProperties()

因此,在导出3D形状时,该形状将添加到fxml文件中:

<Box id="box" width="100.0" height="100.0" depth="100.0">
  <material>
    <PhongMaterial diffuseColor="0xffffffff">
      <diffuseMap>
        <Image/>
      </diffuseMap>
    </PhongMaterial>
  </material>
</Box>
如果您现在运行它,将得到以下结果:

<Box id="box" width="100.0" height="100.0" depth="100.0">
  <material>
    <PhongMaterial diffuseColor="0xffffffff">
      <diffuseMap>
        <Image url="@image.png"/>
      </diffuseMap>
    </PhongMaterial>
  </material>
</Box>


非常感谢您的建议。我遇到了一些问题。我将两个立方体的每个面定义为一个单独的三角形网格,认为最终我希望在选择场景中的对象时能够区分每个面。我已经为两个立方体的每个面指定了相同的材质,导出尝试写入图像文件12次。似乎应该有一种方法向模型定义传达所有图像都是相同的。即使您有多个3D形状,但使用相同的材质,也可以执行一些检查以避免再次导出图像。如果你有不同的纹理,你需要添加一些计数器来使用不同的图像。正如我所说,这是一个快速的实现,因此您可以处理细节。我同意我可以跟踪不同的图像。真正的问题是,正如我在编辑我原来的帖子时所描述的。。。现在还不清楚如何控制图像的去向,导入也不再有效。
private FXML exportToFXML(Object object) {
    ...

    for (Property property : properties) {
        try {
            Object[] parameters = new Object[property.getter.getParameterTypes().length];
            Object value = property.getter.invoke(object, parameters);
            if (value != null) {
                ...
                } else if (value instanceof Image) {
                    FXML container = fxml.addContainer(property.name);
                    FXML fxmlImage=exportToFXML(value);
                    container.addChild(fxmlImage);
                    exportImage((Image)value,"image.png");
                    fxmlImage.addProperty("url","@image.png");
                } else {
                    FXML container = fxml.addContainer(property.name);
                    container.addChild(exportToFXML(value));
                }
            }
        } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
            Logger.getLogger(FXMLExporter.class.getName()).
                    log(Level.SEVERE, null, ex);
        }
    }

    return fxml;
}

private void exportImage(Image image, String fileName){
    try {
        ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", new File(fileName));
    } catch (IOException ex) { 
        System.out.println("Error saving image");
    }
}
<Box id="box" width="100.0" height="100.0" depth="100.0">
  <material>
    <PhongMaterial diffuseColor="0xffffffff">
      <diffuseMap>
        <Image url="@image.png"/>
      </diffuseMap>
    </PhongMaterial>
  </material>
</Box>