Анімована модель у форматі GLB або GLTF зберігає геометрію та дані анімації, а не папку готових зображень. Щоб створити мініатюри або послідовність кадрів, потрібно оцінити анімацію моделі у певні моменти часу та відрендерити кожну отриману сцену у зображення. У цьому підручнику пояснюється, як візуалізувати кадри анімації GLB у Python за допомогою Aspose.3D for Python via .NET. Ви завантажите анімовану модель, виберете кліп, виберете зразки її таймлайну та збереже кожен кадр як пронумероване PNG‑зображення. Отримані зображення можна використовувати як попередній перегляд моделі або як вхідні дані для окремого робочого процесу з послідовністю зображень.

Встановити Aspose.3D for Python via .NET

Встановіть пакет за допомогою pip:

pip install aspose-3d

Вам також знадобиться:

  • Анімований файл .glb або файл .gltf з відповідними буферами та текстурами.
  • Середовище рендерингу, сумісне з апаратними вимогами Aspose.3D. Дивіться вимоги до системи.
  • Позиція камери, яка зберігає анімований об’єкт у полі зору протягом вибіркового таймлайну.

Відтворити анімаційний кліп у вигляді PNG‑кадрів

Збережіть наступний код як render_glb_animation_frames.py і запустіть його з папки, що містить animated_model.glb.

import hashlib
import math
from pathlib import Path

import aspose.threed as a3d
from aspose.pydrawing import Color, Size
from aspose.pydrawing.imaging import ImageFormat
from aspose.threed.entities import Camera
from aspose.threed.utilities import Vector3

INPUT_FILE = Path("animated_model.glb")
OUTPUT_DIR = Path("frames")
FRAMES_PER_SECOND = 5
IMAGE_WIDTH = 800
IMAGE_HEIGHT = 600

def main():
    if not INPUT_FILE.is_file():
        raise FileNotFoundError(f"Input model not found: {INPUT_FILE}")

scene = a3d.Scene.from_file(str(INPUT_FILE))
    clips = list(scene.animation_clips)
    if not clips:
        raise RuntimeError("The input model has no animation clips.")

clip = clips[0]
    duration = float(clip.stop - clip.start)
    if duration <= 0:
        raise ValueError("The selected animation has no positive time range.")

# Use the same camera position for every frame.
    camera = Camera()
    camera_node = scene.root_node.create_child_node("PreviewCamera", camera)
    camera_node.transform.translation = Vector3(3, 2, 6)
    camera.look_at = Vector3.ORIGIN

options = a3d.ImageRenderOptions()
    options.background_color = Color.white
    options.asset_directories.append(str(INPUT_FILE.resolve().parent))

OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
    frame_count = max(1, math.ceil(duration * FRAMES_PER_SECOND))
    hashes = set()

for frame_index in range(frame_count):
        timestamp = float(clip.start) + frame_index / FRAMES_PER_SECOND
        clip.apply_to(timestamp)

frame_path = OUTPUT_DIR / f"frame_{frame_index:04d}.png"
        scene.render(
            camera,
            str(frame_path),
            Size(IMAGE_WIDTH, IMAGE_HEIGHT),
            ImageFormat.png,
            options,
        )

if not frame_path.is_file() or frame_path.stat().st_size == 0:
            raise RuntimeError(f"Rendering did not create a usable PNG: {frame_path}")

hashes.add(hashlib.sha256(frame_path.read_bytes()).digest())
        print(f"Frame {frame_index + 1}/{frame_count}: {frame_path} at {timestamp:.3f}s")

if frame_count > 1 and len(hashes) == 1:
        print("WARNING: All PNG files are byte-identical. Check animation state and camera view.")

print(f"Created {frame_count} PNG file(s) in {OUTPUT_DIR}/")

if __name__ == "__main__":
    main()

Запустіть його за допомогою:

python render_glb_animation_frames.py

