Holy crap, I'm starting to understand something here and making things work ?
This looks so promising, time to play ? ?
This looks so promising, time to play ? ?
-Solve the "state arrival" issue. As IdlePoser was designed, the transition between states is such that the controllers deaccelerate when arriving at a state, then accelerate again to leave that state. Think about it as an airplane arriving at the airport, stopping by, and then launching in order to travel to the next stop. This makes it so AnimationPoser is yet not the best tool to make animations like walking cycles, since the person is constantly stopping at the states, instead of going directly through it, like in the keyframes of VamTimeline. What looks more like keyframes are the "control points" of IdlePoser: the controllers don't stop by at these control point states, only go directly through it. However, the number of control points is limited to 4 in IdlePoser (and AnimationPoser). A solution could be that, every time you arrive at a state, the next N (say, N=4) states are sorted (which is entirely possible in advance) and then properly interpolated. When arriving at the next state, the list is updated and the last interpolation curve is averaged with the new one. A user-adjustable parameter could control how much the animation should "stick" to that state (in other words, how much that state should behave as a regular state instead of a control state). With that change, the code relating to control states could be removed, as it would not be necessary anymore. With this, VamTimeline animations would probably be able to be seamlessly imported into AnimationPoser.
Do you happen to know what interpolation method is used in VamTimeline? It would be interesting to have cross-compatibility.
Version 3.1 is sort of an emergency update. A lot of people have been facing issues with version 2. If you were unable to use the plugin before, please give it a try now.
Version 3 in general is a huge step forward. It will implement my original vision for the plugin. Version 1 was a sort of compromise: I wanted to repurpose IdlePoser for animation, but changing it as little as possible. After the repercussions, I have decided to truly separate AnimationPoser from IdlePoser and turn...
@staticmethod
def smooth_step(a, b, d, t):
d = max(d, 0.01)
t = clamp(t, 0, d) # for float
t = np.clip(t, 0, d) # for array
if a + b > 1: # Safety control
scale = 1 / (a + b)
a *= scale
b *= scale
n = d - 0.5 * (a + b)
s = d - t
if t < a:
return (a - 0.5 * t) * (t / a) ** 3 / n
elif s >= b:
return (t - 0.5 * a) / n
else:
return (0.5 * s - b) * (s / b) ** 3 / n + 1.
@staticmethod
def smooth_array(a, b, samples=1000):
# Sweet spot 1000 to 10000, 50 to 200 us
t = np.linspace(0, 1, samples)
n = 1 - 0.5 * (a + b)
s = t[::-1]
aa = int(a * samples)
bb = int(b * samples)
t[:aa] = (a - 0.5 * t[:aa]) * (t[:aa] / a) ** 3 / n
t[aa:bb] = (t[aa:bb] - 0.5 * a) / n
t[bb:] = (0.5 * s[bb:] - b) * (s[bb:] / b) ** 3 / n + 1.
return t
BTW, currently, the slowing between transition is the Smooth function and it should not slow down if you put both values to 0s. The current implementation of smoothstep is merging 3 curve segments, and the center curve is just linear.
Sorry for the many posts, but I also had this idea that would really be useful:
Yeah that would be another way to at least randomise it ??@Saint66 I know you want to script the transition durations, but wouldn't a good compromise be to have "minTransitionDuration" and "maxTransitionDuration" and the actual transition duration be randomly chosen between those values? This would be much easier to implement and it would be self contained in the plugin itself.
First of all: there was a huge bug left in version 3.1, which made animations which were saved in a person and loaded in another break. This was fixed.
Cross-animation was a huge conceptual challenge. How to implement it? When a state in a layer in an animation transitions into another state in another layer in another animation that doesn't share the same controllers, what happens? What about the other layers, what are going to be the arrival states?
Worse than all, how to create an UI...
I don't seem to be able to see anything when I move 'example' into the folder. When I hit 'load' it shows empty?Create a folder Saves/PluginData/IdlePoser. Move Examples.idlepose into that folder. Now click the "load" button in the plugin, and there you go.
This is a VERY simple kissing animation, that took like 5 minutes to set up. You can continuously build on top of it.
@Saint66 I just released 3.2! It fixes the bug you mentioned. Now you can load saved animations into other characters.
@Case and @Saint66 This release is huge. Not only you can transition between states in different animations, but also sync the remaining layers. A lot of UI issues were also solved. Things are becoming pretty solid right now. It is the time to start truly building something.
I didn't sleep and have work in a few hours, so tomorrow I will check if there are some obvious bugs. But, from what I could test, the plugin is quite usable with all the new features.
@atani If you liked version 2, give this a check.