You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:45:16