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
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
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.
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íceDalší 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ě.