评估 GLB 或 GLTF 文件中的动画,可让您在不渲染场景的情况下检查 3D 对象随时间的移动、旋转和缩放。您可以使用此方法分析动画数据、验证运动,或导出变换以进行进一步处理。在本教程中,您将加载一个带动画的 GLB 模型,检查其剪辑,评估五个时间戳,并将节点变换导出为 CSV。
在 Python 中加载和评估 GLB 动画
动画剪辑包含与场景关联的动画数据。其开始和结束时间定义了可评估的时间段。工作流程是加载模型,选择动画剪辑,在特定时间点应用它,检查场景节点,并导出它们的变换。
安装 Aspose.3D for Python via .NET
安装 Aspose.3D for Python via .NET,它提供了此处使用的动画评估 API:
pip install aspose-3d==26.10.0
请参阅安装文档了解更多细节。
评估动画并导出节点变换
以下代码示例在五个均匀间隔的时间戳上评估第一个动画剪辑,并将每个节点的本地平移、旋转和缩放保存到 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}")
动画评估的工作原理
加载 GLB 场景并检索其剪辑
Scene.from_file() 加载 GLB 或 GLTF 模型。scene.animation_clips 集合提供可用的剪辑:
scene = a3d.Scene.from_file("animated_model.glb")
clips = list(scene.animation_clips)
每个剪辑通过 name、start 和 stop 公开名称和以秒为单位的时间范围。请参阅 AnimationClip API 参考。
在特定时间戳应用动画
核心操作是 clip.apply_to(time)。对于示例剪辑,其时长约为 3.708 秒,五个时间戳如下:
| 示例 | 时间(秒) |
|---|---|
| 1 | 0.000 |
| 2 | 0.927 |
| 3 | 1.854 |
| 4 | 2.781 |
| 5 | 3.708 |
您可以更改 FRAME_COUNT 以收集更多样本。这些样本是已评估的动画状态,而不是渲染的图像帧。
读取平移、旋转和缩放
应用剪辑后,脚本遍历所有场景节点并读取:
transform.translation: 节点的本地位置。transform.rotation: 节点的本地旋转。transform.scaling: 节点的本地缩放。
这些是本地变换,不一定是世界空间坐标。父节点的变换也会影响节点在场景中的最终位置。没有动画的节点可以在每个时间戳保持相同的值。
动画的 CSV 输出
脚本创建 animation_transforms.csv。对于提供的示例,控制台的输出以以下内容开始:
Found 1 animation clip(s).
0: Animation_1 (0.000 to 3.708 seconds)
Evaluating: Animation_1
CSV 在每个采样时间戳为每个场景节点包含一行,并包含以下列:
| 列 | 描述 |
|---|---|
| 时间 | 以秒为单位的评估时间戳 |
| 节点索引 | 递归遍历中的节点索引 |
| 节点名称 | 场景节点的名称 |
| 平移 | 时间戳处的本地位置 |
| 旋转 | 时间戳处的本地旋转 |
| 缩放 | 时间戳处的本地缩放 |
您可以在电子表格应用程序中打开 CSV,或使用 Python 进行分析,以比较剪辑中的转换。
评估动画时需要检查的内容
多个剪辑。 此示例评估 clips[0]。 要评估另一个动画,请选择不同的索引,或使用 scene.get_animation_clip(name) 按名称检索剪辑。
采样分辨率。 五个时间戳提供了基本概览,但可能会错过快速运动。增加 FRAME_COUNT 或选择特定时间以检查更详细的信息。
骨骼和形态目标。 并非所有动画效果都表现为节点的局部平移、旋转或缩放的变化。此 CSV 工作流并未捕获每种骨骼或形态目标的变形。
GLTF 依赖项。 基于文本的 .gltf 文件可能引用外部缓冲区和纹理。请将这些文件保留在其预期的相对路径下。
评估 GLB 动画是否需要 GPU?
此示例未调用 Scene.render() 或 Vulkan 渲染后端。它评估动画属性并写入 CSV 数据,而不是生成图像。Aspose.3D 渲染具有单独的 硬件要求,这些要求不适用于此示例的仅 CSV 工作流。
获取免费临时许可证
您可以请求免费 30 天临时许可证来评估 Aspose.3D for Python via .NET,且没有评估限制。要在您的 Python 应用程序中应用许可证,请参阅 Aspose.3D 许可指南。
免费学习资源
探索以下资源,了解如何使用 Aspose.3D for Python via .NET 处理 3D 模型、动画以及支持的文件格式:
- Aspose.3D for Python Developer Guide – 了解如何创建、加载、修改和处理 3D 文件。
- Free Online 3D Applications – 在浏览器中直接查看、转换和处理 3D 模型。
- Aspose.3D Python API Reference – 浏览可用的类、方法和属性。
- Aspose.3D Tutorials and Articles – 查找实用示例和指南,以便使用 3D 文件格式。
结论
Aspose.3D for Python via .NET 26.10 让您能够在选定的时间点使用 AnimationClip.apply_to() 评估 GLB 和 GLTF 动画剪辑。通过在每次评估后读取节点变换,您可以检查运动并在不渲染模型的情况下导出结构化的动画数据。将示例适配为评估更多剪辑、提高采样频率或分析选定的节点。
