نموذج متحرك بصيغة 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 لتحديد نطاق الوقت. لا يمكن للنموذج الذي لا يحتوي على مقاطع رسوم متحركة أن يولد تسلسلًا متحركًا بهذه الطريقة.

لمزيد من التفاصيل حول اختيار المقاطع وتحويلات العقد، راجع تحميل وتقييم تحريكات GLB/GLTF في بايثون.

خذ عينة من المخطط الزمني على فترات منتظمة

يستخدم البرنامج النصي خمس عينات في الثانية. إذا استمر المقطع لمدة ثانيتين، فإنه يطلب عشرة إطارات عند طوابع زمنية من 0.0 إلى 1.8 ثانية عندما يبدأ المقطع من الصفر. استبعاد النقطة النهائية الدقيقة يمنع إنشاء إطار نهائي مكرر للرسوم المتحركة التي تعود إلى الوضعية الابتدائية.

طريقة clip.apply_to(timestamp) تطبق مقطع الرسوم المتحركة المحدد عند كل طابع زمني. على عكس تقييم تسلسل إطار مفتاح واحد، فإن هذه الخطوة تهدف إلى تحديث المشهد المتحرك قبل أن يتم تصيير الصورة.

عرض المشهد المحدث من كاميرا واحدة

المثال يضيف كاميرا في موضع ثابت ويستدعي scene.render() لكل إطار. كما يحدد حجم الصورة 800 × 600 بكسل وتنسيق إخراج PNG. الحفاظ على تثبيت الكاميرا يجعل من السهل فحص الاختلافات بين الإطارات.

دليل Aspose.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 في بايثون.
  • Render 3D Scenes to Images – تعلم كيفية تكوين كاميرا وعرض مشاهد 3D كملفات صور.
  • Aspose.3D Python API Reference – استكشف الفئات والطرق الخاصة بمقاطع الرسوم المتحركة، وعرض المشاهد، والكاميرات، ومعالجة ملفات 3D.
  • Free Online 3D Applications – عرض وتحويل ومعالجة نماذج 3D المدعومة مباشرةً في المتصفح الخاص بك.
  • Aspose.3D Tutorials and Articles – ابحث عن دروس بايثون عملية تغطي تحريكات GLB/GLTF، وتقييم الإطارات الرئيسية، ومهام معالجة 3D الأخرى.

الخلاصة

يمكنك إنشاء صور الإطارات عن طريق أخذ عينات من جدول زمني للرسوم المتحركة وعرض المشهد عند كل طابع زمني مختار. استخدم ملفات PNG المرقمة لإنشاء صور مصغرة، أو مقارنة الوضعيات، أو إعداد تسلسل صور لأداة أخرى. إذا كنت تحتاج إلى قيم عددية للرسوم المتحركة بدلاً من الصور، راجع دليل تقييم الإطارات المفتاحية. لمشكلات العرض، زر منتدى دعم Aspose.3D.