2

ボックスの単純なモデルを作成し、テクスチャ マップを使用してカラー補間イメージを作成しました。にあるコードを使用して、モデルを fxml にエクスポートしました。

FXML エクスポート コード

エクスポートしようとした色付きのモデルとその結果のインポートされたモデルの jpeg がありますが、スタック オーバーフローは初めてで、まだ画像を投稿することは許可されていません。

エクスポートされた FXML ファイルのコンテンツを添付する方法も見つかりませんでしたが、共有できれば幸いです。

標準の FXMLLoader を使用して fxml ファイルをアプリケーションにインポートすると、カラー マッピングが表示されません。エクスポートが不完全だったのか、インポートが間違っていたのかわかりません。FXML ファイルには正しいメッシュ ポインタとテクスチャ マップ ポインタがあるように見えますが、テクスチャ マップが表示されません。PhongMaterial の setDiffuseMap メソッドを使用して、WritableImage と PixelWriter を使用して構成されたマテリアル オブジェクトに画像を割り当て、色のバンドを作成しました。この方法で構築された PhongMaterial オブジェクトのエクスポートが FXMLExporter でサポートされているかどうか、または FXMLImporter がそのようなカラー マップのインポートをサポートしていないかどうかを知っている人はいますか?

Jose からの提案に基づいてコードを変更しましたが、いくつかの問題が発生しました。

2 つの立方体の各面を個別の TriangleMesh として定義し、最終的にはシーン内のオブジェクトを選択するときに各面を区別できるようにしたいと考えました。画像を拡散マップとして持つ単一の PhongMaterial オブジェクトがあります。2 つの立方体の各面に同じマテリアルを割り当てました。

モデルをエクスポートすると、エクスポート メソッドは画像ファイルを 12 回書き込もうとします。単一のフォン素材が使用されており、単一のカラー画像に基づいていることをモデル定義に伝える方法があるはずです。

FXML ファイルのエクスポートに使用されるファイル名を記憶するコードを export メソッドに追加して、FXML ファイル名 (exportImage() に渡されるフル パス名) に基づいて画像ファイルに名前を割り当てることができるようにしました。パスがない場合、画像ファイルは FXML ファイルと同じフォルダーではなく、Eclipse ワークスペース内に保存されます。fxmlImage.addProperty("url",filename) に付けるべき名前がわかりません。フル パス名にするか、ファイル名だけにするか。完全なパス名を使用すると、FXML ファイル内にハードコーディングされたパスがあり、それは悪い考えのように思えます。URL 名をフル パスありとなしで保存しようとしましたが、両方の方法で同じ結果が得られました...つまり、FXML ファイルをインポートしたときにモデルが表示されませんでした。また、先頭の @ の有無にかかわらず試してみましたが、同じ結果が得られました。誰かが私が間違っているかもしれないことを知っていますか?

4

1 に答える 1

1

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>
于 2015-04-13T13:43:58.760 に答える