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

通過 C# 從 GLB 提取資產

構建您自己的 .NET 應用以使用服務器端 API 從 GLB 文件中提取資產。

如何使用 C# 從 GLB 文件中提取資產

為了從 GLB 文件中提取資產,我們將使用

Aspose.3D for .NET

API 是一個功能豐富、功能強大且易於使用的 API for C# 平台,可與提取資產一起使用。打開

NuGet

包管理器,搜索 Aspose.3D 並安裝。您也可以從包管理器控制台使用以下命令。

包管理器控制台命令


PM> Install-Package Aspose.3D

通過 C# 從 GLB 提取資產的步驟

Aspose.3D 使開發人員只需幾行代碼即可輕鬆地從 GLB 文件中提取資產。

  • 通過 Scene 類的構造函數加載 GLB 文件- 創建 zip 文件格式對像作為輸出文件格式- 創建歸檔類並處理提取資產類- 調用 Extract 方法並保存文件

系統要求

Aspose.3D for .NET 在所有主要操作系統上都受支持。只需確保您具有以下先決條件。

  • Microsoft Windows 或具有 .NET Framework、.NET Core、Mono 的兼容操作系統- Microsoft Visual Studio 等開發環境- Aspose.3D for .NET 在您的項目中引用
 

C# 代碼從 GLB 中提取資產


//需要提取資產的源文件
string file = "template.glb";
Scene scene = new Scene(file);  

//輸出為壓縮文件格式,Directory 表示現有文件夾的名稱
var zipOutput = Path.Combine("Directory", "OutputFile.zip");
using var output = new FileStream(zipOutput, FileMode.Create);
using var za = new Zip(output);

//調用 Extract 方法執行資產提取操作
Extract(scene,za,true);

//可調用Extract方法,參數texture表示:是否提取紋理
private void Extract(Scene scene, Zip za,bool texture)
{
    var extractor = new Extractor(za,texture);
    extractor.Extract(scene);
}

//創建壓縮文件處理類
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;
        }
    }
}

//創建資產提取處理類
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 是用於加載、修改和轉換 3D 文件的 CAD 和遊戲軟件 API。 API 是獨立的,不需要任何 3D 建模或渲染軟件。可以輕鬆地將 API 用於 Discreet3DS、WavefrontOBJ、STL(ASCII,二進制)、Universal3D、FBX(ASCII,二進制)、Collada、glTF、PLY、 GLB、DirectX 和更多格式。

    從 GLB 中提取資產的免費應用程序

    查看我們的現場演示 提取器 GLB 具有以下好處。

      無需下載或設置任何東西
      無需編寫或編譯代碼
      只需上傳 GLB 文件並點擊“提取”按鈕
      如果需要,從鏈接下載 GLB 文件

    GLB 什麼是 GLB 文件格式

    GLB 是以 GL 傳輸格式 (glTF) 保存的 3D 模型的二進製文件格式表示。有關 3D 模型的信息,例如二進制格式的節點層次結構、相機、材質、動畫和網格。此二進制格式將 glTF 資產(JSON、.bin 和圖像)存儲在二進制 blob 中。它還避免了在 glTF 的情況下發生的文件大小增加的問題。 GLB 文件格式帶來緊湊的文件大小、快速加載、完整的 3D 場景表示以及進一步開發的可擴展性。該格式使用 model/gltf-binary 作為 MIME 類型。

    閱讀更多

    其他支持從格式中提取資產的應用程序

    使用 C#,One 還可以從許多其他文件格式中提取資產,包括。

    3MF (3D 製造格式)
    AMF (增材製造形式)
    ASE (二維動畫文件)
    DAE (數字資產交易所)
    DXF (繪圖交換格式)
    DRC (Google Draco)
    FBX (3D 格式)
    3DS (3D Studio 網格文件格式)
    GLTF (GL 傳輸格式)
    JT (木星鑲嵌文件)
    OBJ (3D 文件格式)
    PLY (多邊形文件格式)
    PDF (3D PDF)
    RVM (AVEVA 工廠設計模型)
    STL (可互換的 3D 表面幾何形狀)
    U3D (Universal 3D)
    VRML (虛擬現實建模語言)
    X (DirectX 模型圖像)
    USD (通用場景描述)
    USDZ (通用場景描述 Zip 存檔)