Gesture layers will motorcycle pose any masked humanoid parts that are not currently being animated, whenever any animation clip is active in the gesture playable layer
BananasaurusRex
Masked layers in the gesture playable layer will always control the masked parts if any animation is active in the entire gesture playable layer. For instance, if 'desktop arm control' has been set up in a layer masked for an arm but is not currently in use, and a gesture is used that activates a hand pose in the "Left Hand" or "Right Hand" layers, the arm will motorcycle pose. This is the case even though the layer playing an animation is only masked for a hand, and the 'arm control' layer is only masked for the arm.
The issue is not apparent with the default left and right hand layers because the hands are always animated. However, features like 'desktop arm control' are only active when in use, and you would otherwise want the locomotion animations to take back control of the affected parts.
The issue is compounded further by the well-known unity bug related to empty states (no animation clip) when using write defaults off. Since an empty state is not possible without causing other issues, if you try to use the common workaround of a 'placeholder' animation that animates a fake property, this too will cause the bug because an animation clip is active. With write defaults on, an empty state can be used which does not trigger the bug. However the arm would still of course motorcycle pose when an animation clip becomes active in any other layer.
Setting up layers for things like 'desktop arm control' can be done successfully in the locomotion playable layer with additional masked layers when using write defaults on. This workaround is possible only because of the ability to use empty states, allowing the base locomotion layer to take back control when lower layers (e.g. arm control layers) are only writing defaults.
Log In
Franada
Hello sir, have you heard the good word of our lord and savior Additive Layer.
BananasaurusRex
Franada: The additive layer is for small adjustments, like the breathing animation in the example additive controller. Even if you set your layers inside to override they are forced to additive by the SDK, meaning they get added on top of your locomotion animations.
If you try to put an animation there that's anything other than subtle, you'll get weird results. See the image below, which is what my working desktop arm control pose looks like when it's in the additive layer. The arm is supposed to be straight.
I do wish it worked for this because it would be an easy enough workaround, considering most people usually have nothing else in there. But sadly it's neither the right place nor a viable workaround for this kind of animation.
Franada
BananasaurusRex: Are you sure it force to additive, because I change my root.t y to -1 to sink in the floor and that work with overwrite.
If I set the layer to additive, yes it won't go down. https://gyazo.com/8c350f439ef15f77ccb51bbeb6bb3d05
BananasaurusRex
Franada: The docs say "The Additive [playable] layer is special because it is always set to 'Additive' blending". I figured that was all there was to it but you got me thinking, so I did a bit of testing and research. It wasn't something I understood fully but I think I get exactly how VRChat's implementation works now. Bit of a wall of text incoming, sorry.
Normally in unity, the additive blending mode works in a very specific way. Frame 0 is the 'reference pose' and then the difference between frame 0 and frame 1 is what will be "added". So for example, let's say you take a t pose animation, then on frame 1 you raise the arm up by 0.6 from what it was on frame 0. The result will be an addition of 0.6 to "Right Arm Up-Down" on top of the previous layers. For longer animations, each additional frame will be compared to frame 0 with the difference being added in the same way. If you try to use additive blending with just a 1 frame animation, it will not work. There is no reference pose and second frame to compare, so nothing will happen.
With the VRChat additive playable layer it's a bit different. If you set the layer blending to "additive", it will work in the classical way as described above. However if you leave it on override (but still inside the additive
playable
layer), VRChat's implementation is an exception to the rule and instead of just
overriding any same properties, it adds
the entire value in each keyframe to your other animations. So in other words, if frame 0 of your additive t-pose clip has "Right Arm Down-Up 0.3" and frame 1 has "Right Arm Down-Up 0.9" - instead of adding the difference
of those two frames (0.6), it will instead just add the entire value of the property (on whatever frame it's currently on) to your locomotion animations. So if it was on frame 1 it would add a full 0.9 to the locomotion animation's value.As a small side note, I also found that for some reason I couldn't get an additive animation that
only
has Root T in it to work. If I added keyframes for any muscle (even if they didn't change on frames 0 and 1), then additive blending of the Root T y change would work. I know this was a pretty long comment but it is a weirdly confusing subject and I wanted to get to the bottom of it. Hopefully you find this information helpful too. The moral of the story is that you
could
get something like desktop arm control to work in additive but you would need to carefully set it up so it combines with the existing arm position in locomotion for the desired end result, and ultimately it would be a lot easier to just use full override with a second masked locomotion layer for that use case.Franada
BananasaurusRex: Ah yes. Not sure how it make sense, but it need another humanoid value change to make the Root T to work. I use the jaw.
The definition on the vrchat website is soo bad. They just have to say:
Add or subtract the value on top of the locomotion animation if set to overwrite.
Example, spread the arm on the side if the character is fat to prevent them to clip in the body.
The character in the link use this so the hands don't clip in the pants.
Franada
BananasaurusRex: here my locomotion prefab. I could try to integrate arm puppet to it maybe and see if I get issue.
ksivl
Example: in a gesture controller including a left hand layer, a right hand layer, and a two-axis 'desktop arm puppet'-toggle layer, activating any gesture other than 0 motorcycle poses the arm even though the respective hand layer's mask is only masked to the hand. (The arm puppet is masked only to the arm, and the topmost layer ("AllParts") masks the arm and both hands.) This specific example may occur with both WD on or WD off workflow.