מודל מונפש GLB או GLTF מאחסן גאומטריה ונתוני אנימציה במקום תיקייה של תמונות מוכנות מראש. כדי ליצור תמונות ממוזערות או רצף מסגרות, עליך להעריך את האנימציה של המודל ברגעי זמן ספציפיים ולרנדר כל סצנה נוצרה לתמונה. מדריך זה מסביר כיצד לרנדר מסגרות אנימציית GLB בפייתון באמצעות 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.

משאבי למידה חינמיים

חקור את המשאבים הבאים כדי ללמוד יותר על טעינת מודלים תלת‑ממדיים מונפשים, עבודה עם קטעי אנימציה והצגת סצנות תלת‑ממדיות באמצעות Aspose.3D for Python via .NET:

סיכום

אתה יכול ליצור תמונות פריימים על‑ידי דגימת קו זמן של אנימציה והצגת הסצנה בכל חותמת זמן שנבחרה. השתמש בקבצי PNG ממוספרים כדי לבנות תמונות ממוזערות, להשוות תנוחות, או להכין רצף תמונות לכלי אחר. אם אתה צריך ערכי אנימציה מספריים במקום תמונות, ראה את מדריך להערכת keyframe. עבור בעיות רינדור, בקר בAspose.3D support forum.