Keyframer Comp
Thank you for sharing this one
Your welcome Achim, I figured it was just too useful to not shareâŚ
This is awesome Keith! Is there a way to lock the offset to current frame. I see you have SHIFT to lock off Y axis. Would be nice to lock X as well?
Thanks guys. @Jarrett actually shift does lock to offset frame while ctrl-shift locks to offset value.
wow! well done - this looks very clean a much needed upgrade for integrating this workflow into UI/frontends.
Thanks @lucasm, @daniel.dalfovo . Check back in over the next bit, I realized I forgot to copy and pasting of keys so Iâm adding that as well as few other additional features having a unique color per channel (that you can quickly edit), duplicate channels etcâŚ
I like that it is purely a panel and easier to integrate into other panels (vs a pane).
Minor thing: There is a new-ish widget called contextPath (soon to be renamed to something like operatorPath) that you can use to replace the squished up text string for Anim COMP - it may be better for switching paths.
Small RFE: could you make a top level parameter for fontface
Small issues:
- drop down menus at wrong scale if dpi scale is not at 100%
- there are a bunch of nodes in error or warning state that âpolluteâ any error DAT based issue logging
And a question:
Where is the keyframe data stored ? Iâm asking because I always had a workflow in mind where the first and last keyframes of an animation sequence can be shared between multiple âsequencesâ.
@Achim thanks for the feedback.
You can currently change the font and or any text parameter in Keyframer/view/textSet but yeah I could float some of the more important Pars such a Font and Font Color (line thickness etcâŚ) up to custom Pars on the comp easily enough.
Dropdown wrong DPI scale is a quick fix.
Yeah Iâve been procrastinating removing all those broken file path expressions. That point to actual source files on my computer (or anyoneâs who has is working within Vision/Vision Library). Since they werenât actually displaying full errorâs on the node itself (only when viewing the par( or by the sounds of in an errorDATâŚ) it wasnât a on the forefront of my mind. Iâll write a script to find them all and change them to constant valuesâŚ
Regarding keyframe data, itâs not stored. All the keyframe data is in the keys tableDATs in the current AnimationComp. On an earlier iteration I was storing values but it got too cumbersome making sure two sets of data were always being updated in sync⌠Iâm hoping that Derivative will be open to a new way of updating the keyframeCHOP (such as pushing/copying a Numpy array directly into the CHOP) so we could lose the DATs altogether.
All that being said, you can still access keyframe values easily via Python:
# get first key frame (first key of the first segment)
x = op.Keyframer.Channels['myChan'].segments[0].x0
# get first key value (first key of the first segment)
y = op.Keyframer.Channels['myChan'].segments[0].y0
n = op.Keyframer.Channels['myChan'].numSegments
# last key frame (end key of the last segment)
x = op.Keyframer.Channels['myChan'].segments[n-1].x1
# last key value (end key of the last segment)
y = op.Keyframer.Channels['myChan'].segments[n-1].y1
# other attributes are .inslope, .inaccel, .outslope, .outaccel
# in / out refers to a "segment's" in and out handles (start/end) not a "key's" in
# and out handles, if you want get the in and out slope of given key use:
keyInSlope = op.Keyframer.Channels['myChan'].segments[i].inslope
keyOutSlope = op.Keyframer.Channels['myChan'].segments[i-1].outslope
Long story short in my first iteration I started with a âkeysâ based approach but it go way too convoluted since handle type segments need 4 points.
I was thinking making a new list called âkeysâ that contains a list of âkeyâ objects that simply refer to a given âkeyâs valuesâ like the keys Dat but currently under the hood it isnât really needed. Also you can directly see the issue with of using a âkeyâ as a base data type by looking at a keys tableDAT of any animationCOMP with the last key having handles. Notice the last inslope/inaccel cells contain the values of the last keyâs outslope/outaccel⌠It was much easier to work with segments, then they can have any number of points without needing to have any information about the previous or next segments, but now that that infrastructure is built based on segments, adding a âkeysâ list of âkeyâ objects to access/modify a âkeyâs in/outâ will be simple.
I havenât done these references outside of the extension but it should be fine as long as:
- the extension is initialized
- the channel exists in the connected animationCOMP
Thanks for the tip @greg! Since that current widget is already hooked up setting the value and updating view in particular way I donât want to swap it out at this time but I can disable the label which will effectively have the same result!
Thanks for all the info. Iâll look into it asap
exactly what we need! BRAVO!
when a default bezier is added the default handles areâŚ,how would I say âŚtangent?(smooth curve), but once i break that relationship(by trying other keyframe types) i see no way to set it back to default bezier handles smooth relationship? its always a sharp break at keyframe even on bezier) I might be missing something that was in the vid or notes.
excellent work!
@cod65 I think what your referring to is locking handles. Yes by default I unlock handles when two different function types are beside each other but if you switch back to Bezier (or another handle type) I donât automatically lock the handles again but you can manually toggle lock handles on and off with ctrl-t keyboard shortcut
yes!, thks.
Blockquote
think what your referring to is locking handles. Yes by default I unlock handles when two different function types are beside each other but if you switch back to Bezier (or another handle type) I donât automatically lock the handles again but you can manually toggle lock handles on and off with ctrl-t keyboard shortcut
Blockquote
Iâd imagine this is probably a big hit to performance, but how about a way to visualize where on the curve the âplayheadâ input is?
Thatâs interesting, do you mean like a dot that runs along the curve? I do have a (thin) time bar that shows where the playhead is but itâs be it a bit limited functionality for now, ie. you canât grab it and scrub it. Itâs also bit too thin and transparent I noticed.
Running a dot along each curve is interesting, Iâm actually refactoring how the geometry is setup right now which should gain a significant performance improvement, so I imagine it would be too much of an additional hit.