关键帧动画定义了数值随时间的变化方式。例如,你可以指定对象在动画开始时的位置以及随后应移动到的位置,然后计算这些关键帧之间任意时刻的位置信息。这对于检查运动曲线、验证动画时序以及导出采样值以进行进一步分析非常有用。Aspose.3D for Python via .NET 使你能够在不渲染 3D 场景的情况下,对指定时间戳的关键帧序列进行采样。在本教程中,你将创建一个简单的位置动画,每半秒评估一次其插值值,并将结果保存为 CSV 文件。
安装 Aspose.3D for Python
使用 pip 安装 Aspose.3D for Python via .NET 版本 26.10:
pip install aspose-3d==26.10.0
此示例仅使用 aspose.threed.animation 模块和 Python 内置的 csv 模块。由于代码执行的是动画计算而非图像渲染,您无需 GLB/GLTF 文件或兼容 Vulkan 的显卡。
有关平台和安装信息,请参阅 Aspose.3D for Python 文档。
在 Python 中创建和评估关键帧动画
该示例模拟对象的 X 位置。位置从 0 开始,经过两秒后达到 10 单位,并在五秒后返回到 0。
| 时间(秒) | X 位置 | 操作 |
|---|---|---|
| 0 | 0 | 开始 |
| 2 | 10 | 达到最大位置 |
| 5 | 0 | 返回起点 |
这些关键帧之间的值是使用 线性插值 计算的。示例创建了一个独立的数值动画曲线;它并未将该序列附加到实际的场景对象上。
完整的 Python 代码示例
以下脚本创建一个 KeyframeSequence,添加三个关键帧,评估十一时间戳,验证关键帧值,并将结果导出到 keyframe_animation.csv。
import csv
from aspose.threed.animation import (
KeyframeSequence,
Interpolation
)
OUTPUT_FILE = "keyframe_animation.csv"
# Create an animation curve
sequence = KeyframeSequence("PositionX")
# Define keyframes using linear interpolation
sequence.add(0.0, 0.0, Interpolation.LINEAR)
sequence.add(2.0, 10.0, Interpolation.LINEAR)
sequence.add(5.0, 0.0, Interpolation.LINEAR)
# Display the defined keyframes
print("Keyframes:")
for key in sequence.key_frames:
print(
f"Time: {key.time:.2f}s, "
f"Value: {key.value:.2f}"
)
# Evaluate the animation every 0.5 seconds
start_time = 0.0
end_time = 5.0
step = 0.5
records = []
print("\nEvaluated animation values:")
print("---------------------------")
print("Time (s) | X Position")
sample_count = int(
round((end_time - start_time) / step)
) + 1
for i in range(sample_count):
time = float(start_time + i * step)
# Evaluate the animation at this timestamp
value = float(sequence.evaluate(time))
records.append([time, value])
print(f"{time:8.2f} | {value:10.3f}")
# Verify values at known timestamps
assert abs(sequence.evaluate(0.0) - 0.0) < 1e-5
assert abs(sequence.evaluate(2.0) - 10.0) < 1e-5
assert abs(sequence.evaluate(5.0) - 0.0) < 1e-5
# Export animation data to CSV
with open(
OUTPUT_FILE,
"w",
newline="",
encoding="utf-8"
) as file:
writer = csv.writer(file)
writer.writerow([
"Time (seconds)",
"X Position"
])
writer.writerows(records)
print(f"\nAnimation data saved to {OUTPUT_FILE}")
print("Keyframe validation passed.")
了解关键帧评估的工作原理
定义关键帧序列
KeyframeSequence 类表示在特定时间定义值的数值曲线。此行创建了一个名为 PositionX 的序列:
sequence = KeyframeSequence("PositionX")
名称有助于识别序列。它不会自动将序列绑定到网格或节点属性。有关详细信息,请参阅 KeyframeSequence API 参考。
使用线性插值添加关键帧
每次调用 add() 都会提供时间戳、值和插值类型:
sequence.add(0.0, 0.0, Interpolation.LINEAR)
sequence.add(2.0, 10.0, Interpolation.LINEAR)
sequence.add(5.0, 0.0, Interpolation.LINEAR)
Interpolation.LINEAR 告诉序列在关键帧之间按比例计算中间值。结果是,在前两秒内值从 0 稳步增加到 10,在接下来的三秒内值从 10 稳步降低到 0。
在时间戳处计算值
关键操作是:
value = sequence.evaluate(1.5)
对于此示例,1.5 秒时的预期结果是 7.5。线性插值遵循以下公式:
[ v(t) = v_0 + \frac{t - t_0}{t_1 - t_0}(v_1 - v_0) ]
这里,t 是请求的时间戳,t0 和 t1 是相邻的关键帧时间,而 v0 和 v1 是它们各自的值。
在前两个关键帧之间,在 1.5 秒时进行评估得到:
[ v(1.5) = 0 + \frac{1.5 - 0}{2 - 0}(10 - 0) = 7.5 ]
您无需自行实现此公式。KeyframeSequence.evaluate() 根据序列的插值设置执行计算。
检查评估值
对于示例关键帧,输出为:
Keyframes:
Time: 0.00s, Value: 0.00
Time: 2.00s, Value: 10.00
Time: 5.00s, Value: 0.00
Evaluated animation values:
---------------------------
Time (s) | X Position
0.00 | 0.000
0.50 | 2.500
1.00 | 5.000
1.50 | 7.500
2.00 | 10.000
2.50 | 8.333
3.00 | 6.667
3.50 | 5.000
4.00 | 3.333
4.50 | 1.667
5.00 | 0.000
Animation data saved to keyframe_animation.csv
Keyframe validation passed.
assert 语句检查在三个定义的关键帧时间戳处的值。它们使用小的容差而不是直接的浮点相等。
关键帧之间的变化值确认了该序列正在跨其时间范围进行采样。
导出关键帧值为 CSV
在评估序列后,脚本使用 Python 的 csv 模块将时间和计算得到的 X 位置写入 keyframe_animation.csv。文件开头如下:
Time (seconds),X Position
0.0,0.0
0.5,2.5
1.0,5.0
1.5,7.5
2.0,10.0
您可以在电子表格应用程序中打开此 CSV,绘制生成的运动曲线,或将其读取回 Python 进行分析。要获得更细粒度的结果,请将 step 从 0.5 降低到更小的间隔,并调整所需的时间范围。
实际注意事项
仅在预定时间范围内采样。 本教程评估的时间范围为 0 到 5 秒。超出定义关键帧的值受预外推和后外推行为的控制,这与关键帧之间的插值是分开的。
有意选择插值方式。 线性插值在每个段内产生恒定的变化。其他插值样式可以产生不同的运动特性,可能需要额外的关键帧设置。请在更改插值模式之前参考动画 API 参考。
区分动画评估和场景动画。 代码仅评估数值曲线。它不会更新场景节点的 X 位置或创建渲染动画。要移动 3D 对象,必须将序列连接到场景中适当的动画属性。
GPU 渲染不是必需的。 未调用 Scene.render() 或渲染后端。这使得该示例适用于在没有 Vulkan 兼容 GPU 的机器上处理动画值。
获取免费临时许可证
You can 请求一个免费 30 天的临时许可证 来评估 Aspose.3D for Python via .NET,且没有试用限制。Follow the Aspose.3D 许可指南 to apply the license to your application.
免费学习资源
探索以下资源,以继续在 Python 中进行 3D 动画和文件处理工作流:
- Aspose.3D for Python Developer Guide – 用于加载、创建和处理 3D 场景的文档。
- Aspose.3D Animation API Reference – 包含关键帧、插值、动画剪辑和属性绑定的类。
- Free Online 3D Applications – 基于浏览器的工具,支持 3D 文件任务。
- Aspose.3D Tutorials and Articles – 更多实用示例,帮助使用 3D 格式。
结论
您可以在 Aspose.3D for Python via .NET 中使用 KeyframeSequence.evaluate() 来计算特定时间点的动画值,而无需渲染模型。在本例中,三个关键帧定义了 X 位置曲线,评估器计算中间位置并将其导出为 CSV。要调整示例,只需更改关键帧值或采样间隔。对于模型级别的动画,下一步是将动画曲线绑定到场景属性并应用到对象上。
