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

Extrahovat aktiva z U3D prostřednictvím C#

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

Jak extrahovat aktiva ze souboru U3D pomocí C#

K extrahování aktiv ze souboru U3D 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 U3D prostřednictvím C#

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

  • Načtěte soubor U3D 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 U3D


//Zdrojové soubory, které potřebují extrahovat aktiva
string file = "template.u3d";
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 U3D

    Podívejte se na naše živé ukázky Extraktor U3D 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 U3D a stisknout tlačítko "Extrahovat".
      V případě potřeby stáhněte soubor U3D z odkazu

    U3D Co je formát U3D

    U3D (Universal 3D) je komprimovaný formát souboru a datová struktura pro počítačovou grafiku 3D. Obsahuje 3D informací o modelu, jako jsou trojúhelníkové sítě, osvětlení, stínování, pohybová data, čáry a body s barvou a strukturou. Formát byl přijat jako standard ECMA-363 v srpnu 2005. Dokumenty 3D PDF podporují vkládání objektů U3D a lze je zobrazit v aplikaci Adobe Reader (verze 7 a novější).

    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)
    3DS (3D Formát souboru Mesh aplikace Studio)
    VRML (Jazyk pro modelování virtuální reality)
    X (Obrázek modelu DirectX)
    USD (Univerzální popis scény)
    USDZ (Univerzální popis scény Zip archiv)