MotionController Offset? On hand Joint for

I have been playing around with creating a Full body VR IK system and for the most part its working great.
The main issue I am having is in the animation BP I have the Motion controllers affecting the Hand bones but my touch controllers are where the wrists are on the UE4 Mannequin, so I need to offset them to where the hands actually are.
What is the best method of doing that,

1 Like

You could offset the controllers by making them child of a scene component ( for each controller ), and set the offset there.
Haven’t tested, but should work, since I already did something like that using the controllers for the Samsung Odyssey

Its a good Idea but I dont want to affect the core Motion controller BP as I will want to use them for many other things.
Would much prefer to just set it just in the IK mannequin. skeleton
or in the Animation BP.

I did try adding sockets & virtual bones to the skeleton and instead getting the motion controllers to affect them instead of the hands .
but didn’t work

You could try offsetting the position of the motion controllers before passing it to the FABRIK (or other IK) node.

Say that the motion controller should coincide with the palm of the hand but you still want to drive the wrist bone, then you can take the motion controller position, subtract from it a vector which is the inverse of the MotionController Forward Vector multiplied by a the palm-to-wrist distance in your skeleton (say 70 or 80 UU) and use the result to drive the wrist bone’s IK.

Basically you are estimating the wrist position from the controller position and use that one to drive the hand IK instead of using directly the controller position. Give it a try and see if that works for you.

One way is to add simple child scene component (or arrow component) to motion controller component, move it to fit required hand offset and use its location and rotatinon instead of motion controller’s position.

If you don’t want to change BP_MotionController at all, you can add some offset to current motion controller transform by ‘Compose Transforms’ node in blueprint. [A] parameter is an offset, ** is current motion controller transform, [Return Value] is a combined position.

Sorry for the delay…

this is the tutorial I followed
https://www.youtube.com/watch?v=EKR8…0sdMVVjpu9KRUq

I have since tried to fix it with a combination of things with out luck.

I used this to get the hand positions .
http://www.informit.com/articles/art…67093&seqNum=3

I Tried to add both a local and world offset directly to the motion controller variables in my Custom VRIK pawn BP, before they were sent to the animation BP.
Tried to add the same offset toMotion controllers in t the Animation Bp event graph.
Also tried this.

all without luck.

Just to clarify what the issue is again Everything works perfectly except that my Real life touch controllers are where the VR wrists are
and my VR hands are infront of my real life hands by a few inches causing a disconnect and breaking immersion.

Need to find a method of moving the Vr hands back a bit so the align with my real hands without affecting anything else

@AlphaWolF In the AnimBp, define a Float variable called Hand Offset. Give it a default value of -7.0 (but you can try other values). Then alter the EventGraph as shown below. This will have the effect of moving the perceived position of the controllers forward respect to the hand mesh, so your real hands feel to coincide better with the virtual hands.

Thanks vr_Macro
I just tried this and based of the direction this pointed me in I also Tried various other methods using the break transforms/make transforms nodes.
Unfortunately it breaks the whole IK chain and my VR arms are sticking straight out and my motion controllers are disembodied from the wrists.
But I have come to the conclusion that the end effector in the FABRIK solver Im using is the way to solve this as it mentions being able to offset it from the **Location, Rotation, Scale **

" if EffectorLocationSpace is bone, this is the offset from Target Bone to use as target location (can also be set as a Pin on the node)."

https://docs.unrealengine.com/latest…erence/Fabrik/

But right now Im getting the same issue I have with the arms while I trial and error

@AlphaWolF What I shared in #7](MotionController Offset? On hand Joint for - #7 by vr_marco - VR and AR Development - Unreal Engine Forums) above works properly with the setup shown in my IK body tutorial here.

Depending on your specific setup, it may or may not work for you, especially if you have added pick-up of weapons or need to interact precisely with other items in the scene. Keep experimenting with the FABRIK node, it has many more options than it looks like at first sight and many of them are not fully documented. Looking forward to seeing your outcome shared back here.

Thanks again VR_Macro.
I tried again and its working, So I must have botched it the first time around.

But I actually took it to a step further, to really dial in offsets to get my RL hands to be exactly where the UE4 mannequins are.
Will still be fine tuning them but this is pretty close.

forward Vector (-11)
right vector (5)
Left Hand (-5)
up vector (-5)

Anyway here the result if anyone els is looking to do the same

This would all be a ton easier if you just took a base transform and the component transform and combined them…

HandOffsetTransform * ComponentTransform = your final transform

You don’t need all of the breaking and re-combining and you don’t need to offset by the forward vector because the initial HandOffsetTransform is in relative space.

Im all about keeping code simple.
Would you be willing to provide an example of what You mean so that I could view it, I’m a visual learner

See image, that is all there is to it. If you literally only need a position and not the ability to also rotate, you could instead use TransformLocation.

Either method works, the first is more flexible in the end.

https://i.imgur.com/RvrnZlg.png

Edit
One problem with offsetting location in worldspace with the forward vector is that you would also have to adjust by scale if the controllers are scaled down (actor is smaller for WorldToMeters changes). Also your original TransformLocation setup should have worked if the provided motion controller transforms were correct.