如何在Blender中遍历文本对象的缩放关键帧并提取时间戳
Blender Python提取缩放关键帧时间戳并导出JSON
核心思路
别再逐帧遍历场景了——频繁调用frame_set会触发大量场景重绘,直接导致Blender崩溃。正确的做法是直接读取对象的动画关键帧数据,这既高效又稳定,最后再把整理好的数据导出成JSON。
完整代码实现
import bpy import json # 用来存储最终结果的字典 result = {"text_objects": []} # 遍历场景所有对象,筛选名称包含"Text in Camera"的文本对象 for obj in bpy.context.scene.objects: if "Text in Camera" in obj.name and obj.type == 'FONT': # 检查对象是否有绑定动画数据 if obj.animation_data and obj.animation_data.action: # 找到scale属性的动画曲线(FCurve) scale_curve = None for fcurve in obj.animation_data.action.fcurves: # scale是三维向量,取x轴曲线即可(假设三个轴缩放同步) if fcurve.data_path == "scale" and fcurve.array_index == 0: scale_curve = fcurve break if scale_curve: # 提取所有关键帧的帧号和对应缩放值 keyframe_list = [] for kf_point in scale_curve.keyframe_points: frame_num = int(kf_point.co.x) # 关键帧所在帧 scale_val = round(kf_point.co.y, 4) # 对应缩放值,保留四位小数 keyframe_list.append({"frame": frame_num, "scale_value": scale_val}) # 定位你需要的startPoint和endPoint start_frame = None end_frame = None # 找第一个缩放值为0的关键帧(开始增长的帧) for kf in keyframe_list: if kf["scale_value"] == 0.0: start_frame = kf["frame"] break # 找第一个缩放值达到0.35的关键帧(停止增长的帧) for kf in keyframe_list: if kf["scale_value"] == 0.35: end_frame = kf["frame"] break # 把当前对象的数据加入结果 result["text_objects"].append({ "object_name": obj.name, "start_growth_frame": start_frame, "end_growth_frame": end_frame, "all_keyframes": keyframe_list }) else: # 没有动画数据的对象单独记录提示 result["text_objects"].append({ "object_name": obj.name, "note": "该对象没有设置缩放关键帧" }) # 导出JSON到Blender工程目录 output_file = bpy.path.abspath("//text_scale_keyframes.json") with open(output_file, 'w', encoding='utf-8') as f: json.dump(result, f, indent=4, ensure_ascii=False) print(f"数据已导出到: {output_file}")
代码细节说明
- 跳过逐帧操作:直接读取
obj.animation_data下的关键帧数据,完全避免了frame_set带来的性能问题。 - 精准筛选对象:额外判断
obj.type == 'FONT',防止误选非文本对象。 - 兼容近似值:如果关键帧的缩放值是近似值(比如0.3500001),可以把判断条件改成
abs(kf["scale_value"] - 0.35) < 0.0001来匹配。 - JSON导出路径:默认导出到当前Blender工程所在目录,你可以修改
output_file的值自定义路径。
内容的提问来源于stack exchange,提问作者Kamran Maharramli
相关产品推荐
相关产品推荐

