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

通过 C# 从 OBJ 提取资产

构建您自己的 .NET 应用以使用服务器端 API 从 OBJ 文件中提取资产。

如何使用 C# 从 OBJ 文件中提取资产

为了从 OBJ 文件中提取资产,我们将使用

Aspose.3D for .NET

API 是一个功能丰富、功能强大且易于使用的 API for C# 平台,可与提取资产一起使用。打开

NuGet

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

包管理器控制台命令


PM> Install-Package Aspose.3D

通过 C# 从 OBJ 提取资产的步骤

Aspose.3D 使开发人员只需几行代码即可轻松地从 OBJ 文件中提取资产。

  • 通过 Scene 类的构造函数加载 OBJ 文件- 创建 zip 文件格式对象作为输出文件格式- 创建归档类并处理提取资产类- 调用 Extract 方法并保存文件

系统要求

Aspose.3D for .NET 在所有主要操作系统上都受支持。只需确保您具有以下先决条件。

  • Microsoft Windows 或具有 .NET Framework、.NET Core、Mono 的兼容操作系统- Microsoft Visual Studio 等开发环境- Aspose.3D for .NET 在您的项目中引用
 

C# 代码从 OBJ 中提取资产


//需要提取资产的源文件
string file = "template.obj";
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 和更多格式。

    从 OBJ 中提取资产的免费应用程序

    查看我们的现场演示 提取器 OBJ 具有以下好处。

      无需下载或设置任何东西
      无需编写或编译代码
      只需上传 OBJ 文件并点击“提取”按钮
      如果需要,从链接下载 OBJ 文件

    OBJ 什么是OBJ文件格式

    Wavefront 的 Advanced Visualizer 应用程序使用 OBJ 文件来定义和存储几何对象。通过 OBJ 文件可以实现几何数据的前后传输。 OBJ 格式支持点、线、纹理顶点、面和自由形式几何(曲线和曲面)等多边形几何。此格式不支持动画或与场景的灯光和位置相关的信息。

    阅读更多

    其他支持从格式中提取资产的应用程序

    使用 C#,One 还可以从许多其他文件格式中提取资产,包括。

    3MF (3D 制造格式)
    AMF (增材制造形式)
    ASE (二维动画文件)
    DAE (数字资产交易所)
    DXF (绘图交换格式)
    DRC (Google Draco)
    FBX (3D 格式)
    GLB (3D 文件二进制表示)
    GLTF (GL 传输格式)
    JT (木星镶嵌文件)
    3DS (3D Studio 网格文件格式)
    PLY (多边形文件格式)
    PDF (3D PDF)
    RVM (AVEVA 工厂设计模型)
    STL (可互换的 3D 表面几何形状)
    U3D (Universal 3D)
    VRML (虚拟现实建模语言)
    X (DirectX 模型图像)
    USD (通用场景描述)
    USDZ (通用场景描述 Zip 存档)