Model animasi GLB atau GLTF menyimpan geometri dan data animasi alih-alih folder gambar siap pakai. Untuk membuat thumbnail atau urutan frame, Anda perlu mengevaluasi animasi model pada timestamp tertentu dan merender setiap scene yang dihasilkan menjadi gambar. Tutorial ini menjelaskan cara render frame animasi GLB di Python menggunakan Aspose.3D for Python via .NET. Anda akan memuat model animasi, memilih klip, mengambil sampel timeline‑nya, dan menyimpan setiap frame sebagai gambar PNG berangka. Anda dapat menggunakan gambar yang dihasilkan sebagai pratinjau model atau sebagai input ke alur kerja urutan gambar terpisah.
Instal Aspose.3D for Python via .NET
Instal paket menggunakan pip:
pip install aspose-3d
Anda juga memerlukan:
- File
.glbanimasi atau file.gltfdengan buffer dan tekstur yang menyertainya. - Lingkungan rendering yang kompatibel dengan persyaratan perangkat keras Aspose.3D. Lihat persyaratan sistem.
- Posisi kamera yang menjaga objek animasi tetap terlihat sepanjang timeline yang diambil sampelnya.
Render klip animasi sebagai frame PNG
Simpan kode berikut sebagai render_glb_animation_frames.py dan jalankan dari folder yang berisi 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()
Jalankan dengan:
python render_glb_animation_frames.py
Output yang diharapkan: sebuah direktori frames yang berisi gambar seperti frame_0000.png, frame_0001.png, dan frame_0002.png. Ketika renderer menangkap status animasi yang diterapkan dengan benar, gambar-gambar tersebut menunjukkan model pada titik‑titik berurutan dalam animasinya.
Cara kerja kode rendering bingkai
Muat adegan dan pilih klip animasi
Metode Scene.from_file() membuka model, sementara scene.animation_clips memberikan akses ke klip animasi yang dimilikinya. Contoh menggunakan klip pertama dan membaca properti start dan stop‑nya untuk menentukan rentang waktu. Model tanpa klip animasi tidak dapat menghasilkan urutan animasi dengan metode ini.
Untuk detail lebih lanjut tentang pemilihan klip dan transformasi node, lihat Muat dan Evaluasi Animasi GLB/GLTF di Python.
Ambil sampel timeline pada interval reguler
Skrip ini menggunakan lima sampel per detik. Jika klip berdurasi dua detik, ia meminta sepuluh frame pada stempel waktu dari 0.0 hingga 1.8 detik ketika klip dimulai pada nol. Mengabaikan titik akhir yang tepat menghindari pembuatan frame akhir yang berulang untuk animasi yang kembali ke pose awal.
Metode clip.apply_to(timestamp) menerapkan klip animasi yang dipilih pada setiap timestamp. Tidak seperti mengevaluasi urutan keyframe tunggal, langkah ini dimaksudkan untuk memperbarui adegan animasi sebelum gambar dirender.
Render adegan yang diperbarui dari satu kamera
Contoh ini menambahkan kamera pada posisi tetap dan memanggil scene.render() untuk setiap frame. Ini juga mengatur ukuran gambar 800 × 600 piksel dan format output PNG. Menjaga kamera tetap membuat perbedaan antar frame lebih mudah diperiksa.
The Aspose.3D scene-rendering guide menunjukkan cara menyimpan tampilan 3D sebagai gambar. Untuk urutan animasi, pastikan setiap gambar mencerminkan timestamp yang dimaksud. Jika frame berurutan menunjukkan pose yang sama, periksa apakah jalur rendering menggunakan keadaan animasi saat ini.
Namai setiap frame PNG secara konsisten
frame_0000.png pattern menjaga urutan gambar saat diurutkan berdasarkan nama file. Ini cocok untuk menghasilkan thumbnail pratinjau atau meneruskan output ke alur kerja urutan gambar atau video terpisah. Skrip tidak membuat video atau GIF animasi.
Skrip juga membandingkan hash file untuk memperingatkan ketika semua file output identik byte. Hash yang berbeda tidak serta‑merta membuktikan bahwa animasi dirender dengan benar; periksa frame representatif berdampingan.
Dapatkan Lisensi Sementara Gratis
Anda dapat meminta lisensi sementara gratis selama 30 hari untuk merender frame animasi GLB dan GLTF menggunakan Aspose.3D for Python via .NET tanpa batasan evaluasi. Untuk menerapkan lisensi dalam aplikasi Python Anda, ikuti panduan lisensi Aspose.3D.
Sumber Belajar Gratis
Jelajahi sumber daya berikut untuk mempelajari lebih lanjut tentang memuat model 3D animasi, bekerja dengan klip animasi, dan merender adegan 3D menggunakan Aspose.3D for Python via .NET:
- Aspose.3D for Python Developer Guide – Pelajari cara memuat, memodifikasi, menganimasikan, dan merender model 3D dalam Python.
- Render 3D Scenes to Images – Pelajari cara mengonfigurasi kamera dan merender adegan 3D sebagai file gambar.
- Aspose.3D Python API Reference – Jelajahi kelas dan metode untuk klip animasi, perenderan adegan, kamera, dan pemrosesan file 3D.
- Free Online 3D Applications – Lihat, konversi, dan proses model 3D yang didukung langsung di peramban Anda.
- Aspose.3D Tutorials and Articles – Temukan tutorial Python praktis yang mencakup animasi GLB/GLTF, evaluasi keyframe, dan tugas pemrosesan 3D lainnya.
Kesimpulan
Anda dapat menghasilkan gambar frame dengan mengambil sampel timeline animasi dan merender adegan pada setiap timestamp yang dipilih. Gunakan PNG berurutan untuk membuat thumbnail, membandingkan pose, atau menyiapkan urutan gambar untuk alat lain. Jika Anda memerlukan nilai animasi numerik alih‑alih gambar, lihat tutorial evaluasi keyframe. Untuk masalah rendering, kunjungi forum dukungan Aspose.3D.
