ارزیابی انیمیشن‌ها در یک فایل GLB یا GLTF به شما امکان می‌دهد نحوه حرکت، چرخش و مقیاس‌گذاری اشیاء سه‌بعدی را در طول زمان بدون رندر صحنه بررسی کنید. می‌توانید از این روش برای تجزیه و تحلیل داده‌های انیمیشن، تأیید حرکات یا استخراج تبدیلات برای پردازش‌های بعدی استفاده کنید. در این آموزش، یک مدل GLB انیمیشنی را بارگذاری می‌کنید، کلیپ‌های آن را بررسی می‌کنید، پنج بازه زمانی را ارزیابی می‌کنید و تبدیلات گره‌ها را به فرمت CSV صادر می‌کنید.

بارگذاری و ارزیابی انیمیشن‌های GLB در پایتون

یک کلیپ انیمیشن شامل داده‌های انیمیشن مرتبط با یک صحنه است. زمان‌های شروع و پایان آن دوره‌ای را که می‌توانید ارزیابی کنید تعریف می‌کند. جریان کار این است که یک مدل را بارگذاری کنید، یک کلیپ انیمیشن را انتخاب کنید، آن را در زمان‌های خاص اعمال کنید، گره‌های صحنه را بررسی کنید و تبدیلات آن‌ها را صادر کنید.

نصب Aspose.3D for Python via .NET

نصب کنید Aspose.3D for Python via .NET، که API ارزیابی انیمیشن را که در اینجا استفاده شده است، فراهم می‌کند:

pip install aspose-3d==26.10.0

برای جزئیات بیشتر، مستندات نصب را ببینید.

ارزیابی انیمیشن و صادر کردن تبدیلات گره

مثال کد زیر کلیپ انیمیشن اول را در پنج زمان‌بندی مساوی ارزیابی می‌کند و ترجمه، چرخش و مقیاس محلی هر گره را در animation_transforms.csv ذخیره می‌سازد.

import csv
import aspose.threed as a3d

INPUT_FILE = "animated_model.glb"
OUTPUT_FILE = "animation_transforms.csv"
FRAME_COUNT = 5

def get_nodes(root):
    """Recursively collect all nodes in the scene."""
    nodes = [root]

for child in root.child_nodes:
        nodes.extend(get_nodes(child))

return nodes

# Load the animated model
scene = a3d.Scene.from_file(INPUT_FILE)

# Retrieve animation clips
clips = list(scene.animation_clips)

if not clips:
    raise RuntimeError("No animation clips found.")

print(f"Found {len(clips)} animation clip(s).")

for i, item in enumerate(clips):
    print(
        f"{i}: {item.name} "
        f"({item.start:.3f} to {item.stop:.3f} seconds)"
    )

# Select the first clip and collect scene nodes
clip = clips[0]
nodes = get_nodes(scene.root_node)

print(f"\nEvaluating: {clip.name}")
print(f"Scene nodes: {len(nodes)}")

records = []

for i in range(FRAME_COUNT):
    time = float(
        clip.start +
        (clip.stop - clip.start) * i / (FRAME_COUNT - 1)
    )

# Apply animation at the requested time
    clip.apply_to(time)

print(f"\nTimestamp: {time:.3f}s")

for index, node in enumerate(nodes):
        transform = node.transform

translation = str(transform.translation)
        rotation = str(transform.rotation)
        scaling = str(transform.scaling)

records.append([
            time,
            index,
            node.name or "(unnamed)",
            translation,
            rotation,
            scaling
        ])

print(
            f"  {node.name or '(unnamed)'}: "
            f"position={translation}, "
            f"rotation={rotation}"
        )

# Write evaluated transformations to CSV
with open(
    OUTPUT_FILE, "w", newline="", encoding="utf-8"
) as file:
    writer = csv.writer(file)

writer.writerow([
        "Time",
        "Node Index",
        "Node Name",
        "Translation",
        "Rotation",
        "Scaling"
    ])

writer.writerows(records)

print(f"\nSaved animation data to {OUTPUT_FILE}")

نحوه کار ارزیابی انیمیشن

بارگذاری صحنه GLB و بازیابی کلیپ‌های آن

Scene.from_file() مدل GLB یا GLTF را بارگذاری می‌کند. مجموعه scene.animation_clips کلیپ‌های موجود را فراهم می‌کند:

scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)

هر کلیپ یک نام و بازه زمانی بر حسب ثانیه را از طریق name، start و stop در دسترس قرار می‌دهد. برای مشاهده مرجع API AnimationClip مراجعه کنید.

اعمال انیمیشن در زمان‌های خاص

عملیات اصلی clip.apply_to(time) است. برای کلیپ نمونه که مدت زمان آن تقریباً 3.708 ثانیه است، پنج برچسب زمانی عبارتند از:

نمونهزمان (ثانیه)
10.000
20.927
31.854
42.781
53.708

