Having floating hands really freaks some
people out. Now there are many games that get away with it pretty well. But if you're
like me, I'm the kind of person who likes to be as realistic as possible.
So let's add some arms and a body to our floating hands. All right, just like last
video, I'm going to copy and paste the realistic physics hands tutorial project and rename that to
VR ik upper body and then open up unity hub, Unity just released a 2020 point 3.1 Long Term Support
version. So make sure you go and upgrade to that long term support means it's stable. And
they're going to support this obviously for a while. So this is a good version to update
to All right, now that this is installed, I'm going to go to projects and add that project
that we copied and pasted select folder, and then we're going to upgrade it to the new version and
confirm and there's a few things that we need to do to just upgrade to the newest version. So go
into Edit Project Settings, go to the XR plugin Management and click on the exclamation point
fix all to lock the input that'll fix that. And then let's go to Window package manager and
then make sure you're in Unity registry. And then we're going to scroll down. And anything that
has this little up arrow next to it needs to be updated and XR Interaction Toolkit is actually to
a 1.0 version. So that'll be out of preview very soon. It's technically at a preview now, but it
still has that pre dot three tag at the moment, once you update all of those, we should
be good and set up for the new version. So let's go set up our scene go into the sample
scene that we've set up from the previous project, you're going to have that grabbable cube and table
and I'm just going to delete both of these and the gizmos, I'm going to take the 3d icons down to
very small this player that we set up last time, we're actually not going to use so I'm going to
uncheck it to disable it. But we are going to kind of replicate how the components are inside
of here. So that's why we're leaving it in the project. Instead of just removing it completely,
we're going to come back and use it as a reference. And then let's bring our new character
in. So I'm gonna go to package manager and my assets. And I've already downloaded a speedball
character asset, it's free from the Asset Store, I'll put a link down in the description. So we're
going to import this guy. And of course, any humanoid character will work if you're following
along with me just make sure they're, you know, human light. So we're gonna go in here, grab that,
drag it in, reset it to the center, and then I'm just gonna rename him to character. If we look
inside of this package, you'll see we have a body, which is just the mesh the visual components, so
if we unchecked that you can't see anything. And then we have the this BIP 001 game object. And
if we hold down alt and press the arrow, it'll open up all the trees underneath. And we'll see
that these are all the bones for this character. And we're going to be working with the hands the
head and then eventually the feet when we get to that point, but trying to select the right bone
from the tree and having to like go down and open each tree is kind of annoying and difficult. So
we're going to import an animation rigging package from the package manager, I'm gonna go to unity
registry and then look for animation rigging. And this just recently got a 1.0 version as well.
Unity is finally getting to a place where things are more stable. And it's really exciting for me.
Once that's installed, you'll see this tab up here at the top, and it gives us a few options. So
if we select the character, and then go up to animation rigging and click bone Render Setup, now
we have this like bones skeleton that we can see from the outside of the character. So if we wanted
to select the forearm, now, we can just click on it, and it selects the correct bone for us. And
we don't have to navigate through this whole setup here, which is nice. And from here we can
you know, like you normally would, you can move objects and reposition the character's hands and
whatnot. This is like how you would do animations and all that kind of stuff. You would keyframe
each one and do animations and whatnot. But we want to do inverse kinematics. And then we want
to match the target of the inverse kinematics up to the controllers, then that way, anywhere that
controller goes, that's where we want the hand to go. And wherever the hand is, that's like you know
the angle that the forearm is supposed to be to connect to the shoulder. So we have this kind of
inverse relationship between the hand and all the bones connecting to that hand. So let's collapse
this. And with the character still selected, we're going to go up to animation rigging again
and click rig setup and this will create a rig for us and underneath this rig we're going
to create a left hand inverse kinematic a right hand inverse kinematic and a head inverse
kinematic constraints. So right click and create an empty game object and I'm going to name this
one i k and right and then let's add a component to this and this is going to be a to bone IK
constraint component. And now that tip needs to be the hand. So I'm going to lock the inspector and
then click on the right hand. And that'll select it for us in the hierarchy. So now we can just
click and drag it over to the tip and we could drag it over the forearm, drag it over the upper
arm, create a target, create a hint, go through this whole process, or we could just right click
on the top here and click on auto setup from tip transform. And that will automatically go through
and add the connecting bones. And then it also creates a target and a hint for us underneath this
game object. And all we have to do is line up the target in the hint with where we want them to be.
So click on the target and then hold down SHIFT click on the hand and then animation rigging up
here at the top gives us this cool button where we can just click align, transform, and it'll
reposition that for us. And we can do the same thing for the hint hold down SHIFT click on the
right forearm animation rigging align, transform and then the hint we actually want to be a little
behind the elbow because the hint is telling unity where the elbow should be pointing. So make sure
you're just selecting hint. And then we're gonna go back behind and drag it back a little bit. This
will help if the player rotates their hand, your elbow, you know naturally repositions based on the
rotation and based on the distance from your body, and this will help with orienting the elbow in
the correct way. And now we're gonna do the same thing real quick for the left hand. So right
click, create a new game object IK and left and unlock the inspector and then relock it to bone
IK constraint, let's grab the left hand, drag that over to the tip, right click auto setup from tip
transform, and then we can click on the target, hold Shift click on the left hand animation
rigging align transform, click on the hint hold SHIFT click on the left forearm animation rigging
align transform and then make sure just hint is selected and we can pull this back a little bit.
And let's go ahead and test this before we do I'm going to uncheck the XR rig and uncheck the XR
interactor. Make sure you save because at this point, when I run it, I've had some issues with
it crashing. And I'm not 100% Sure why yet. So just make sure you're saving frequently. And now
if we go back to the inspector, grab that target and move it around, our hands should move nice.
And you'll notice that as I get further away from the hand, it doesn't stretch to meet, it just
kind of points in that direction, which is good. Now let's set up the head. So still inside of
rig right click create a new empty game object, I'm gonna call this one ik head. And instead of
a two bone constraint inside of here, we're gonna have a multi parent constraint, the constraint
object is going to be the head. So let's lock the inspector click on the head that'll select it
for us or there. And then we're going to make a target just like the previous ones, I K ID target.
And just like the previous ones, we're going to select the target, hold down Shift, select
the head, and then animation rigging align, transform. And then let's drag the target over
here into source object. And this is where things get a little interesting. This is where we add in
the physicalized hands along with the character. So the way this is going to work is we're going
to have the mesh hand that is visualized, and that is going to be tracking the target and then the
target is going to be the physical exponent. So the target is going to have the rigid body and all
the colliders and then the target is going to be following the controller using physics. So we have
almost like a three tiered following approach. So we have the mesh hand that you can see. And
then we have the physicalized hand, which is the target. And then we have the actual controller,
which is the actual position of the player's hand. And so all of those are going to be working
together to create a realistic visual and physical effects. So let's go into scripts and take the
hand script and I'm going to drag the hand script onto each and target. And we're gonna go through
and mess with these values in here and delete the animator, because in a video in the not too
distant future, I'm going to do a procedural grip. And that's going to override the last video where
we did the animator stuff. So this procedural grip will be able to grab any object and it'll stop the
fingers whenever it hits the surface. So working on that, but we're just going to disable the
animator for now, because it doesn't really apply to this particular video. So let's open up the
hand script, I'm going to do two things in here, I'm going to go through and comment out all
of the animator stuff. And then we're going to fix the hand tracking a little bit because in
the last video, I was adding the offset in local space instead of worldspace. And that was kind
of creating a weird pivot effect where your hand wouldn't pivot on the correct point. So we're
going to go through and fix that. First, let's comment out all of the animator stuff. So coming
out the require animator component, I'm going to highlight this chunk of animation variables,
press Ctrl, K, and C and then I'll comment out the whole block and then the same thing for
the start method. And then the update method. And then each one of the methods below. There
we go. And then here on line 59. This is where We need to set it to a world position. And in
order to do that, we're going to do a follow target dot transform point. And that'll transform
from a local space to world space. And then we're going to put the position offset inside of that
method. And that should fix the rotation pivot point problem that some of y'all have been
experiencing, make sure to save that we're gonna go into hand controller now. And you'll see
down here in the update method, we no longer have a set grip or Set Trigger method. So I'm going to
comment both of those out as well, at this point, realistically, you could just delete the hand
controller method or not using it at the moment, make sure to save both of those, I'm gonna go
back into unity, we're going to create a new C sharp script, this one's going to be called a
head and head is going to be attached to the IK head target. And let's open this guy up similar
to the hand controllers in this controller, we're going to update the head to follow the head
mounted display that the player has. But we don't want physics to be involved in this, we're just
going to have it instantly update. So we're gonna do that. And then we're also going to update the
whole body rotation based off of the head in this class as well, we're gonna need a few serialized
field variables to transforms a root object, this is going to be the character and then we
need a follow object. And this is going to be the head mounted display. And I can declare both
variables without having to write the line twice by just doing comma the next variable as long as
they're the same type. And then we're gonna do the same thing for a serialize field private
vector three, we're going to have a position offset and a rotation offset, there we go. And
then we're going to need one private variable, this is going to be a private vector three,
and this is going to be a head body offset. And the head body offset can be set inside of
the start method. And that's just going to be the difference from the route object position
and the follow object position. So in this case, I think the actual position of the character is in
the center. And then the follow object position is going to be obviously wherever the head mounted
display is. And so this just accounts for that difference, and will automatically set it for
us. And then we're going to change this update to a late update. And first, we're going to set
up the root object position. So we're going to set the body and that's going to be equal to the
Transform Position, bless the head body offset, and then we're going to do object dot forward is
going to be equal to a vector three dot project on a plane, and then we're going to use the
follow object.up and a vector three. And that's going to be normalized. So this accounts for the
offset between the head mounted display and the body and will essentially set us to the correct
height and then this guy will set the correct rotation for wherever the head is pointing.
That's also where the body is going to be pointed. And now we can set the offsets for the camera. So
let's do transform session is going to be equal to follow object dot transform point, just like we
did over in the hand class. And we're going to put the position offset in here. And then we do the
rotation offset transform rotation is going to be equal to follow object dot rotation multiplied
by a quick carnian EULAR rotation offset, make sure to save and let's go back to Unity and set
up all these values. So inside the head target, the root object is going to be the character the
follow object is going to be the XR rig which we can re enable and the main camera was going to
be the follow object. And then if we go up to the hand targets, we can set the follow up objects
for those so the left hand target follow object is going to be the left hand controller and the right
hand target follow object, it's going to be the right hand controller, make sure to save save,
save, save. And now that the animator has been disabled, we can also remove those from the hand
target. And now all that's left is to run it and let's set the offsets Oh, and we forgot to add
the you know, physicalized hand part. So go into your right hand target and we're going to add a
rigid body make sure to set to interpolate and continuous and don't use gravity. Same thing for
the left hand. And then underneath each of these we can create a new game object and this is going
to be the collider let's add a box collider here, we can resize and reposition that and you
can add as complex colliders as you would like and I'm going to duplicate this and drop
it into the left hand is reset the transform and then reposition that the head body offset auto
setting has given me a little bit of trouble. So we're gonna go back into head so instead of having
this start method here, I'm just going to delete the whole start method and gonna put the head
body offset in with the other serialized vector threes and rename it without the underscore and
now we can manually set it and we won't have any issues. There you have it. Now obviously the
legs look kind of weird just floating around being stiff and straight. So if you want to just
get rid of that As you can find the legs inside of the bone structure and scale those down to zero
so that they disappear and you're just having a torso and arms and hands. In an upcoming
video we're going to work on procedurally walking and having those legs animate. But
for now you're just a floating body,
I want to give a super special shout
out to our newest VIP Patreon. Scott, thanks so much for joining us. And I really
appreciate your support. And to you, Eva, Jane, Tim and Austin, thank you so much for all of
your support. And I'm thinking instead of a live stream this month that we're going to be doing a
private zoom call on this coming Sunday. So be on the lookout on Patreon for that the time details
and the link for that will all be up there. And if you're not part of the VIP tier and want to
get in on a private zoom call with me this Sunday, be sure to sign up on Patreon or if you just
want the source project and all the code that goes with it you can support me on Patreon and
get that as well and free of charge. As usual. I'm always in the comments. So if you ever run
into bugs or issues or improvements or thoughts that you have, be sure to write a comment and
I will respond I respond to every single one. I love hearing from you guys and honestly all of
you thanks so much for the likes, the comments the support, the amount that this channel has
grown in the last month has been absolutely ridiculous. I am so appreciative of all of
you and I will see you in the next video.