Pre-submission checklist
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:
- Constraint relay — a hidden biped copied onto the animal with VRChat constraints. Works in
ChilloutVR today.
- Unity-constraint rig — the same idea using Unity's own constraints. Works, essentially
untouched.
- 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:
CVRIKAngleLimit — axis, limit, twistLimit, matching FinalIK RotationLimitAngle
CVRIKHingeLimit — axis, 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.
Pre-submission checklist
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:
ChilloutVR today.
untouched.
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.cssays outright that the player loop isreordered so "FinalIK, DynBone, Magica Cloth, ect" run before Constraints. And the CCK already
ships author-facing wrappers over FinalIK's rotation limits:
CVRIKAngleLimit—axis,limit,twistLimit, matching FinalIKRotationLimitAngleCVRIKHingeLimit—axis,useLimits,minAngle,maxAngle, matching FinalIKRotationLimitHingeSo 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.VRIKRootMotion.FinalIK.LimbIKRootMotion.FinalIK.FullBodyBipedIKRootMotion.FinalIK.AimIK,CCDIK,FABRIK,FABRIKRootRootMotion.FinalIK.RotationLimitAngle/Hinge/Polygonal/SplineRootMotion.FinalIK.TwistRelaxerRootMotion.FinalIK.IKExecutionOrderEither 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:
solver count per avatar, or having these count heavily toward the performance rank, both seem
reasonable to me.
skeleton while yours poses the humanoid one, so they shouldn't fight — but that's exactly the
case worth testing before committing to it.
VRIKplus the fourRotationLimit*types would cover theproxy-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.