می‌توانید مقدار FRAME_COUNT را تغییر دهید تا نمونه‌های بیشتری جمع‌آوری کنید. این نمونه‌ها وضعیت‌های انیمیشن ارزیابی‌شده هستند، نه فریم‌های تصویر رندر شده.

خواندن ترجمه، چرخش و مقیاس‌بندی

پس از اعمال کلیپ، اسکریپت تمام گره‌های صحنه را پیمایش می‌کند و می‌خواند:

  • transform.translation: موقعیت محلی گره.
  • transform.rotation: چرخش محلی گره.
  • transform.scaling: مقیاس محلی گره.

اینها تبدیل‌های محلی هستند، نه لزوماً مختصات فضای جهانی. تبدیل‌های گره والد نیز موقعیت نهایی یک گره را در صحنه تحت تأثیر قرار می‌دهند. گره‌هایی که انیمیشن ندارند می‌توانند مقادیر یکسان را در هر برچسب زمانی حفظ کنند.

خروجی CSV از انیمیشن

اسکریپت فایل animation_transforms.csv را ایجاد می‌کند. برای نمونهٔ ارائه‌شده، کنسول با این شروع می‌شود:

Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)

Evaluating: Animation_1

فایل CSV شامل یک ردیف برای هر گره صحنه در هر زمان‌نمونه‌گیری است و ستون‌های زیر را دارد:

ستونتوضیح
زمانزمان‌سنجی ارزیابی بر حسب ثانیه
شاخص گرهشاخص گره در پیمایش بازگشتی
نام گرهنام گره صحنه
جابجاییموقعیت محلی در زمان‌سنجی
چرخشچرخش محلی در زمان‌سنجی
مقیاسمقیاس محلی در زمان‌سنجی

می‌توانید CSV را در یک برنامهٔ صفحه‌گسترده باز کنید یا با پایتون آن را تجزیه و تحلیل کنید تا تبدیلات را در طول کلیپ مقایسه کنید.

چه چیزهایی را هنگام ارزیابی انیمیشن‌ها بررسی کنیم

چندین کلیپ. این مثال clips[0] را ارزیابی می‌کند. برای ارزیابی انیمیشن دیگر، یک ایندکس متفاوت انتخاب کنید یا یک کلیپ را با نام آن با استفاده از scene.get_animation_clip(name) بازیابی کنید.

رزولوشن نمونه‌برداری. پنج زمان‌مهر نمای کلی پایه‌ای را فراهم می‌کنند، اما ممکن است حرکت سریع را از دست بدهند. مقدار FRAME_COUNT را افزایش دهید یا زمان‌های خاصی را برای بررسی جزئیات بیشتر انتخاب کنید.

اسکلت‌ها و هدف‌های مورف. همهٔ اثرات انیمیشن به‌صورت تغییرات در ترجمه، چرخش یا مقیاس محلی یک گره ظاهر نمی‌شوند. این جریان کاری CSV تمام انواع تغییر شکل اسکلت یا هدف‌مورف را ثبت نمی‌کند.

وابستگی‌های GLTF. فایل‌های متنی .gltf ممکن است به بافرها و بافت‌های خارجی ارجاع دهند. این فایل‌ها را در مسیرهای نسبی مورد انتظار خود نگه دارید.

آیا ارزیابی انیمیشن‌های GLB به GPU نیاز دارد؟

این مثال Scene.render() یا بک‌اند رندرینگ Vulkan را فراخوانی نمی‌کند. این مثال ویژگی‌های انیمیشن را ارزیابی می‌کند و به جای تولید تصویر، داده‌های CSV را می‌نویسد. رندرینگ Aspose.3D دارای نیازمندی‌های سخت‌افزاری جداگانه‌ای است که برای جریان کاری فقط CSV این مثال اعمال نمی‌شود.

دریافت یک مجوز موقت رایگان

شما می‌توانید درخواست یک مجوز موقت ۳۰ روزه رایگان برای ارزیابی Aspose.3D for Python via .NET بدون محدودیت‌های ارزیابی. برای اعمال مجوز در برنامه Python خود، راهنمای مجوز Aspose.3D را دنبال کنید.

منابع یادگیری رایگان

منابع زیر را بررسی کنید تا بیشتر درباره کار با مدل‌های سه‌بعدی، انیمیشن‌ها و فرمت‌های فایل پشتیبانی‌شده با Aspose.3D for Python via .NET بیاموزید:

نتیجه‌گیری

Aspose.3D for Python via .NET 26.10 به شما امکان می‌دهد کلیپ‌های انیمیشن GLB و GLTF را در زمان‌های انتخابی با AnimationClip.apply_to() ارزیابی کنید. با خواندن تبدیلات گره پس از هر ارزیابی، می‌توانید حرکت را بررسی کرده و داده‌های ساختاریافتهٔ انیمیشن را بدون رندر کردن مدل صادر کنید. مثال را برای ارزیابی کلیپ‌های اضافی، افزایش فرکانس نمونه‌برداری یا تجزیه و تحلیل گره‌های انتخابی تطبیق دهید.

بیشتر بخوانید