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

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

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

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

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

Aspose.3D for .NET

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

NuGet

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

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


PM> Install-Package Aspose.3D

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

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

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

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

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

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

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


//Исходные файлы, которые необходимо извлечь активы
string file = "template.u3d";
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 и другие форматы.

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

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

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

    U3D Формат файла U3D

    U3D (Universal 3D) – это сжатый формат файла и структура данных для 3D компьютерной графики. Он содержит 3D информацию о модели, такую как треугольные сетки, освещение, затенение, данные движения, линии и точки с цветом и структурой. Формат был принят в качестве стандарта ECMA-363 в августе 2005 г. Документы 3D PDF поддерживают встраивание объектов U3D и могут быть просмотрены в Adobe Reader (версия 7 и выше).

    Подробнее

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

    Используя 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)
    3DS (3D Формат файла Studio Mesh)
    VRML (Язык моделирования виртуальной реальности)
    Икс (Изображение модели DirectX)
    USD (Описание универсальной сцены)
    USDZ (Универсальное описание сцены Zip-архив)