Оценка анимаций в файле GLB или GLTF позволяет вам просматривать, как 3D‑объекты перемещаются, вращаются и масштабируются во времени без рендеринга сцены. Вы можете использовать этот подход для анализа данных анимации, проверки движений или экспорта трансформаций для дальнейшей обработки. В этом руководстве вы загрузите анимированную модель GLB, изучите её клипы, оцените пять временных меток и экспортируете трансформации узлов в CSV.

Загрузка и оценка анимаций GLB в Python

Клип анимации содержит данные анимации, связанные со сценой. Его время начала и окончания определяют период, который можно оценивать. Рабочий процесс состоит в загрузке модели, выборе клипа анимации, применении его в определённые моменты времени, проверке узлов сцены и экспорте их трансформаций.

Установить Aspose.3D для Python через .NET

Установите Aspose.3D for Python via .NET, который предоставляет API оценки анимации, используемый здесь:

pip install aspose-3d==26.10.0

См. документацию по установке для получения более подробной информации.

Оценка анимации и экспорт преобразований узлов

Следующий пример кода оценивает первый анимационный клип в пяти равномерно распределённых временных метках и сохраняет локальный перевод, вращение и масштабирование каждого узла в animation_transforms.csv.

import csv
import aspose.threed as a3d

INPUT_FILE = "animated_model.glb"
OUTPUT_FILE = "animation_transforms.csv"
FRAME_COUNT = 5

def get_nodes(root):
    """Recursively collect all nodes in the scene."""
    nodes = [root]

for child in root.child_nodes:
        nodes.extend(get_nodes(child))

return nodes

# Load the animated model
scene = a3d.Scene.from_file(INPUT_FILE)

# Retrieve animation clips
clips = list(scene.animation_clips)

if not clips:
    raise RuntimeError("No animation clips found.")

print(f"Found {len(clips)} animation clip(s).")

for i, item in enumerate(clips):
    print(
        f"{i}: {item.name} "
        f"({item.start:.3f} to {item.stop:.3f} seconds)"
    )

# Select the first clip and collect scene nodes
clip = clips[0]
nodes = get_nodes(scene.root_node)

print(f"\nEvaluating: {clip.name}")
print(f"Scene nodes: {len(nodes)}")

records = []

for i in range(FRAME_COUNT):
    time = float(
        clip.start +
        (clip.stop - clip.start) * i / (FRAME_COUNT - 1)
    )

# Apply animation at the requested time
    clip.apply_to(time)

print(f"\nTimestamp: {time:.3f}s")

for index, node in enumerate(nodes):
        transform = node.transform

translation = str(transform.translation)
        rotation = str(transform.rotation)
        scaling = str(transform.scaling)

records.append([
            time,
            index,
            node.name or "(unnamed)",
            translation,
            rotation,
            scaling
        ])

print(
            f"  {node.name or '(unnamed)'}: "
            f"position={translation}, "
            f"rotation={rotation}"
        )

# Write evaluated transformations to CSV
with open(
    OUTPUT_FILE, "w", newline="", encoding="utf-8"
) as file:
    writer = csv.writer(file)

writer.writerow([
        "Time",
        "Node Index",
        "Node Name",
        "Translation",
        "Rotation",
        "Scaling"
    ])

writer.writerows(records)

print(f"\nSaved animation data to {OUTPUT_FILE}")

Как работает оценка анимации

Загрузите сцену GLB и получите её клипы

Scene.from_file() загружает модель GLB или GLTF. Коллекция scene.animation_clips предоставляет доступные клипы:

scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)

Каждый клип предоставляет имя и диапазон времени в секундах через name, start и stop. См. Справочник API AnimationClip.

Применить анимацию в определённые временные метки

Основная операция — clip.apply_to(time). Для образца клипа, длительность которого примерно 3.708 секунды, пять меток времени таковы:

ОбразецВремя (секунды)
10.000
20.927
31.854
42.781
53.708

Вы можете изменить FRAME_COUNT, чтобы собрать больше образцов. Эти образцы представляют собой оценённые состояния анимации, а не отрендеренные кадры изображения.

Чтение трансляции, вращения и масштабирования

После применения клипа скрипт проходит по всем узлам сцены и читает:

  • transform.translation: локальная позиция узла.
  • transform.rotation: локальное вращение узла.
  • transform.scaling: локальный масштаб узла.

Это локальные преобразования, не обязательно координаты в мировом пространстве. Преобразования родительского узла также влияют на окончательное положение узла в сцене. Узлы без анимации могут сохранять одинаковые значения на каждом временном штампе.

CSV‑вывод из анимации

Скрипт создает animation_transforms.csv. Для предоставленного примера консоль начинается с:

Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)

Evaluating: Animation_1

CSV содержит одну строку для каждого узла сцены на каждом отснятом временном штампе и следующие столбцы:

ColumnDescription
TimeВременная метка оценки в секундах
Node IndexИндекс узла в рекурсивном обходе
Node NameИмя узла сцены
TranslationЛокальная позиция в момент времени
RotationЛокальное вращение в момент времени
ScalingЛокальный масштаб в момент времени

Вы можете открыть CSV в приложении для работы с электронными таблицами или проанализировать его с помощью Python, чтобы сравнить преобразования в клипе.

Что проверять при оценке анимаций

Несколько клипов. В этом примере оценивается clips[0]. Чтобы оценить другую анимацию, выберите другой индекс или получите клип по имени, используя scene.get_animation_clip(name).

Разрешение выборки. Пять меток времени дают базовый обзор, но могут пропустить быстрое движение. Увеличьте FRAME_COUNT или выберите конкретные моменты для более детального изучения.

Скелеты и морф-таргеты. Не все анимационные эффекты проявляются как изменения локального перемещения, вращения или масштабирования узла. Этот CSV‑рабочий процесс не захватывает каждый тип деформации скелетных или морф-таргетных изменений.

Зависимости GLTF. Текстовые файлы .gltf могут ссылаться на внешние буферы и текстуры. Сохраняйте эти файлы в их ожидаемых относительных путях.

Требуется ли GPU для оценки анимаций GLB?

Этот пример не вызывает Scene.render() или бэкенд рендеринга Vulkan. Он оценивает свойства анимации и записывает данные в CSV вместо создания изображений. Рендеринг Aspose.3D имеет отдельные требования к оборудованию, которые не применяются к рабочему процессу, использующему только CSV.

Получить бесплатную временную лицензию

Вы можете запросить бесплатную 30‑дневную временную лицензию для оценки Aspose.3D for Python via .NET без ограничений оценки. Чтобы применить лицензию в вашем Python‑приложении, следуйте руководству по лицензированию Aspose.3D.

Бесплатные учебные ресурсы

Изучите следующие ресурсы, чтобы узнать больше о работе с 3D‑моделями, анимациями и поддерживаемыми форматами файлов с использованием Aspose.3D for Python via .NET:

  • Aspose.3D for Python Developer Guide – Узнайте, как создавать, загружать, изменять и обрабатывать 3D‑файлы.
  • Free Online 3D Applications – Просматривайте, конвертируйте и обрабатывайте 3D‑модели прямо в браузере.
  • Aspose.3D Python API Reference – Изучайте доступные классы, методы и свойства.
  • Aspose.3D Tutorials and Articles – Найдите практические примеры и руководства по работе с 3D‑форматами файлов.

Заключение

Aspose.3D for Python via .NET 26.10 позволяет оценивать анимационные клипы GLB и GLTF в выбранные моменты времени с помощью AnimationClip.apply_to(). Считывая трансформации узлов после каждой оценки, вы можете просматривать движение и экспортировать структурированные данные анимации без рендеринга модели. Адаптируйте пример для оценки дополнительных клипов, увеличения частоты дискретизации или анализа выбранных узлов.

Читать далее