如果您查看OpenJFX项目中FXMLExporter
该类的最新版本,您将看到对于材质,仅导出了漫反射颜色:3DViewer
if (PhongMaterial.class.isAssignableFrom(aClass)) {
res.add(new Property(aClass.getMethod("getDiffuseColor"), "diffuseColor"));
}
您提到的项目中也发生了同样的情况。
您可以添加此行:
res.add(new Property(aClass.getMethod("getDiffuseMap"), "diffuseMap"));
至getProperties()
:
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
方法中完成。
由于Image
漫反射贴图不存储任何路径,因此诀窍是将图像保存到导出 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>