All Classes Namespaces Functions Variables Enumerations Properties Pages
VRIK

VRIK is a high speed full body solver dedicated to animating VR avatars. The solver was originally developed for the game "Dead and Buried" by Oculus Studios.
A detailed description of the inner workings of VRIK can be found in this article originally published in Oculus Developer Blog.


Getting started:


Performance:

VRIK is about 2-3 times faster than FullBodyBipedIK. In Dead and Buried 2, it was used on 6 avatars simultaneously visible on screen and running on Oculus Quest hardware. Since Final IK v1.9 VRIK has a 3-level LOD system with level 1 providing roughly 30% gain and level 2 solver disabled with only the root position and rotation updated if the built-in locomotion solver was used.


Adding VRIK component in run-time:

void LateUpdate () {
var ik = gameObject.AddComponent<VRIK>();
ik.AutoDetectReferences();
}


Using VRIK with Rotation Limits:

VRIK has its own set of built-in constraints and RotationLimits can not be used in the solving process. It is possible however to apply RotationLimits on top of VRIK for instance to make sure that the hand bones do not bend unnaturally beyond reasonable limits. To do this, we would have to disable the rotation limits in Start to take control of their updating, then update them after VRIK using the VRIK.solver.OnPostUpdate delegate::

public VRIK ik;
public RotationLimit[] rotationLimits;
void Start() {
foreach (RotationLimit limit in rotationLimits) {
limit.enabled = false;
}
ik.solver.OnPostUpdate += AfterVRIK;
}
private void AfterVRIK() {
foreach (RotationLimit limit in rotationLimits) {
limit.Apply();
}
}


Calibration:

VRIK offers 2 calibration methods:


If you only need to calibrate the size of the avatar, it is easiest to do so by having the player stand up straight, then comparing the height of the head target to the height of the avatar's head bone:

float sizeF = (ik.solver.spine.headTarget.position.y - ik.references.root.position.y) / (ik.references.head.position.y - ik.references.root.position.y);
ik.references.root.localScale *= sizeF;


Locomotion

VRIK supports 2 modes of locomotion - Procedural (legacy) and Animated.

Procedural (legacy)

The built-in procedural locomotion was developed in the early days of VR and designed for foot shuffling around a few square meters space. It does not work well for room-scale or thumbstick locomotion as it is not responsive enough and tends to fall behind of the camera when moving fast. Procedural locomotion locks the feet to "footsteps", that will be moved procedurally to make the character catch up to the HMD.

Animated

Animated locomotion module uses a simple 8-directional strafing animation blend tree to make the character follow the horizontal direction towards the HMD by root motion and scripted transformation.
The modulre requires having an enabled Animator with an Animator Controller that is compatible with the module, such as the "VRIK Animated Locomotion" controller (Humanoid) provided in the package. However it does not limit you to use that controller, it can manage any animation setup as long as it has and uses the required Animator parameters:


Extending the Animator Controller


Networking Animated locomotion
When applying Animated locomotion to remote instances of networked avatars, will have to sync the following objects/data:

Horizontal position and rotation of the avatar will be applied by the locomotion module automatically based on the above data.
It is important to interpolate the synced data to ensure VRIK has smooth input velocities.


Component variables:

VRIKComponent.png

Solver variables:

VRIKSolver.png

Spine variables:

VRIKSpine.png

Arm variables:

VRIKArm.png

Leg variables:

VRIKLeg.png

Locomotion variables:

Procedural locomotion variables:

VRIKLocomotionProcedural.png

Animated locomotion variables:

VRIKLocomotionAnimated.png

Script References: