Оценка анимаций в файле 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 секунды, пять меток времени таковы:
| Образец | Время (секунды) |
|---|---|
| 1 | 0.000 |
| 2 | 0.927 |
| 3 | 1.854 |
| 4 | 2.781 |
| 5 | 3.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 содержит одну строку для каждого узла сцены на каждом отснятом временном штампе и следующие столбцы:
| Column | Description |
|---|---|
| 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(). Считывая трансформации узлов после каждой оценки, вы можете просматривать движение и экспортировать структурированные данные анимации без рендеринга модели. Адаптируйте пример для оценки дополнительных клипов, увеличения частоты дискретизации или анализа выбранных узлов.
