Retime
This started out as a bit of a technical exercise, but I’ve been able to achieve some great results with this process. The idea originated from a bit of frustration with the standard retime method, where I would experience strange results when pushing the speed really low. The concept behind this approach is quite simple and easy to implement. We create paths for the points so that we can move them up and down their paths separately. Not only does this allow for a very smooth retime, but it also lets us influence individual points separately, enabling us to make objects stretch through time.
We start, as usual, by giving our points an @id attribute. We can then perform any kind of movement or simulation we want. It's also important that our point count stays the same, which is great for Vellum. If used with FLIP, make sure reseeding is off.
We then extract all points and use a Trail SOP set to the final frame of the sequence. Next, we use an Add SOP, set to use the @id attribute. Now, for each point, we have a path tracking the transformations.
Now, we need to promote our @id attribute to primitive so that our lines match the points. We can then sort the primitives by their @id. Next, we need a TimeShift SOP to move our proxy transformations to the final frame, which will be used as a reference. From here, we can continue to tweak the lines, whether by resampling or adding noise.
This final step is where we take our original geometry and match the transformations of the lines. We start with a Point Wrangle; the first input is where we assigned the @id, and the second input is our lines on the final frame. In our wrangle, we only need a few lines of VEX, and we're good to go.
vector cont = set(chf("control"), 0, 0);
vector pos = primuv(1,"P", @id,cont);
@P = pos;
All we're doing here is collecting the position attribute at a point along each line’s length. Since our @id attributes all match up, it's super simple to fetch a position and assign it to our original points. If we want to add a kind of time-warp effect, we can include that in the "cont" variable with the chf("control").
And we're good to go! I find this tool super useful and have placed it in an HDA so I can drop it into scenes whenever I need it.