So you’re guess was correct. The hand objects use physics to move and I am using physics to move the character object. The hand objects are children of the character object and lag behind due to a physics issue. Do you have any advice on how to fix this? I know this isn’t a vrik issue just asking in case its come up before.
Hey, @Partel-Lang , first time posting on this thread, but I’ve had FinalIK for a while now.
I am trying to use VRIK to allow users to pose characters on the 2D desktop mode, AND embody them in VR.
To do this, I am switching the solver targets between the VR controllers and movable 3D objects in the scene.
The problem is, when I scale the character up or down, the IK gets all messed up and the character gets stretched in all directions. These 3D objects are parented to the character so they all move together.
Any ideas about how I would fix this?
This problem doesn’t occur when using the FullBodyBipedIK script in the same way. I’m just using VRIK so I can easily switch between the two targets.
I hope this makes sense! Any help would be greatly appreciated!
Hey,
If they’re all Humanoid, then I’d use HumanPoseHandler for that:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using RootMotion.FinalIK;
public class PoseHandler : MonoBehaviour {
public VRIK ik;
[Tooltip("Copy Pose From")] public Animator copy;
[Tooltip("Paste Pose To")] public Animator paste;
private HumanPose pose = new HumanPose();
private HumanPoseHandler copyHandler;
private HumanPoseHandler pasteHandler;
private void Start()
{
// Construct handlers
copyHandler = new HumanPoseHandler(copy.avatar, copy.transform);
pasteHandler = new HumanPoseHandler(paste.avatar, paste.transform);
// Register to get a call from VRIK after every time it updates
ik.solver.OnPostUpdate += AfterVRIKUpdate;
}
// Called by VRIK
void AfterVRIKUpdate()
{
// Copy
copyHandler.GetHumanPose(ref pose);
// Paste
pasteHandler.SetHumanPose(ref pose);
}
}
Hey,
So don’t use MovePosition to move your character controller, instead calculate the desired velocity and use AddForce() with ForceMode.VelocityChange to apply it to the Rigidbody. Something like this (in FixedUpdate):
Vector3 targetVelocity = GetInputVelocity(); // GetInputVelocity should return the desired velocity vector based on thumbstick input.
targetVelocity.y = rigidbody.velocity.y; // Use that to maintain gravity
Vector3 acceleration = targetVelocity - rigidbody.velocity;
rigidbody.AddForce(acceleration, ForceMode.VelocityChange);
Then, all you need to do is apply the exact same acceleration to the hands:
leftHandR.AddForce(acceleration, ForceMode.VelocityChange);
rightHandR.AddForce(acceleration, ForceMode.VelocityChange);
Hey,
VRIK has the “Scale” parameter (under “Solver”) for precisely that purpose. Use scale 1 for normal human-sized characters. If you scale them down by half, set Scale to 0.5.
Cheers,
Pärtel
Thanks for the reply!
What is “normal human size” though? Just their starting scale? Different characters have different starting scales that I have to manually adjust to being the correct height for my app. But you’re saying I just adjust that value up or down depending on the change in percentage from 100%?
Thanks!
It’s unitless, so normal human size is the size you originally tweaked all the parameters for. So consider that a 100%. If you want a 50% smaller character to behave the same way as that original one, set its scale to 0.5.
Best,
Pärtel
Got it, thanks!
I also noticed that FBIK Does a pretty good job of detecting the correct humanoid bones, even if the rigged model doesn’t have a humanoid avatar set up. Is this something that could also be done with VRIK?
I am importing characters at runtime using Trilib 2, but sometimes it doesn’t detect the humanoid avatar, despite it being one.
Hi. I have setup that is pretty much like mentioned here :
My problem is when using Grounder Full Body Biped paired with that and when the pelvis gets lowered the aim position seems to remain in the non-lowered position resulting in awkward aiming position. Is there anything I can do to counter this?
Hey,
I always thought FBBIK doesn’t do a really good job at finding the bones, which is why I didn’t add it to VRIK. VRIK uses a different set of references, but if you import this little patch, you can have FBBIK references autodetect them and copy them over to VRIK refs like so>
public VRIK ik;
private void Awake()
{
BipedReferences bR = new BipedReferences();
BipedReferences.AutoDetectReferences(ref bR, transform, BipedReferences.AutoDetectParams.Default);
ik.references = new VRIK.References(bR);
ik.GuessHandOrientations();
}
Hey,
The problem is with the update order of things. You’ll need FBBIK solved first (for grounding), then AimIK and then another IK pass to put the left arm back on the gun (only if you have included arm bones in AimIK). It would be a waste to use a FBBIK pass only for the left arm, so better to do that with LimbIK.
Here, grab this package, I made an example scene for you (also updated SecondHandOnGun.cs to support grounder).
But see if you can use only the spine bones in AimIK. If so, you can just remove LimbIK and SecondHandOnGun and keep things nice and simple.
Best,
Pärtel
Partel-
As always your asset and help has been invaluable while developing our sports game. I have a question, we are using LookAtIK to have the defensive player look at their assigned player to cover and we want the offensive player to look in the direction of their turn. Is there a good way to achieve this without turning the offensive player’s body and throwing off our custom character animator controller that uses player orientation to determine a normalized direction?
Hey,
You could set the offsensive player’s LookAtIK target like this:
float lookDistance = 10f;
float lookHeight = 1.5f;
ik.solver.IKPosition = ik.transform.position + Quaternion.AngleAxis(turnAngle, Vector3.up) * ik.transform.forward * lookDistance + Vector3.up * lookHeight;
But a more efficient way of doing pretty much the same thing would be to just add some world space rotation offset to some of the spine bones:
public Transform[] spine;
void LateUpdate() {
float boneAngle = turnAngle / spine.Length;
foreach (Transform spineBone in spine) {
spineBone.rotation = Quaternion.AngleAxis(boneAngle, Vector3.up) * spineBone.rotation;
}
}
Best,
Pärtel
This is very specific to my game and honestly bad setup on my part so no problem if this isn’t doable. I was wondering if I could move the gameobject with VRIK attached through thumbstick?
My setup is my xrRig and my characterPrefab (characterPrefab with vrik) are two different gameobjects. The characterPrefab has a rigidbody and capsule collider as well reference to the xrRig head and hands in the vrik. I was previously moving the characterPrefab through thumbstick but since attaching vrik realize that vrik overrides my thumbstick movement. Is there a way for my thumbstick to continue to effect the movement of the characterPrefab (through rigidbody movement)?
Hey,
Please update Final IK, just released a new version a couple of days ago. Take a look at the “VRIK (Animated Locomotion)” demo. In that demo you can move around with WASD. It’s not a rigidbody, but it might as well be one. Basically you’d need the same kind of setup - VRController in that demo should be your xrRig with the thumbstick input and head and hand targets parented to it and the avatar next to it (can also be parented to the VRController).
Best,
Pärtel
Hi Partel and thank you for the incredible IK System!!!
I am setting up some custom codes to implement the system in my game and I am stuck on this issue:
This code works fine :
ArmIKComponent.solver.arm.shoulderRotationWeight = 0;
but this doesn’t:
ArmIKComponent.solver.arm.positionWeight = 0;
Does anyone know how I can make this work? I am trying to affect the “ArmIK”
Thank you!
Rispat
Hey,
It’s a bit confusing, because ArmIK’s solver is actually just VRIK’s arm solver so IKSolverArm is basically like a wrapper for IKSolverVRArm.
Use armIKComponent.solver.positionWeight/rotationWeight, that overrides solver.arm position and rotation weights.
Best,
Pärtel
Hello there, so after updating Final IK And Puppetmaster, I am getting a lot of ambiguous code errors between Puppetmaster and Final IK. Anything I should have done before updating?
All of the errors derive from this:
Assets\Plugins\RootMotion\Shared Scripts\PropertyAttributes.cs(71,15): error CS0101: The namespace ‘RootMotion’ already contains a definition for ‘LargeHeader’
*SOLVED - Jus had to delete the Large Header and Lager Header Drawer.cs files. But a bit weird i think
Hello, I was hoping you could make the animator in VRIK.cs a public variable. My setup involves the gameobject with the animator attached being a different gameobject than the one with the VRIK attached. This used to work but now throws an error (“VRIK cannot find Animator on the VRIK root gameobject”).
Hey,
Yeah, always best to delete the old version before updating assets. Otherwise you’ll keep the files that I’ve deleted.
Hey,
I see, I’ll make these changes to IKSolverVR.cs:

Cheers,
Pärtel
Hi. I still have my old extended VRIK driver in my car project and i want to reactivate.
Is there a “fast” way to snap Unitys Gawain charakter to on it?
Only searching for a quick adwise.
Hi Partel ![]()
Thank you for helping me with the coding. I am so excited to see my main character coming to life.
I have a new question (issue). I am using a very basic code to make certain objects attached to the player. In order to get those objects to follow the player’s motion and positioning, I set them to follow the transform of the player’s bones. NOT as children but as unparented objects.
The issue is that they won’t follow the bones after the IK takes over. They look like they are remaining in the original position of the bones.
Is there a way to fix that?
Thank you!
Hi,
I have bought your great plugin, but I can make the interaction system work.
My OS is win10, Unity version is 2020.3.
My procedures:
- I add Dummy Ragdoll (Configurable Joints), a plane (as ground), a sphere (to be interacted with) to the scene.
- Add Full body biped IK to Dummy, changes nothing, it works perfectly.
- Add Interaction System to Dummy, changes nothing
- Pose sphere to a proper position and adjust its size.
- Add Interaction Object to the sphere, add 1 weight curve. Nothing else changes
- Add sphere to Interaction System Test GUI, which is attached to Dummy.
- Add effector in Interaction System Test GUI
In play mode, the button “Start Interaction With Sphere” shows, but the Dummy does not move at all.
Pretty much the standard procedures if I understand correctly. But it just not work.
Can you help me with this? maybe I miss something?
Besides, the Character interaction demo (FINAL IK - Character to character interaction with FBIK - YouTube) is really cool, is there a tutorial for this? Thanks!