یک مدل انیمیشنی 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 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 مراجعه کنید.