Mengevaluasi animasi dalam file GLB atau GLTF memungkinkan Anda memeriksa bagaimana objek 3D bergerak, berputar, dan berskala seiring waktu tanpa merender adegan. Anda dapat menggunakan pendekatan ini untuk menganalisis data animasi, memverifikasi gerakan, atau mengekspor transformasi untuk pemrosesan lebih lanjut. Dalam tutorial ini, Anda akan memuat model GLB yang beranimasi, memeriksa klipnya, mengevaluasi lima stempel waktu, dan mengekspor transformasi node ke CSV.
Memuat dan mengevaluasi animasi GLB di Python
Klips animasi berisi data animasi yang terkait dengan sebuah adegan. Waktu mulai dan berhentinya menentukan periode yang dapat Anda evaluasi. Alur kerja adalah memuat model, memilih klip animasi, menerapkannya pada waktu-waktu tertentu, memeriksa node adegan, dan mengekspor transformasinya.
Instal Aspose.3D for Python via .NET
Instal Aspose.3D for Python via .NET, yang menyediakan API evaluasi animasi yang digunakan di sini:
pip install aspose-3d==26.10.0
Lihat dokumentasi instalasi untuk detail lebih lanjut.
Evaluasi animasi dan ekspor transformasi node
Contoh kode berikut mengevaluasi klip animasi pertama pada lima stempel waktu yang terdistribusi merata dan menyimpan translasi, rotasi, serta skala lokal setiap node dalam 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}")
Cara kerja evaluasi animasi
Muat adegan GLB dan ambil klipnya
Scene.from_file() memuat model GLB atau GLTF. Koleksi scene.animation_clips menyediakan klip yang tersedia:
scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)
Setiap klip mengekspos nama dan rentang waktu dalam detik melalui name, start, dan stop. Lihat AnimationClip API reference.
Terapkan animasi pada timestamp tertentu
Operasi utama adalah clip.apply_to(time). Untuk klip contoh, yang durasinya kira‑kira 3.708 detik, lima cap waktu adalah:
| Contoh | Waktu (detik) |
|---|---|
| 1 | 0.000 |
| 2 | 0.927 |
| 3 | 1.854 |
| 4 | 2.781 |
| 5 | 3.708 |
Anda dapat mengubah FRAME_COUNT untuk mengumpulkan lebih banyak sampel. Sampel‑sampel ini adalah keadaan animasi yang dievaluasi, bukan frame gambar yang dirender.
Baca translasi, rotasi, dan skala
Setelah menerapkan klip, skrip menelusuri semua node adegan dan membaca:
transform.translation: posisi lokal node.transform.rotation: rotasi lokal node.transform.scaling: skala lokal node.
Ini adalah transformasi lokal, tidak selalu koordinat ruang dunia. Transformasi node induk juga memengaruhi posisi akhir node dalam adegan. Node tanpa animasi dapat mempertahankan nilai yang sama pada setiap stempel waktu.
Output CSV dari animasi
Skrip membuat animation_transforms.csv. Untuk contoh yang disediakan, konsol dimulai dengan:
Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)
Evaluating: Animation_1
CSV berisi satu baris per node adegan pada setiap timestamp yang diambil sampelnya dan kolom‑kolom berikut:
| Kolom | Deskripsi |
|---|---|
| Waktu | Stempel waktu evaluasi dalam detik |
| Indeks Node | Indeks node dalam penelusuran rekursif |
| Nama Node | Nama node adegan |
| Translasi | Posisi lokal pada timestamp |
| Rotasi | Rotasi lokal pada timestamp |
| Skala | Skala lokal pada timestamp |
Anda dapat membuka CSV di aplikasi spreadsheet atau menganalisisnya dengan Python untuk membandingkan transformasi di seluruh klip.
Hal yang perlu diperiksa saat mengevaluasi animasi
Beberapa klip. Contoh ini mengevaluasi clips[0]. Untuk mengevaluasi animasi lain, pilih indeks yang berbeda atau ambil klip berdasarkan nama menggunakan scene.get_animation_clip(name).
Resolusi sampling. Lima cap waktu memberikan gambaran dasar, tetapi mungkin melewatkan gerakan cepat. Tingkatkan FRAME_COUNT atau pilih waktu tertentu untuk memeriksa detail lebih lanjut.
Kerangka dan target morf. Tidak semua efek animasi muncul sebagai perubahan pada translasi, rotasi, atau skala lokal sebuah node. Alur kerja CSV ini tidak menangkap setiap jenis deformasi kerangka atau target-morf.
Dependensi GLTF. File .gltf berbasis teks dapat merujuk ke buffer dan tekstur eksternal. Simpan file tersebut pada jalur relatif yang diharapkan.
Apakah mengevaluasi animasi GLB memerlukan GPU?
Contoh ini tidak memanggil Scene.render() atau backend rendering Vulkan. Ia mengevaluasi properti animasi dan menulis data CSV alih‑alih menghasilkan gambar. Rendering Aspose.3D memiliki persyaratan persyaratan perangkat keras, yang tidak berlaku untuk alur kerja CSV‑only contoh ini.
Dapatkan Lisensi Sementara Gratis
Anda dapat meminta lisensi sementara gratis selama 30 hari untuk mengevaluasi 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 bekerja dengan model 3D, animasi, dan format file yang didukung menggunakan Aspose.3D for Python via .NET:
- Aspose.3D for Python Developer Guide – Pelajari cara membuat, memuat, memodifikasi, dan memproses file 3D.
- Free Online 3D Applications – Lihat, konversi, dan proses model 3D langsung di peramban Anda.
- Aspose.3D Python API Reference – Jelajahi kelas, metode, dan properti yang tersedia.
- Aspose.3D Tutorials and Articles – Temukan contoh praktis dan panduan untuk bekerja dengan format file 3D.
Kesimpulan
Aspose.3D for Python via .NET 26.10 memungkinkan Anda mengevaluasi klip animasi GLB dan GLTF pada waktu yang dipilih dengan AnimationClip.apply_to(). Dengan membaca transformasi node setelah setiap evaluasi, Anda dapat memeriksa gerakan dan mengekspor data animasi terstruktur tanpa merender model. Sesuaikan contoh untuk mengevaluasi klip tambahan, meningkatkan frekuensi sampling, atau menganalisis node yang dipilih.