Очікуваний результат: каталог frames, що містить зображення, такі як frame_0000.png, frame_0001.png та frame_0002.png. Коли рендерер правильно захоплює застосовані стани анімації, зображення показують модель у послідовних точках її анімації.

Як працює код рендерингу кадрів

Завантажте сцену та виберіть анімаційний кліп

Метод Scene.from_file() відкриває модель, тоді як scene.animation_clips надає доступ до анімаційних кліпів, які вона містить. У прикладі використовується перший кліп і читаються його властивості start та stop, щоб визначити діапазон часу. Модель без анімаційних кліпів не може створити анімовану послідовність за допомогою цього методу.

Для отримання докладнішої інформації про вибір кліпів та трансформації вузлів, перегляньте Load and Evaluate GLB/GLTF Animations in Python.

Візьміть зразок часової шкали з регулярними інтервалами

Скрипт використовує п’ять зразків за секунду. Якщо кліп триває два секунди, він запитує десять кадрів з мітками часу від 0.0 до 1.8 секунди, коли кліп починається з нуля. Виключення точного кінцевого пункту запобігає створенню зайвого останнього кадру для анімацій, які повертаються до початкової позиції.

Метод clip.apply_to(timestamp) застосовує вибраний анімаційний кліп до кожної мітки часу. На відміну від оцінювання послідовності окремих ключових кадрів, цей крок призначений для оновлення анімованої сцени перед рендерингом зображення.

Відобразити оновлену сцену з однієї камери

Приклад додає камеру у фіксовану позицію та викликає scene.render() для кожного кадру. Він також встановлює розмір зображення 800 × 600 пікселів і формат виводу PNG. Фіксована камера полегшує інспекцію різниць між кадрами.

Посібник Aspose.3D scene-rendering guide показує, як зберегти 3D‑вид у вигляді зображення. Для анімаційних послідовностей переконайтеся, що кожне зображення відповідає потрібному часовому штампу. Якщо послідовні кадри показують одну й ту ж позу, перевірте, чи шлях рендерингу використовує поточний анімований стан.

Назвіть кожен PNG-кадр послідовно

frame_0000.png шаблон зберігає порядок зображень при сортуванні за іменем файлу. Він підходить для створення мініатюр попереднього перегляду або передачі вихідних даних у окремий робочий процес з послідовністю зображень або відео. Скрипт не створює відео або анімованого GIF.

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

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

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

Безкоштовні навчальні ресурси

Ознайомтеся з наступними ресурсами, щоб дізнатися більше про завантаження анімованих 3D‑моделей, роботу з анімаційними кліпами та рендеринг 3D‑сцен за допомогою Aspose.3D for Python via .NET:

  • Aspose.3D for Python Developer Guide – Дізнайтеся, як завантажувати, змінювати, анімувати та візуалізувати 3D‑моделі в Python.
  • Render 3D Scenes to Images – Дізнайтеся, як налаштувати камеру та візуалізувати 3D‑сцени у вигляді файлів зображень.
  • Aspose.3D Python API Reference – Ознайомтеся з класами та методами для анімаційних кліпів, візуалізації сцен, камер та обробки 3D‑файлів.
  • Free Online 3D Applications – Переглядайте, конвертуйте та обробляйте підтримувані 3D‑моделі безпосередньо у вашому браузері.
  • Aspose.3D Tutorials and Articles – Знайдіть практичні Python‑підручники, що охоплюють анімації GLB/GLTF, оцінку ключових кадрів та інші завдання обробки 3D.

Висновок

Ви можете генерувати зображення кадрів, вибираючи моменти часу на шкалі анімації та рендерячи сцену в кожному вибраному таймстемпі. Використовуйте пронумеровані PNG, щоб створювати мініатюри, порівнювати пози або підготувати послідовність зображень для іншого інструменту. Якщо вам потрібні числові значення анімації замість зображень, перегляньте keyframe evaluation tutorial. Для проблем з рендерингом відвідайте Aspose.3D support forum.