Animasyonlu bir GLB veya GLTF modeli, hazır görüntülerden oluşan bir klasör yerine geometri ve animasyon verilerini depolar. Küçük resimler veya bir kare dizisi oluşturmak için modelin animasyonunu belirli zaman damgalarında değerlendirmeniz ve ortaya çıkan her sahneyi bir görüntüye render etmeniz gerekir. Bu öğretici, Python’da GLB animasyon karelerini render etmeyi Aspose.3D for Python via .NET kullanarak açıklar. Animasyonlu bir modeli yükleyecek, bir klip seçecek, zaman çizelgesini örnekleyecek ve her kareyi numaralı bir PNG görüntüsü olarak kaydedeceksiniz. Oluşan görüntüleri model ön izlemeleri olarak veya ayrı bir görüntü‑dizisi iş akışına girdi olarak kullanabilirsiniz.

Kur Aspose.3D for Python via .NET

pip kullanarak paketi yükleyin:

pip install aspose-3d

Ayrıca şunlara ihtiyacınız olacak:

  • Bir animasyonlu .glb dosyası veya eşlik eden tamponları ve dokuları içeren bir .gltf dosyası.
  • Aspose.3D’nin donanım gereksinimleriyle uyumlu bir render ortamı. Sistem gereksinimleri için sistem gereksinimleri sayfasına bakın.
  • Örneklenen zaman çizelgesi boyunca animasyonlu nesneyi görüş alanında tutan bir kamera konumu.

Animasyon klibini PNG kareleri olarak render edin

Aşağıdaki kodu render_glb_animation_frames.py olarak kaydedin ve animated_model.glb dosyasını içeren klasörden çalıştırın.

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()

Şununla çalıştırın:

python render_glb_animation_frames.py

Beklenen çıktı: frames dizini içinde frame_0000.png, frame_0001.png ve frame_0002.png gibi görüntüler bulunur. Renderlayıcı uygulanan animasyon durumlarını doğru bir şekilde yakaladığında, görüntüler modelin animasyonundaki ardışık noktaları gösterir.

Çerçeve renderleme kodunun nasıl çalıştığı

Sahneyi yükleyin ve bir animasyon klibi seçin

Scene.from_file() yöntemi modeli açar, scene.animation_clips ise içinde bulunan animasyon kliplerine erişim sağlar. Örnek, ilk klibi kullanır ve zaman aralığını belirlemek için start ve stop özelliklerini okur. Animasyon klibi olmayan bir model bu yöntemle animasyonlu bir dizi oluşturamaz.

Klip seçimi ve düğüm dönüşümleri hakkında daha fazla ayrıntı için, Python’da GLB/GLTF Animasyonlarını Yükleme ve Değerlendirme.

Zaman çizelgesini düzenli aralıklarla örnekleyin

Betik saniyede beş örnek kullanır. Klip iki saniye sürerse, klip sıfırda başladığında 0.0’dan 1.8 saniyeye kadar zaman damgalarında on kare talep eder. Kesin son noktayı hariç tutmak, döngüye geri dönen animasyonlar için gereksiz bir son kare oluşturulmasını önler.

clip.apply_to(timestamp) yöntemi, seçilen animasyon klibini her zaman damgasında uygular. Tek bir anahtar kare dizisini değerlendirmekten farklı olarak, bu adım görüntü işlenmeden önce animasyonlu sahneyi güncellemeyi amaçlar.

Bir kameradan güncellenen sahneyi render edin

Örnek, sabit bir konumda bir kamera ekler ve her kare için scene.render() metodunu çağırır. Ayrıca 800 × 600 piksel görüntü boyutunu ve PNG çıktı formatını ayarlar. Kamerayı sabit tutmak, kareden kareye farkları incelemeyi kolaylaştırır.

The Aspose.3D sahne renderleme rehberi 3D bir görünümü resim olarak nasıl kaydedeceğinizi gösterir. Animasyon dizileri için, her bir görüntünün istenen zaman damgasını yansıttığını doğrulayın. Ardışık kareler aynı pozu gösteriyorsa, renderleme yolunun mevcut animasyon durumunu kullanıp kullanmadığını kontrol edin.

PNG çerçevelerine tutarlı bir şekilde isim verin

frame_0000.png deseni, dosya adına göre sıralandığında görüntülerin sırasını korur. Ön izleme küçük resimleri oluşturmak veya çıktıyı ayrı bir görüntü dizisi ya da video iş akışına geçirmek için uygundur. Betik bir video veya hareketli GIF oluşturmaz.

Betik ayrıca tüm çıktı dosyalarının bayt olarak aynı olup olmadığını uyarı vermek için dosya karmalarını karşılaştırır. Farklı karmalar, animasyonun doğru bir şekilde işlenmiş olduğunu tek başına kanıtlamaz; temsilci kareleri yan yana inceleyin.

Ücretsiz Geçici Lisans Al

Aspose.3D for Python via .NET kullanarak GLB ve GLTF animasyon çerçevelerini değerlendirme sınırlamaları olmadan işlemek için ücretsiz 30 günlük geçici lisans talep edin. Lisansı Python uygulamanıza uygulamak için Aspose.3D lisanslama kılavuzunu izleyin.

Ücretsiz Öğrenme Kaynakları

Aşağıdaki kaynakları keşfederek, animasyonlu 3D modellerin yüklenmesi, animasyon klipleriyle çalışma ve Aspose.3D for Python via .NET kullanarak 3D sahnelerin renderlanması hakkında daha fazla bilgi edinebilirsiniz:

  • Aspose.3D for Python Developer Guide – Python’da 3D modelleri nasıl yükleyeceğinizi, değiştireceğinizi, canlandıracağınızı ve renderlayacağınızı öğrenin.
  • Render 3D Scenes to Images – Bir kamerayı nasıl yapılandıracağınızı ve 3D sahneleri görüntü dosyaları olarak nasıl renderlayacağınızı öğrenin.
  • Aspose.3D Python API Reference – Animasyon klipleri, sahne renderleme, kameralar ve 3D dosya işleme için sınıfları ve yöntemleri keşfedin.
  • Free Online 3D Applications – Desteklenen 3D modelleri doğrudan tarayıcınızda görüntüleyin, dönüştürün ve işleyin.
  • Aspose.3D Tutorials and Articles – GLB/GLTF animasyonları, anahtar kare değerlendirmesi ve diğer 3D işleme görevlerini kapsayan pratik Python eğitimlerini bulun.

Sonuç

Bir animasyon zaman çizelgesini örnekleyerek ve sahneyi her seçilen zaman damgasında render ederek kare görüntüleri oluşturabilirsiniz. Numaralı PNG’leri küçük resimler oluşturmak, pozları karşılaştırmak veya başka bir araç için bir görüntü dizisi hazırlamak için kullanın. Görüntüler yerine sayısal animasyon değerlerine ihtiyacınız varsa, anahtar kare değerlendirme öğreticisi. Render sorunları için, Aspose.3D destek forumu.