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

Извлечь активы из 3DS через C#

Создавайте собственные приложения .NET для извлечения ресурсов из файлов 3DS с помощью серверных API.

Как извлечь активы из файла 3DS с помощью C#

Чтобы извлечь активы из файла 3DS, мы будем использовать

Aspose.3D for .NET

API — многофункциональная, мощная и простая в использовании платформа API для C#, предназначенная для извлечения активов. Открыть

NuGet

менеджер пакетов, поиск Aspose.3D и установить. Вы также можете использовать следующую команду из консоли диспетчера пакетов.

Команда консоли диспетчера пакетов


PM> Install-Package Aspose.3D

Действия по извлечению активов из 3DS через C#

Aspose.3D позволяет разработчикам легко извлекать активы из файла 3DS, написав всего несколько строк кода.

  • Загрузите файл 3DS через конструктор класса Scene- Создайте объект формата zip-файла в качестве формата выходного файла- Создайте класс архива и обработайте класс активов извлечения- Вызовите метод Extract и сохраните файл

Системные Требования

Aspose.3D for .NET поддерживается во всех основных операционных системах. Просто убедитесь, что у вас есть следующие предпосылки.

  • Microsoft Windows или совместимая ОС с .NET Framework, .NET Core, Mono- Среда разработки, такая как Microsoft Visual Studio- Aspose.3D for .NET упоминается в вашем проекте
 

C# код для извлечения ресурсов из 3DS


//Исходные файлы, которые необходимо извлечь активы
string file = "template.3ds";
Scene scene = new Scene(file);  

//Выходные данные представлены в формате сжатого файла, а каталог представляет собой имя существующей папки.
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);

//Вызываемый метод извлечения, параметр текстуры указывает: следует ли извлекать текстуру
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 – это CAD и Gameware API для загрузки, изменения и преобразования файлов 3D. API является автономным и не требует никакого 3D программного обеспечения для моделирования или визуализации. Можно легко использовать API для Discreet3DS, WavefrontOBJ, STL (ASCII, двоичный), Universal3D, FBX (ASCII, двоичный), Collada, glTF, PLY, GLB, DirectX и другие форматы.

    Бесплатное приложение для извлечения активов из 3DS

    Проверьте наши живые демонстрации, чтобы Экстрактор 3DS со следующими преимуществами.

      Не нужно ничего скачивать или настраивать
      Нет необходимости писать или компилировать код
      Просто загрузите файл 3DS и нажмите кнопку "Извлечь".
      Загрузите файл 3DS по ссылке, если требуется

    3DS Формат файла 3DS

    Файл с расширением 3DS представляет формат файла сетки 3D Studio (DOS), используемый Autodesk 3D Studio. Autodesk 3D Studio существует на рынке файловых форматов 3D с 1990-х годов и теперь превратилась в 3D Studio MAX для работы с 3D моделированием, анимацией и визуализацией. Файл 3DS содержит данные для 3D представления сцен и изображений и является одним из популярных форматов файлов для импорта и экспорта данных 3D. Он учитывает такую информацию, как расположение камер, данные сетки, информацию об освещении, конфигурации области просмотра, данные группы сглаживания, ссылки на растровые изображения и атрибуты для создания вершин и полигонов для рендеринга сцены.

    Подробнее

    Другое поддерживаемое приложение для извлечения ресурсов из форматов

    Используя C#, можно также извлекать активы из файлов многих других форматов, в том числе.

    3MF (3D Производственный формат)
    AMF (Формат аддитивного производства)
    ASE (Файл 2D-анимации)
    DAE (Биржа цифровых активов)
    DXF (Формат обмена чертежами)
    DRC (Google Draco)
    FBX (3D Формат)
    GLB (3D Двоичное представление файла)
    GLTF (Формат передачи GL)
    JT (Файл тесселяции Юпитера)
    OBJ (3D Формат файла)
    PLY (Формат файла многоугольника)
    PDF (3D PDF)
    RVM (Модель проектирования завода AVEVA)
    STL (Взаимозаменяемая геометрия поверхности 3D)
    U3D (Universal 3D)
    VRML (Язык моделирования виртуальной реальности)
    Икс (Изображение модели DirectX)
    USD (Описание универсальной сцены)
    USDZ (Универсальное описание сцены Zip-архив)