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:

ÖrnekZaman (saniye)
10.000
20.927
31.854
42.781
53.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ütunAçıklama
ZamanDeğ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ı
ÇeviriZaman damgasındaki yerel konum
DönmeZaman damgasındaki yerel dönüş
ÖlçeklemeZaman 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:

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.

Devamını Oku