当前位置: 首页 > 知识库问答 >
问题:

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

司马钱明
2023-03-14

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

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

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

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

共有1个答案

卫宏硕
2023-03-14

如果您查看OpenJFX上3DViewer项目中FxmlExporter类的上一个版本,您将看到对于材料只导出漫射色:

if (PhongMaterial.class.isAssignableFrom(aClass)) {
    res.add(new Property(aClass.getMethod("getDiffuseColor"), "diffuseColor"));
}

同样的情况也发生在你提到的项目中。

您可以添加这一行:

res.add(new Property(aClass.getMethod("getDiffuseMap"), "diffuseMap"));
if (PhongMaterial.class.isAssignableFrom(aClass)) {
    res.add(new Property(aClass.getMethod("getDiffuseColor"), "diffuseColor"));
    res.add(new Property(aClass.getMethod("getDiffuseMap"), "diffuseMap"));
}

因此,当您导出3D形状时,它将被添加到fxml文件中:

<Box id="box" width="100.0" height="100.0" depth="100.0">
  <material>
    <PhongMaterial diffuseColor="0xffffffff">
      <diffuseMap>
        <Image/>
      </diffuseMap>
    </PhongMaterial>
  </material>
</Box>

我们还需要导出图像URL。这可以在exporttofxml方法中完成。

由于扩散映射的图像不存储任何路径,因此技巧是将图像保存到导出fxml的相同路径。这是一个快速实现:

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>
 类似资料:
  • 从SQL Server导入,数据类型未正确转换堆栈:已使用Ambari 2.1安装HDP-2.3.2.0-2950 目的: null 我错过了什么?

  • 这可能是个愚蠢的问题,但我无论如何也无法解决。我有一个JavaScript文件,其中包含我想要导出的各种函数。 当我调用这个方法(使用mocha)时,我得到一条错误消息“export function AddNumbers(…numbers)Unexpected token export”。该项目构建为ES6。有人知道我做错了什么吗? 最好的问候,托斯顿

  • 我正在将一个KML文件导入到fusion表中,发现缺少行—我只得到前4行。我在Google Earth中检查了该文件,所有多边形都显示得很好,因此我确信KML文件没有损坏。 当我第一次在GoogleDrive表中打开该文件时,它有一个注释,其中有17%是导入的,但随后就消失了。似乎导入没有完成。该文件为20MB。 任何提示或建议。我环顾四周,没有发现类似的问题。感谢指导员! PS:如果您对以下问题

  • 问题内容: 有人可以为我提供关于类对象的一些指导,以及如何在我的项目中的另一个对象中引用它吗? 这是我的对象-request-api.js(注意:我知道它还没有进行很多操作,但是我想走路之前要走路) 这是我试图在其中引用的React Class组件: 我的React Component Class对象出现错误: 谁能为我提供一些见识/帮助? 问题答案: 由于不是静态方法,因此您需要先创建的实例,然

  • 注意:我知道有很多关于这个主题的帖子,我已经审阅了相当多的没有成功(请看我在这篇文章底部的参考资料)。 我正试图使用Visual Studio代码在TypeScript中运行一个非常简单的测试,其中我在一个文件中声明一个类并将其导入到另一个文件中。但是,我仍然遇到一个问题,我正在导入的文件无法识别我从另一个文件导出的类的方法。 此时我收到的确切错误消息是: [ts]属性“Get FirstName

  • 我必须使用谷歌云语音API在Xamarin.iOS应用程序中实现语音转换文本功能。 首先,我尝试使用google.cloud.speech.v1 Nuget包,但是gRPC库似乎不能与Xamarin一起工作(https://github.com/gRPC/gRPC/issues/1620,https://forums.Xamarin.com/discussion/94534/how-to-use-