Download

[Help] Stumped on VR Independent Hand Animations

This should actually be pretty easy to figure out… But I’m having some trouble trying to determine how to fix my animation Issue.

I set up some nicely working animations for a new set of VR hands, and I have it working great. However, the only problem I’m having is getting them to work independently. I’m using the basic VR Template for 4.14 and I’m working off of the original MotionControllerPawn.

All of the animations are working nicely, but they’re playing on both hands at the same time. So when I squeeze one hand, it’s squeezing the other hand. Is there anything specific in the VR Template that says “Use this animation for this specific hand”?

Do I need to have two seperate motion controllers with their own meshes for each hand? How could I fix this using the same way epic did to create the VR Template?

Everything I see just updates grip states. Which are then just used to control the blendspace. I’ve got my own way to control the blendspaces, but I can’t seem for the life of me figure out how to change it to stop updating both hands at the same time.

I guess it depends on how you call the animation because in the template the hands are actually just one blueprint spawned twice and if I recall, the left hand is flipped to make it left. So they both use the same assets, etc. So when you call an action on either hand you would need to specify which one to call the event on from your pawn. So as you spawn the hands you assign them each to a variable, then you can use those 2 variables to call events on either left or right hands. You have your left controller buttons and stuff call out event to the left hand and same for the right. So you have one set of animations set up on the hand blueprint, and you just call to the correct hand when doing some sort of action, either left or right.

Thanks for the reply! So I guess it’s my fault for not specifying more on the problem at hand. I guess at this point it’s not really about “What” to do, but more so “How”. I understand it well enough to know that I need to call an event from the variable assigned to the hand, but I guess I’m just not sure “How”. I’ve been playing with it for a while and experimenting, but I haven’t got anywhere far. Any chance we could elaborate more on how I would need to specify which one to call the event on from my pawn like you said?

Here’s a picture of my Hands Anim BP. I’m casting to my MotionControllerPawn where my input controls are located to get their axis’s for the blendspace.

3fc6ba79fb39043c056b3c8388bbb24185169f8c.png

And then my Blendspaces in my AnimGraph
c38d6fa9eb9ac921d9c986da857d499d0ea9482a.png

Here’s a snap of my MotionControllerPawn. These are casted to from my animBP. The Animation Only axis’s do things like animate the finger and them for when you’re touching the controller or not. (Oculus Touch finger sensing)
308e2f6ea7e569f0b3d4ab5e027bdedae60965ab.jpeg

Like I said before, my animations are working perfectly. But I have no clue how to cast to them for each individual hand. :frowning: Just need a little help on the “How”.

Ok, yeah sorry, I kinda mention in my previous post what’s probably wrong but couldn’t mention any possible fix. But the main takeaway from that would be how you target the 2 hands, through the left, right variables. You can see them in your last shot you posted there, the ones Epic already created. Those are the key to making this work.

So… How to fix your setup…

From what I can see, I’ll try describe what SHOULD fix the problem. I emphasize should because even though I know what to do, it’s hard to just say 100% for sure, just based on some shots and going from memory, you know… :slight_smile:

Anyway, starting with the anim blueprint. for that I’d probably at least just rename those variables like LeftFingerDown, to FingerDown, just for clarity since you won’t distinguish hands in there. It’s basically just neutral.

So then, where you cast to the pawn in there, you need to get and then cast to the owning actor, (I think that’s what it’s called, sorry doing this from memory). The point is you don’t cast to the pawn, you cast to the hand. The hand ultimately controls it’s own animations, not the pawn. The pawn will feed a value to the hand blueprint, the hand blueprint will feed a value to it’s anim blueprint.

So because you’re driving animation from the hand you need to set those variables in the hand blueprint, the variables you’re using to drive the Target value for the FInterp. So you’d have those variables inside the hand in stead of the pawn, and then some custom events to set each value separately. So that’s very simple, a custom event, with a float value added, hooked into the variable to set it. The custom events are not called from tick or anything, they just sit there and you will call them from the pawn side and feed the actual float value from there.

With all that said, you can set up the pawn by using the Left Controller, Right Controller variables, based on which input you’re using. So lets say for right input events, use the Right Controller variable and call the appropriate custom event on the hand, and send that axis value through. While the hand’s anim blueprint gets that value from the hand, the pawn is modifying that value… make sense?. So because you’re targeting a specific “actor” that you spawned, only that actor will play that animation. So that’s why it’s key to have those 2 specific variables for left and right hand on the pawn.

So, based on your current setup, this is the idea to make it work. There are other ways as always, to create this whole thing, but I’m not gonna get into that. What’s there should work given the right changes. I hope I did’t forget anything. It’s always harder to type out what to do in stead of doing it, since you can’t catch possible problems when you just type it. But I think the idea there should come across even if there’s some things I forgot.

Hope this all makes sense. I know it can be a little confusing to try and read through how to do things by text, but I hope it makes sense for you. If not, I’ll try again… :slight_smile:

Well, if it wasn’t for you I’d still be stumbling around trying to figure this out. Even though the answer was right in front of me the whole time. haha. I really appreciate you helping me and taking the time to explain this to me.

With that said, I have the working solution. I’m sure there’s 1000 different ways that anyone could have done this, but this is the method I came up with. .

1: Inside of my BP_MotionCOntroller I made 4 Variables. These 4 variables are NOT connected to anything at all. They are simply just sitting inside of my BP_MotionController. They are not connected to any nodes whatsoever.

2: I then made my InputAxisMapping Control layout inside of my MotionControllerPawn. These are setting the values of my 4 variables inside of my BP_MotionController. So I’m setting the values of the variables inside my MotionController, from my pawn.
e84933fe3b7b3c44977e2961633d0ec38e61acd9.png

3: Then I simply cast to the MotionController where my variables are, and use them to adjust the new variables I made for my blendspaces.
61be280c758d0d719261c84bfda67bacd229649a.png
1779e0b545324ad897acc9ec884e7c52f1b2fa59.png

I don’t know if there’s a better way or not, but this way works just fine.