Handles fix themselves if I do sth, like dragging just one of them. Seems like the api is so low-level that setting keyframes that way doesn't let some callback for interpolation to be called. Here is the python script:
import bpy, re, sys obj = bpy.context.active_object obj.animation_data_create() obj.animation_data.action = bpy.data.actions.new(name="MyAction") fcu_x = obj.animation_data.action.fcurves.new(data_path="location", index=0) fcu_y = obj.animation_data.action.fcurves.new(data_path="location", index=1) fcu_z = obj.animation_data.action.fcurves.new(data_path="location", index=2) f = open(".../example", "r") for i in range(30): print(str(i)) ln = f.readline() try: vec = [float(m) for m in re.split(r"[ \t\n]", ln)[:-1]] except ValueError: sys.stderr.write("ERROR") fcu_x.keyframe_points.add(1) fcu_x.keyframe_points[i].co = 24*vec, vec fcu_y.keyframe_points.add(1) fcu_y.keyframe_points[i].co = 24*vec, vec fcu_z.keyframe_points.add(1) fcu_z.keyframe_points[i].co = 24*vec, vec
Here I parse a file string-by-string (3 coords + time in sec) and create corresponding location keyframes. I need to create animation in real-time and play it simultaneously, so moving the animated object and setting keyframes based on its real position is out of the question.
I could change the interpolation manually after each frame adding (for Blender to recalculate every handle each time), but I'm afraid that when the number of keyframes is in the thousands, it'll take too long.
Is there a way to set and calculate the interpolation for only the last keyframe point when adding it?