מודל מונפש 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:
- Aspose.3D למדריך מפתחים ב-Python – למד כיצד לטעון, לשנות, להנפיש ולרנדר מודלים תלת‑ממדיים ב‑Python.
- המרת סצנות 3D לתמונות – למד כיצד להגדיר מצלמה ולרנדר סצנות תלת‑ממדיות כקבצי תמונה.
- Aspose.3D הפניות API של Python – חקור מחלקות ושיטות עבור קטעי אנימציה, רינדור סצנות, מצלמות ועיבוד קבצי 3D.
- יישומים חינמיים של 3D באינטרנט – הצג, המר ועבד מודלים תלת‑ממדיים נתמכים ישירות בדפדפן שלך.
- Aspose.3D מדריכים ומאמרים – מצא מדריכים מעשיים ב‑Python המכסים אנימציות GLB/GLTF, הערכת keyframe ומשימות עיבוד 3D אחרות.
סיכום
אתה יכול ליצור תמונות פריימים על‑ידי דגימת קו זמן של אנימציה והצגת הסצנה בכל חותמת זמן שנבחרה. השתמש בקבצי PNG ממוספרים כדי לבנות תמונות ממוזערות, להשוות תנוחות, או להכין רצף תמונות לכלי אחר. אם אתה צריך ערכי אנימציה מספריים במקום תמונות, ראה את מדריך להערכת keyframe. עבור בעיות רינדור, בקר בAspose.3D support forum.
