(2.5) Is "Show keyframes" being removed completely?

I just asked about a feature from 2.4x in the forums, because I couldn’t find it. I was told it was not in 2.5. Now it seems it is not going to come back, ever. It is “Show keyframes”. For the uninitiated, it means that you can click a button and Blender shows you the path an animated object travels without you having to scrub back and forth in the timeline, kind of like drawing your path on a map with a pen. It shows the individual keyframes. This is very handy for complex animation, because you can see everything an object is doing, has done and will be doing, and compare it to your intentions for the scene.

I found it menioned here. It’s under “Dropped features”, up top. It seems like a too fantastic tool to completely drop, and it does not seem like it would need to be dropped logically as a consequence of the new architecture; it’s a pretty straight forward tool, not tied directly to data architecture AFAIK.

Is it really dead and gone?? Or did I completely misread the documentation (a serious possibility)?

Is that anything like onion-skinning (which I’m pretty sure is in 2.5x)?

Yes, it does seem related to onion-skinning. I am not sure if they are one and the same, though. Since onion-skinning seems to be a Grease Pencil thing, I have my (unfounded) doubts…

Edit: Found something. It seems “Motion paths” for objects and “Ghost” for armatures display keyframe positions quite nicely. Doesn’t seem like I can manipulate them (which would cut any real animation fine-tuning in half or less; I’ll just mosey on over to Blenderstorm…), but they show nicely now :slight_smile:

I once read aligorith saying that he had planned such a feature where you can manipulate the motion path. Not sure if that is still on the radar. I would love having that too. Maya had a plugin for that called “AnimPath” once. It however became quite slow when used on complex hierarchies. I think you can get along with the motion paths not being interactive though, thats what i have been working with for long time.

You can jump to next or previous Keyframe with Ctrl Page Up Ctrl Page Down. It is not very different of Page Up and Page Down select in 2.49.
Motion Paths are updated if automatic keyframes insertion is enabled.

Both posts make me happy :smiley:

I wrote a script once to bake the motion as a path, now I expanded it to auto replace your animation with a follow path constraint, so editing the path will affect your object’s motion.

This is just an experiment, as I can hardly write any code… but it seems to work (so it can be done)
Proportional editing the curve gives some nice results.

It should be modfied to create points only over existing keyframes, but I wouldn’t have a clue about getting the right tangents… give it a try if you feel like.

# This will create a path from your positional animation

import bpy
scene = bpy.context.scene
start = scene.frame_start
end = scene.frame_end
step = 1
actual = scene.frame_current
puntos = list(range(start - 1, end, step))

recorrido = bpy.data.curves.new('recorrido','CURVE')
curva = bpy.data.objects.new('curva',recorrido)
bpy.context.scene.objects.link(curva)
recorrido.dimensions = '3D'
spline = recorrido.splines.new('BEZIER')
spline.bezier_points.add(len(puntos) - 1)

c = 0
ob = bpy.context.object

for n in puntos:
    scene.frame_set(n)
    matrix = ob.matrix_world.copy()
    nodo = spline.bezier_points[c]
    nodo.co = tuple(matrix.translation_part())
    nodo.handle_right_type='VECTOR'
    nodo.handle_left_type='VECTOR'
    c += 1

# This will replace positional animation
# with a FOLLOW_PATH constraint...

action = ob.animation_data.action
for fc in action.fcurves:
    if fc.data_path == 'location':
        start = action.frame_range[0]
        end = action.frame_range[1]
        action.fcurves.remove(fc)

seguir = ob.constraints.new('FOLLOW_PATH')
seguir.target = curva
seguir.use_curve_follow = False
ob.location = [0,0,0]

scene.frame_set(start)
recorrido.eval_time = 0
recorrido.keyframe_insert('eval_time')

scene.frame_set(end)
recorrido.eval_time = 99
recorrido.keyframe_insert('eval_time')

for fc in recorrido.animation_data.action.fcurves:
    for kp in fc.keyframe_points:
        kp.interpolation = 'LINEAR'
        
scene.frame_set(actual)

I very much feel like it! I’m away from my workstation for a few days, but I’ll look at it when I get back!