In "lock both" mode, spine scrunching pathologically overbends the neck
complete
knah
Obviously bending the spine is required to have both head and hips match tracker positions, but VRIK out of the box uses FABRIK to solve the spine. FABRIK, while working great for long chains with uniform bone lengths (i.e. tails), performs rather poorly on spine rigs - there, it has a nasty tendency to overbend shorter bones, which includes the neck.
One solution for this would be throwing out FABRIK out of spine solver and writing something custom that bends the spine with more sensible limits to avoid overbending any single joint. This would also solve the unwanted ability of FABRIK to elongate the spine by undoing bends that are present in T-pose, though those bends will likely pose difficulties in a custom solver too.
By an extent, avatars with old "inverted hips" rig hack (aka zero length hip bone) similarly suffer from this - FABRIK bends the hip-spine joint arbitrarily due to it being short, and on some avatars the direction is incredibly sensitive to minor changes, hinting at likely numerical instability.
Log In
Kung
complete
The recent IK-Beta's spine rework is now in the live release as of version 2023.3.2
Kung
available in future release
Looks like we no longer use an "Available in Open Beta" Canny tag, but changes to this behavior are now available in the ik-beta
Kung
in progress
Kung
Merged in a post:
[1260] Neck bends too much when spine bends
ghostt
When using "lock both", bending the body IRL over bends the neck in-game, whereas the chest, spine and hip don't bend as much.
In other words, the neck is affected too much by the bending compared to the chest, spine and hip.
Potential ideas:
- Change the "weight" of the neck, making it be less affected by bending.
- Since the hip tracker is not glued to the person's hip (moreso rotating because of skin bending when the person sits down), I suggest making the hip tracker's rotation value "more lenient", sacrificing a bit of rotation accuracy to make the full-body look better.
Towneh
It looks like you can alleviate some of the broken neck symptoms by calibrating with the hmd slightly tilted upwards, and then tilt it back down again, it appears to lengthen the neck enough in a way that prevents it from happening. I have confirmed with at least two others that this workaround is successful for them.
https://cdn.discordapp.com/attachments/946881839400882196/983154004504748032/fbt_neck_workaround.mp4
I had no success in fixing this issue by changing the position and length of either the neck or head bone roots, nor with the avatar descriptor.
Kung
tracked
Franada
If your tracker is place in a way it rotate back when sitting the neck won't do that. I test a little bit and having it center and more lower toward the crotch was the best place. If you hunch when standing, you can calibrate and hunch a little while doing so.
But Yes, at the moment the neck get to much rotation overall. The spine should take most of it and if a upper chest exist, spine and chest should do most of the rotation.
Will see the final decision and find the rig rig setup to follow.
knah
Franada: In my experience placing the hip tracker anywhere on front-center is a big no-no - the belly is soft and the tracker is free to rotate and shift quite a lot. Placing it on the side or the back, where it's mostly supported by the hip bone, usually provides more stable tracking.
Kung
The current spine solution actually doesn't use FABRIK (IK2.0 is very much not "out-of-the-box"). It's true that "Lock-All" will break the most at the neck when the tracked distance between the hip and head is crunched.
During development I tested on many rigs and iterated on how much different joints absorb this discrepancy. Of course if positional tracking is respected, the angles must compensate somewhere.
The options were:
Spine: (requires too much back-tilt in hip reducing hip tracking fidelity and avatars with skirts basically flip their skirt up when spine is crunched, also many avatars are rigged with near-zero length hips in which case tilting provides no relief to the spine crunch)
Chest: (causes moderate clipping on avatars with detailed clothing or other geometry, also causes a "broken ribs" kind of look)
Upper-chest when available: (causes same issues as chest but even more "broken ribs" look)
Neck: (causes a bad posture slouched look, but at least it seemed the most "human" compared to the other options)
The current spine solution is of course a blend of all of these, keeping all of those drawbacks in mind and prioritizing for the most "human" results whenever possible.
Of course this blend could be changed and I'm very open to feedback on this.
What joint(s) would you prefer absorb more of the discrepancy if the neck tilt is reduced?
MeroFune
Kung: In advance, I don't understand technically how IK works so apologies if I'm asking for the obvious or something stupid.
Is there a way to lower the overall stiffness between bones in the central bone chain? Or equivelantly, split up "excess" angles either equally or in a ratio amongst all bones in the chain?
As it stands the central bone chain in question remains incredibly stiff, giving the appearance of a ramrod straight back in most situations and so excess angles are being absorbed in the shortext bone, the neck (see pic). If the stiffness was lowered throughout the hip->head chain there should be enough degrees of freedom that deformations look more natural.
knah
Kung: FABRIK the pass in VRIK spine solver, not the standalone component. At least based on the bends produced, it looks extremely similar, but I can obviously be mistaken here.
On the topic of "what bend": personally I would prefer a mixed mode ("lock both, but lock head more") where head never drifts, avatar spine is bent to accommodate real spine bend up to a certain angle that still looks decent (or is configurable, perhaps per-avatar), and if that maximum angle is reached, then the hip will drift.
A mode where head and hip are swapped drift-wise can also be a thing.
Would that deserve a separate canny post?
Kung
knah: I'm aware that the VRIK spine solver passes the spine chain twice through a FABRIK solver internally, IK2.0 doesn't do this, but unfortunately I can't go into full specifics of how IK2.0 functions internally.
It sounds like you'd prefer the existing other two lock modes. Both "Lock Head" and "Lock Hip" still allow for bending in the spine while constraining the "locked" end and allowing drift in the other.
I suppose that if discussion shifts to proposed modification to the other two lock modes then that would deserve a separate canny post.
On the topic of "Lock All", allowing drift would somewhat defeat its purpose. I consider it kind of an enthusiast mode where protecting the rig from the harsh reality of the tracking data is at a bare minimum. Within that context I'm still open to feedback and other suggestions on the mode (such as your suggestion not to have FABRIK involved in the spine solver, which is a great suggestion, unfortunately we're already following it!)
Kung
MeroFune: Absorbing angles more equally is what FABRIK (the thing Knah was talking about) is used for. It stands for Forward-And-Backward-Reaching-Inverse-Kinematics and it means that once a chain is solved bone by bone to form a curve from the first to the last, the process reverses solving from the last to the first, incrementally smoothing the angles out over the whole curve.
Unfortunately this can have issues with instability. The same pose in tracking data won't always result in the same set of bone orientations, and in practice it causes the spine to sort of pop around to avoid getting crunched as it quickly switches between different "most efficient" paths depending on the current tracking constraints.
In the example screenshot you shared I get the feeling that you'd prefer it to bend more in the center of the straightest part there (so the chest bone), I'll take this as a point of feedback that maybe the chest could absorb more during "lock all".
In internal testing though, the neck had a much higher range of anatomically possible looking angles than the chest. For example, in your screenshot I'd say your avatar looks like it has bad posture, but doesn't look like it needs an ambulance.
"Lock All" is a tough option to include because if it were provided with more chest angling there would likely be feedback that the ribs look broken and the neck should absorb more instead of the chest.
I'll preface this with, "it's a blend and we're doing our best to make it all look good", but to give a more straightforward request for feedback: If you had to choose one joint in the chain to look broken, which would it be?
knah
Kung: I see, so "Lock All" is meant to be a super strict mode, and two other modes as less-strict ones. Unfortunately as it is right now, the "lock head" mode has extreme hip drift and is not strict at all, and I have little personal interest in hip lock mode. This leaves the strict-but-not-too-much-so space kinda empty.
Regarding possible solutions for spine bend in "lock all" - aside from slathering it with a thick layer of user-configurable options (which sounds normal for an enthusiast mode to me), I'd still try looking into making the spine/chest joint absorb more of the crunch (so "chest" option in your post). It's true that many avatars have spine rigs and weight paints that react poorly to stronger spine bends, but that at least can be solved by avatar creators, whereas inverted/hunched necks never look "human" in my opinion, and occasionally cause issues with NetIK interpolation where things flip 360 degrees for remote players.
As far as zero length hip bone goes, that likely can be solved by virtually moving hip origin to a point between leg bones (or slightly above that) where it would normally be. This would allow IK to work with it as if it was a full length bone, if that matters for any operations
MeroFune
Kung: Thanks for the detailed response, was appreciated to hear more detail about how IK systems work in the back end.
I would agree with Knah that I would prefer more bend in the spine/ chest joint than in the neck. Further, as you said yourself, this option is clearly intended for enthusiasts so giving said users an option to choose what they'd prefer gets bent the most would be ideal.
I feel like this would be especially true in open beta, so other beta testers can see what options are available and come to their own conclusions on which one they prefer.
Kung
knah: I was unaware of the tweening issues for remote players on extreme angles. Thanks for bringing it up. And overall these are great ideas and feedback! Also thanks MeroFune for expressing your preference on neck vs chest.
As far as increasing the overall quantity of enthusiast level configuration. I think that deserves its own canny post. Larger scale user experience and app-feel issues require team discussion, but having upvoted canny posts to point at help cases like the one you're making.
knah
Kung: I created a separate post for this: https://feedback.vrchat.com/vrchat-ik-20/p/provide-in-depth-ik-configuration-options-for-enthusiasts