We're sorry Aspose doesn't work properply without JavaScript enabled.

Free Support Forum - aspose.com

【Aspose.3D for .NET】USDZからDAEの変換でテクスチャが失われる

お世話になります。
Aspose3D for .NETでUSDZ形式の3DモデルファイルからDAE形式のファイルへの変換を行なっています。

元のUSDZでは画像によるテクスチャが表示されておりますが、DAEへの変換後にはテクスチャが表示されない状況です。テクスチャを維持したまま変換する方法はありますでしょうか。

変換元のUSDZファイルは、以下で公開されているものを使用しています。
https://devimages-cdn.apple.com/ar/photogrammetry/PegasusTrail.usdz
(リンク元)https://developer.apple.com/jp/augmented-reality/quick-look/

変換後のDAEのXMLには、画像ファイルへの参照パスが含まれていますが、参照先のパスに画像ファイルは存在しません。
試しに参照先のパス 0/texgen_1.png などに、手動で画像ファイルを配置しても状況は変わりませんでした。

変換しているプログラムです。

Scene scn = new Scene();
scn.Open("PegasusTrail.usdz");
scn.Save("PegasusTrail.dae", FileFormat.Collada.CreateSaveOptions());

変換後のDAEのテクスチャ画像への参照と思われる部分です。

  <library_images>
    <image id="diffuseColor_texture" name="diffuseColor_texture">
      <init_from>0/texgen_1.png</init_from>
    </image>
    <image id="normal_texture" name="normal_texture">
      <init_from>0/texgen_0.png</init_from>
    </image>
    <image id="occlusion_texture" name="occlusion_texture">
      <init_from>0/texgen_2.png</init_from>
    </image>
  </library_images>

よろしくお願いいたします。

@orishimos

THREEDNET-1165としての問題が問題追跡システムに記録されました。その詳細をさらに調査し、修正のステータスをお知らせします。しばらくお待ちください。

ご不便をおかけしてしまい申し訳ございません。

@asad.ali ご回答ありがとうございます。よろしくお願いいたします。

@orishimos

回避策として、すべてのノードのマテリアルをトラバースし、マテリアルからテクスチャを取得してから、Texture.Contentに埋め込みデータが含まれているかどうかを確認し、これらのバイトを必要な場所に書き込みます。ファイル名はTexture.FileNameにもあります。

ありがとうございます。
回答いただいた方法でテクスチャ画像を任意のパスに書き出す事で、問題は解決できました。

ノードを捜査してTexture.Contentを任意の場所に吐き出します。
(検証コードのため、nullチェック等の不足があるかもしれません)

for (int i = 0; i < scn.RootNode.ChildNodes.Count; i++)
{
    var node = root.ChildNodes[i];
    outputTextureImages(node);
}

static void outputTextureImages(Node node)
{
    for (int i = 0; i < node.Materials.Count; i++)
    {
        Material m = node.Materials[i];
        foreach (TextureSlot ts in m)
        {
            TextureBase tb = ts.Texture;
            if (tb is Texture)
            {
                File.WriteAllBytes("任意のパス" + Path.GetFileName(((Texture)tb).FileName), ((Texture)tb).Content);
            }
        }
    }

    for (int i = 0; i < node.ChildNodes.Count; i++)
    {
        var child = node.ChildNodes[i];
        outputTextureImages(child);
    }
}

@orishimos

問題を解決できたことを知ってうれしいです。問題が発生した場合に備えて、新しいトピックを自由に作成してください。