HTML JPG PDF XML USD
Aspose.3D  for .NET
USD

Extrahovat aktiva z USD prostřednictvím C#

Sestavte si své vlastní aplikace .NET pro extrahování prostředků ze souborů USD pomocí rozhraní API na straně serveru.

Jak extrahovat aktiva ze souboru USD pomocí C#

K extrahování aktiv ze souboru USD použijeme

Aspose.3D for .NET

API, což je funkčně bohatá, výkonná a snadno použitelná platforma API pro C#, kterou lze použít s aktivy extraktu. Otevřeno

NuGet

správce balíčků, vyhledejte Aspose.3D a nainstalovat. Můžete také použít následující příkaz z konzoly Správce balíčků.

Příkaz konzoly Správce balíčků


PM> Install-Package Aspose.3D

Kroky k extrakci aktiv z USD prostřednictvím C#

Aspose.3D usnadňuje vývojářům extrahovat prostředky ze souboru USD pomocí několika řádků kódu.

  • Načtěte soubor USD pomocí konstruktoru třídy Scene- Vytvořte objekt formátu souboru zip jako výstupní formát souboru- Vytvořte třídu archivu a zpracujte třídu aktiv extraktu- Zavolejte metodu Extract a uložte soubor

Požadavky na systém

Aspose.3D for .NET je podporováno ve všech hlavních operačních systémech. Jen se ujistěte, že máte následující předpoklady.

  • Microsoft Windows nebo kompatibilní OS s .NET Framework, .NET Core, Mono- Vývojové prostředí jako Microsoft Visual Studio- Aspose.3D for .NET odkazované ve vašem projektu
 

C# kód pro extrahování aktiv z USD


//Zdrojové soubory, které potřebují extrahovat aktiva
string file = "template.usd";
Scene scene = new Scene(file);  

//Výstup je ve formátu komprimovaného souboru a adresář představuje název existující složky
var zipOutput = Path.Combine("Directory", "OutputFile.zip");
using var output = new FileStream(zipOutput, FileMode.Create);
using var za = new Zip(output);

//Chcete-li provádět operace extrakce aktiv, zavolejte metodu Extract
Extract(scene,za,true);

//Metoda Callable Extract, Parametr textura udává: zda se má extrahovat textura
private void Extract(Scene scene, Zip za,bool texture)
{
    var extractor = new Extractor(za,texture);
    extractor.Extract(scene);
}

//Vytvořte třídu zpracování komprimovaného souboru
class Zip : IDisposable
{
    private ZipArchive archive;
    private HashSet<string> entries = new HashSet<string>();

    public Zip(Stream stream)
    {
        archive = new ZipArchive(stream, ZipArchiveMode.Create);
    }
    public void Dispose()
    {
        archive.Dispose();
    }

    public void Add(string fileName, byte[] content, bool enableCompression)
    {
        var entryName = PickName(fileName);
        var compressionLevel = enableCompression ? CompressionLevel.Fastest : CompressionLevel.NoCompression;
        var entry = archive.CreateEntry(entryName, compressionLevel);
        using var stream = entry.Open();
        stream.Write(content, 0, content.Length);
    }
    
    private string PickName(string fileName)
    {
        if (!entries.Contains(fileName))
        {
            entries.Add(fileName);
            return fileName;
        }
        var baseName = Path.GetFileNameWithoutExtension(fileName);
        var ext = Path.GetExtension(fileName);
        for (var idx = 2; ; idx++)
        {
            var newName = baseName + "_" + idx;
            if (!string.IsNullOrEmpty(ext))
                newName += ext;
            if (entries.Contains(newName))
                continue;
            entries.Add(newName);
            return newName;
        }
    }
}

//Vytvořte třídu zpracování extrakce aktiv
class Extractor
{
    private Zip zip;
    private bool texture;
    HashSet<A3DObject> visited = new HashSet<A3DObject>();
    public Extractor(Zip zip,bool texture)
    {
        this.zip = zip;
        this.texture = texture;
    }

