Bir GLB veya GLTF dosyasındaki animasyonları değerlendirmek, sahneyi render etmeden 3D nesnelerin zaman içinde nasıl hareket ettiğini, döndüğünü ve ölçeklendiğini incelemenizi sağlar. Bu yaklaşımı animasyon verilerini analiz etmek, hareketleri doğrulamak veya dönüşümleri daha sonraki işleme için dışa aktarmak amacıyla kullanabilirsiniz. Bu öğreticide, animasyonlu bir GLB modelini yükleyecek, kliplerini inceleyecek, beş zaman damgasını değerlendirecek ve düğüm dönüşümlerini CSV formatına dışa aktaracaksınız.
Python’da GLB animasyonlarını yükleme ve değerlendirme
Bir animasyon klibi, bir sahneyle ilişkili animasyon verilerini içerir. Başlangıç ve bitiş zamanları, değerlendirebileceğiniz dönemi tanımlar. İş akışı, bir modeli yüklemek, bir animasyon klibi seçmek, belirli zamanlarda uygulamak, sahne düğümlerini incelemek ve dönüşümlerini dışa aktarmaktır.
Kur Aspose.3D for Python via .NET
Burada kullanılan animasyon değerlendirme API’sini sağlayan Aspose.3D for Python via .NET yükleyin:
pip install aspose-3d==26.10.0
Daha fazla ayrıntı için kurulum belgelerine bakın.
Animasyonu Değerlendir ve Düğüm Dönüşümlerini Dışa Aktar
Aşağıdaki kod örneği, ilk animasyon klibini beş eşit aralıklı zaman damgasında değerlendirir ve her düğümün yerel çevirisini, dönüşünü ve ölçeklemesini animation_transforms.csv dosyasına kaydeder.
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}")
Animasyon değerlendirmesi nasıl çalışır
GLB sahnesini yükleyin ve kliplerini alın
Scene.from_file() GLB veya GLTF modelini yükler. scene.animation_clips koleksiyonu mevcut klipleri sağlar:
scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)
Her klip, name, start ve stop aracılığıyla bir ad ve saniye cinsinden bir zaman aralığı sunar. AnimationClip API referansı adresine bakın.
Belirli zaman damgalarında animasyonu uygulayın
Merkezi işlem clip.apply_to(time)‘dır. Süresi yaklaşık 3.708 saniye olan örnek klip için beş zaman damgası şunlardır:
| Örnek | Zaman (saniye) |
|---|---|
| 1 | 0.000 |
| 2 | 0.927 |
| 3 | 1.854 |
| 4 | 2.781 |
| 5 | 3.708 |
Daha fazla örnek toplamak için FRAME_COUNT değerini değiştirebilirsiniz. Bu örnekler, değerlendirilmiş animasyon durumlarıdır, render edilmiş görüntü kareleri değildir.
Çevirme, döndürme ve ölçekleme okuma
Klip uygulandıktan sonra, betik tüm sahne düğümlerini dolaşır ve şunları okur:
transform.translation: düğümün yerel konumu.transform.rotation: düğümün yerel dönüşü.transform.scaling: düğümün yerel ölçeği.
Bunlar yerel dönüşümler, mutlaka dünya uzayı koordinatları değildir. Üst düğüm dönüşümleri de bir düğümün sahnedeki nihai konumunu etkiler. Animasyonu olmayan düğümler her zaman damgasında aynı değerleri koruyabilir.
Animasyondan CSV çıktısı
Komut dosyası animation_transforms.csv dosyasını oluşturur. Sağlanan örnek için, konsol şu şekilde başlar:
Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)
Evaluating: Animation_1
CSV, her örneklenen zaman damgasında sahne düğümü başına bir satır içerir ve şu sütunları içerir:
| Sütun | Açıklama |
|---|---|
| Zaman | Değerlendirme zaman damgası (saniye cinsinden) |
| Düğüm İndeksi | Özyinelemeli geçişte düğümün indeksi |
| Düğüm Adı | Sahne düğümünün adı |
| Çeviri | Zaman damgasındaki yerel konum |
| Dönme | Zaman damgasındaki yerel dönüş |
| Ölçekleme | Zaman damgasındaki yerel ölçek |
CSV’yi bir elektronik tablo uygulamasında açabilir veya Python ile analiz ederek klip boyunca dönüşümleri karşılaştırabilirsiniz.
Animasyonları değerlendirirken kontrol edilmesi gerekenler
Birden fazla klip. Bu örnek clips[0] ifadesini değerlendirir. Başka bir animasyonu değerlendirmek için farklı bir indeks seçin veya adıyla bir klip almak için scene.get_animation_clip(name) kullanın.
Örnekleme çözünürlüğü. Beş zaman damgası temel bir genel bakış sağlar, ancak hızlı hareketi kaçırabilir. Daha fazla ayrıntı incelemek için FRAME_COUNT değerini artırın veya belirli zamanları seçin.
İskeletler ve morf hedefleri. Tüm animasyon efektleri bir düğümün yerel çevirisi, dönüşü veya ölçeklendirmesindeki değişiklikler olarak görünmez. Bu CSV iş akışı, her türlü iskelet veya morf-hedef deformasyonunu yakalamaz.
GLTF bağımlılıkları. Metin tabanlı .gltf dosyaları harici tamponları ve dokuları referans alabilir. Bu dosyaları beklenen göreceli yollarında tutun.
GLB animasyonlarını değerlendirmek bir GPU gerektirir mi?
Bu örnek Scene.render() metodunu veya Vulkan renderleme arka ucunu çağırmaz. Animasyon özelliklerini değerlendirir ve görüntü oluşturmak yerine CSV verisi yazar. Aspose.3D renderleme, bu örneğin yalnızca CSV iş akışına uygulanmayan ayrı donanım gereksinimlerine sahiptir.
Ücretsiz Geçici Lisans Al
Aspose.3D for Python via .NET’ı değerlendirmek için, değerlendirme sınırlamaları olmadan ücretsiz 30 günlük geçici lisans isteyin. Python uygulamanıza lisansı uygulamak için, Aspose.3D lisanslama kılavuzunu izleyin.
Ücretsiz Öğrenme Kaynakları
Aspose.3D for Python via .NET kullanarak 3D modeller, animasyonlar ve desteklenen dosya formatlarıyla çalışma hakkında daha fazla bilgi edinmek için aşağıdaki kaynakları inceleyin:
- Aspose.3D for Python Developer Guide – 3D dosyalarını oluşturma, yükleme, değiştirme ve işleme yöntemlerini öğrenin.
- Free Online 3D Applications – 3D modelleri doğrudan tarayıcınızda görüntüleyin, dönüştürün ve işleyin.
- Aspose.3D Python API Reference – Mevcut sınıfları, metodları ve özellikleri keşfedin.
- Aspose.3D Tutorials and Articles – 3D dosya formatlarıyla çalışmak için pratik örnekler ve kılavuzlar bulun.
Sonuç
Aspose.3D for Python via .NET 26.10, GLB ve GLTF animasyon kliplerini seçili zamanlarda AnimationClip.apply_to() ile değerlendirmenizi sağlar. Her değerlendirmeden sonra düğüm dönüşümlerini okuyarak hareketi inceleyebilir ve modeli render etmeden yapılandırılmış animasyon verilerini dışa aktarabilirsiniz. Ek klipleri değerlendirmek, örnekleme frekansını artırmak veya seçili düğümleri analiz etmek için örneği uyarlayın.
