Анимированная модель 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. Фиксация камеры упрощает проверку различий между кадрами.
The Aspose.3D руководство по рендерингу сцены показывает, как сохранить 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 для создания миниатюр, сравнения поз или подготовки последовательности изображений для другого инструмента. Если вам нужны числовые значения анимации, а не изображения, см. учебник по оценке ключевых кадров. При проблемах с рендерингом посетите форум поддержки Aspose.3D.