    private bool CanVisit(A3DObject obj)
    {
        if (visited.Contains(obj))
            return false;
        visited.Add(obj);
        return true;
    }
    public void Extract(Scene scene)
    {
        if (scene.Library != null && scene.Library.Count > 0)
        {
            foreach (var obj in scene.Library)
            {
                Visit(obj);
            }
        }
        VisitNode(scene.RootNode);
    }
    private void VisitNode(Node node)
    {
        if (!CanVisit(node))
            return;
        if (texture)
        {
            foreach (var mat in node.Materials)
            {
                VisitMaterial(mat);
            }
        }

        foreach (var entity in node.Entities)
        {
            if (entity is Mesh)
                Save((Mesh)entity, node.Name);
        }
        
        foreach (var child in node.ChildNodes)
        {
            VisitNode(child);
        }
    }
    private void VisitMaterial(Material mat)
    {
        if (!CanVisit(mat))
            return;
        if (!texture)
            return;
        foreach (var tslot in mat)
        {
            if (tslot.Texture is Texture)
            {
                Save((Texture)tslot.Texture);
            }
        }
    }
    private void Visit(A3DObject obj)
    {
        if (texture && obj is Texture)
        {
            Save((Texture)obj);
        }
        else if (obj is Mesh)
        {
            Save((Mesh)obj, null);
        }
        else if (obj is Node)
        {
            VisitNode((Node)obj);
        }
    }
    private void Save(Mesh mesh, string? nodeName)
    {
        if (!CanVisit(mesh))
            return;
        Scene scene = new Scene(mesh);
        using (var ms = new MemoryStream())
        {
            scene.Save(ms, FileFormat.FBX7400ASCII);
            var name = nodeName;
            if (string.IsNullOrEmpty(name))
                name = mesh.Name;
            if (string.IsNullOrEmpty(name))
                name = "mesh";
            var ext = ".fbx";
            zip.Add(name + ext, ms.ToArray(), true);
        }
    }
    private void Save(Texture tex)
    {
        if (tex.Content == null || !CanVisit(tex))
            return;
        var fileName = tex.FileName != null ? Path.GetFileName(tex.FileName) : null;
        zip.Add(fileName, tex.Content, false);
    }
}
 
  • Aspose.3D for .NET API

    Aspose.3D je CAD a herní software API k načítání, úpravě a převodu souborů 3D. API je samostatný a nevyžaduje žádný 3D modelovací nebo vykreslovací software. Lze snadno použít API pro Discreet3DS, WavefrontOBJ, STL (ASCII, binární), Universal3D, FBX (ASCII, binární), Collada, glTF, PLY, GLB, DirectX a další formáty.

    Bezplatná aplikace pro extrahování aktiv z USD

    Podívejte se na naše živé ukázky Extraktor USD s následujícími výhodami.

      Není potřeba nic stahovat ani nastavovat
      Není třeba psát nebo kompilovat kód
      Stačí nahrát soubor USD a stisknout tlačítko "Extrahovat".
      V případě potřeby stáhněte soubor USD z odkazu

    USD Co je formát USD

    Soubor s příponou .usd je formát souboru Universal Scene Description, který kóduje data za účelem výměny a rozšiřování dat mezi aplikacemi pro vytváření digitálního obsahu.

    Více

    Další podporovaná aplikace pro extrahování aktiv z formátů

    Pomocí C# lze také extrahovat prostředky z mnoha dalších formátů souborů včetně.

    3MF (3D Výrobní formát)
    AMF (Formát aditivní výroby)
    ASE (Soubor 2D animace)
    DAE (Výměna digitálních aktiv)
    DXF (Formát výměny výkresů)
    DRC (Google Draco)
    FBX (Formát 3D)
    GLB (3D Binární reprezentace souboru)
    GLTF (Přenosový formát GL)
    JT (Soubor Jupiter Tessellation)
    OBJ (3D Formát souboru)
    PLY (Formát souboru polygonu)
    PDF (3D PDF)
    RVM (Model rostlinného designu AVEVA)
    STL (Vyměnitelná 3D povrchová geometrie)
    U3D (Universal 3D)
    VRML (Jazyk pro modelování virtuální reality)
    X (Obrázek modelu DirectX)
    3DS (3D Formát souboru Mesh aplikace Studio)
    USDZ (Univerzální popis scény Zip archiv)