Vyhodnocování animací v souboru GLB nebo GLTF vám umožňuje zkontrolovat, jak se 3D objekty pohybují, otáčejí a mění měřítko v čase, aniž byste museli vykreslovat scénu. Tento přístup můžete použít k analýze animačních dat, ověření pohybů nebo exportu transformací pro další zpracování. V tomto tutoriálu načtete animovaný model GLB, prozkoumáte jeho klipy, vyhodnotíte pět časových okamžiků a exportujete transformace uzlů do formátu CSV.

Načíst a vyhodnotit animace GLB v Pythonu

Animovaný klip obsahuje animační data spojená se scénou. Jeho počáteční a koncové časy definují období, které můžete vyhodnocovat. Pracovní postup spočívá v načtení modelu, výběru animovaného klipu, jeho aplikaci v konkrétních časech, prozkoumání uzlů scény a exportu jejich transformací.

Instalace Aspose.3D pro Python via .NET

Nainstalujte Aspose.3D for Python via .NET, která poskytuje API pro vyhodnocování animací použité zde:

pip install aspose-3d==26.10.0

Viz dokumentaci k instalaci pro více podrobností.

Vyhodnoťte animaci a exportujte transformace uzlů

Následující ukázkový kód vyhodnocuje první animační klip v pěti rovnoměrně rozložených časových okamžicích a ukládá lokální posunutí, rotaci a škálování každého uzlu do souboru 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}")

Jak funguje vyhodnocení animace

Načtěte scénu GLB a získejte její klipy

Scene.from_file() načte model GLB nebo GLTF. Kolekce scene.animation_clips poskytuje dostupné klipy:

scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)

Každý klip vystavuje název a časový rozsah v sekundách pomocí name, start a stop. Viz referenční dokumentaci AnimationClip API.

Použít animaci v konkrétních časových značkách

Hlavní operací je clip.apply_to(time). Pro ukázkový klip, jehož délka je přibližně 3.708 sekundy, je pět časových razítek:

VzorekČas (sekundy)
10.000
20.927
31.854
42.781
53.708

Můžete změnit FRAME_COUNT, abyste získali více vzorků. Tyto vzorky jsou vyhodnocené stavy animace, nikoli vykreslené snímky obrazu.

Čtení posunu, rotace a měřítka

Po aplikaci ořezu skript prochází všechny uzly scény a čte:

  • transform.translation: lokální pozice uzlu.
  • transform.rotation: lokální rotace uzlu.
  • transform.scaling: lokální měřítko uzlu.

Jedná se o lokální transformace, nikoli nutně souřadnice ve světovém prostoru. Transformace nadřazeného uzlu také ovlivňují konečnou pozici uzlu ve scéně. Uzly bez animace mohou zachovat stejné hodnoty při každém časovém razítku.

CSV výstup z animace

Skript vytvoří animation_transforms.csv. Pro dodaný vzor konzole začíná s:

Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)

Evaluating: Animation_1

CSV obsahuje jeden řádek pro každý uzel scény při každém odebraném časovém okamžiku a tyto sloupce:

SloupecPopis
ČasČasové razítko vyhodnocení v sekundách
Index uzluIndex uzlu v rekurzivním průchodu
Název uzluNázev uzlu scény
PosunMístní pozice v daném časovém okamžiku
RotaceMístní rotace v daném časovém okamžiku
MěřítkoMístní měřítko v daném časovém okamžiku

CSV můžete otevřít v tabulkové aplikaci nebo jej analyzovat pomocí Pythonu, abyste porovnali transformace napříč klipem.

Co zkontrolovat při hodnocení animací

Více klipů. Tento příklad vyhodnocuje clips[0]. Pro vyhodnocení jiné animace zvolte jiný index nebo načtěte klip podle názvu pomocí scene.get_animation_clip(name).

Rozlišení vzorkování. Pět časových značek poskytuje základní přehled, ale může přehlédnout rychlý pohyb. Zvyšte FRAME_COUNT nebo vyberte konkrétní časy pro podrobnější kontrolu.

Skelet a morph cíle. Ne všechny animační efekty se projevují jako změny v lokálním posunu, rotaci nebo škálování uzlu. Tento CSV workflow nezachycuje každý typ skeletální nebo morph‑cílové deformace.

Závislosti GLTF. Textové soubory .gltf mohou odkazovat na externí buffery a textury. Ujistěte se, že tyto soubory jsou umístěny na očekávaných relativních cestách.

Vyžaduje vyhodnocování animací GLB GPU?

Tento příklad nevolá Scene.render() ani backend pro vykreslování Vulkan. Vyhodnocuje vlastnosti animace a zapisuje data CSV místo generování obrázků. Aspose.3D rendering má samostatné hardwarové požadavky, které se na workflow generující pouze CSV nevztahují.

Získejte bezplatnou dočasnou licenci

Můžete požádat o bezplatnou 30denní dočasnou licenci k vyzkoušení Aspose.3D for Python via .NET bez omezení vyhodnocování. Pro použití licence ve vaší Python aplikaci postupujte podle průvodce licencováním Aspose.3D.

Bezplatné výukové zdroje

Prozkoumejte následující zdroje a zjistěte více o práci s 3D modely, animacemi a podporovanými formáty souborů pomocí Aspose.3D for Python via .NET:

Závěr

Aspose.3D for Python via .NET 26.10 vám umožňuje vyhodnocovat animační klipy GLB a GLTF ve vybraných časech pomocí AnimationClip.apply_to(). Čtením transformací uzlů po každém vyhodnocení můžete zkontrolovat pohyb a exportovat strukturovaná animační data bez renderování modelu. Přizpůsobte příklad tak, aby vyhodnocoval další klipy, zvýšil vzorkovací frekvenci nebo analyzoval vybrané uzly.

Číst dál