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

Завантаження та оцінка анімацій GLB у Python

Анімаційний кліп містить дані анімації, пов’язані зі сценою. Час початку та закінчення визначають період, який можна оцінювати. Робочий процес полягає у завантаженні моделі, виборі анімаційного кліпу, застосуванні його у певні моменти часу, перевірці вузлів сцени та експорті їх трансформацій.

Встановити Aspose.3D for Python via .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 містить один рядок на кожен вузол сцени для кожної вибіркової мітки часу та такі стовпці:

СтовпецьОпис
ЧасМітка часу оцінки в секундах
Індекс вузлаІндекс вузла у рекурсивному обході
Назва вузлаНазва вузла сцени
ПереміщенняЛокальна позиція у зазначений момент часу
ОбертанняЛокальне обертання у зазначений момент часу
МасштабуванняЛокальний масштаб у зазначений момент часу

Ви можете відкрити CSV у програмі для роботи з електронними таблицями або проаналізувати його за допомогою Python, щоб порівняти трансформації протягом кліпу.

Що слід перевірити при оцінці анімацій

Кілька кліпів. У цьому прикладі оцінюється clips[0]. Щоб оцінити іншу анімацію, виберіть інший індекс або отримайте кліп за назвою, використовуючи scene.get_animation_clip(name).

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

Скелети та морф‑цілі. Не всі анімаційні ефекти проявляються як зміни локального переміщення, обертання або масштабування вузла. Цей CSV‑робочий процес не захоплює всі типи скелетної або морф‑цільової деформації.

Залежності GLTF. Текстові файли .gltf можуть посилатися на зовнішні буфери та текстури. Тримайте ці файли у їх очікуваних відносних шляхах.

Чи потребує оцінка анімацій GLB графічного процесора?

Цей приклад не викликає Scene.render() або бекенд рендерингу Vulkan. Він оцінює властивості анімації та записує дані CSV замість створення зображень. Рендеринг Aspose.3D має окремі вимоги до апаратного забезпечення, які не застосовуються до CSV‑only робочого процесу цього прикладу.

Отримати безкоштовну тимчасову ліцензію

Ви можете запросити безкоштовну 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(). Читаючи трансформації вузлів після кожної оцінки, ви можете проаналізувати рух і експортувати структуровані дані анімації без рендерингу моделі. Пристосуйте приклад, щоб оцінювати додаткові кліпи, збільшити частоту дискретизації або проаналізувати вибрані вузли.

Читати далі