Skip to content

[CCK Feature Request] Whitelist FinalIK components (or add CVR equivalents) so proxy-rigged quadruped avatars work. #2115

Description

@MrTactical

Pre-submission checklist

  • I checked that there is no other Feature Request describing my wish.
  • I checked that this feature is, in fact, not supported.
  • I accept that this issue may be closed if any of the above are found to be untrue.

What should be possible that currently is not

Quadruped avatars that are rigged with a FinalIK proxy skeleton should survive upload and be
posed in game.

Unity has no quadruped rig, so every quadruped is a humanoid skeleton driving an animal-shaped
one by some trick. I've converted and dissected three of them, and there are three designs in
the wild:

  1. Constraint relay — a hidden biped copied onto the animal with VRChat constraints. Works in
    ChilloutVR today.
  2. Unity-constraint rig — the same idea using Unity's own constraints. Works, essentially
    untouched.
  3. FinalIK proxy — the humanoid bones are mapped into a VRIK proxy skeleton, and the visible
    body is posed by the IK solver. Mapped bones sit under paths like .../VRIK/PROXY_*.

Design 3 is the one that doesn't work. The solver that poses the visible body isn't there after
upload, so the animal geometry is never driven — the avatar loads, passes every internal check
against its humanoid skeleton, and stands there unposed.

What makes this feel worth asking for rather than a big lift: FinalIK is already in the client.
CVR.CCK/Scripts/Editor/Hacks/PlayerLoopTweaks.cs says outright that the player loop is
reordered so "FinalIK, DynBone, Magica Cloth, ect" run before Constraints. And the CCK already
ships author-facing wrappers over FinalIK's rotation limits:

  • CVRIKAngleLimitaxis, limit, twistLimit, matching FinalIK RotationLimitAngle
  • CVRIKHingeLimitaxis, useLimits, minAngle, maxAngle, matching FinalIK
    RotationLimitHinge

So authored IK constraint data is already accepted, and the runtime is already present. The ask
is to extend that pattern to the solver components a proxy rig needs:

  • RootMotion.FinalIK.VRIK
  • RootMotion.FinalIK.LimbIK
  • RootMotion.FinalIK.FullBodyBipedIK
  • RootMotion.FinalIK.AimIK, CCDIK, FABRIK, FABRIKRoot
  • RootMotion.FinalIK.RotationLimitAngle / Hinge / Polygonal / Spline
  • RootMotion.FinalIK.TwistRelaxer
  • RootMotion.FinalIK.IKExecutionOrder

Either as a whitelist addition, or as CVR-branded wrappers in the same style as the two IK limit
components that already exist — whichever fits your security model better.

Other remarks

I want to be upfront about the risks, because I don't think this is free:

  • Performance. An avatar-authored solver runs every frame per avatar in the instance. A cap on
    solver count per avatar, or having these count heavily toward the performance rank, both seem
    reasonable to me.
  • Conflict with the player's own IK. On a proxy rig the authored solver poses the visible
    skeleton while yours poses the humanoid one, so they shouldn't fight — but that's exactly the
    case worth testing before committing to it.
  • If a full whitelist is too broad, VRIK plus the four RotationLimit* types would cover the
    proxy-rig case on its own. The rest are nice-to-have.

I couldn't check the current whitelist from the CCK alone, so apologies if some of these are
already permitted — please read this as "the proxy-rig case doesn't work today" rather than a
claim about specific entries.

Related, and possibly a better fix for a different quadruped problem: hind legs on these rigs are
usually the front rig mirrored, which gives the bones a negative scale. VRChat's constraint solver
corrects a constraint result for negative scale; Unity's constraints don't, and as far as I can
tell ChilloutVR ships no constraint type that does either — so mirrored relays land reflected in
game with no authoring-side fix available. A constraint type that handles negative scale would fix
a whole class of quadruped without touching IK at all. Happy to open that separately if it's
useful.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions