steamvr_unity_plugin icon indicating copy to clipboard operation
steamvr_unity_plugin copied to clipboard

Custom hands show fingers curl when vive users rotate the controller [ANSWERED].

Open guiglass opened this issue 4 years ago • 11 comments

I just downloaded the steamvr_unity_plugin and can clearly see that whenever I roll my hand over the skeleton's fingers appear to move strangely, I think it is intentional but I need to disable this:

This is causing major misalignment with my project, and I have found no way to disable it: https://youtu.be/2nBFGUcjIsI

As seen in this next video, even the Alien floppy hand example provided by Steam you can clearly see that the bending causes undesirable effects, where their custom hand bends unexpectedly when flipped over:

### Clearly This Is A Bug!!!: https://youtu.be/VYil9uY7kds

And I am doing something very similar to the Alien Floppy hands in my game, this is why I have to find some kind of solution to this!!

I see no mention of anything useful in SteamVR_Action_Skeleton or SteamVR_Behaviour_Skeleton. I have no clue where to look next. Who should I ask? Where is this bending even coming from??

Please can some help me figure out a way to disable this?

guiglass avatar Oct 13 '19 07:10 guiglass

Any ideas?

I linked my hands to a proxy mesh same exact way Steam's floppy hand example was done so I am experiencing exact same issue as shown in the Alien floppy hands video where it's bugged and obviously one (or multiple) fingers are bent based on the angle of the player's hand.

Would the Skeleton_Poser script solve this??? Could I create a static open hands pose? Would it solve the weird bending issue?

I am at a loss now, it appears the finger AddTwistingWeridness() function is embedded somewhere deep in SteamVR runtime its self and without access. I am forced that my simple custom VR hands are just always going to have to look stupid with bending issues caused by the user naturally rotating their wrist..

It looks really bad too. Why would Steam include such a broken example in their premier on GitHub?

guiglass avatar Oct 19 '19 21:10 guiglass

I see additional issues related to this, for example, I notice Steam didn't invert the bend angles properly from their left to right hand skeletons, lol !!!

When i face left hand palm down, left skeleton fingers bend inwards. When i face right hand palm up, right skeleton fingers bend inwards.

Why on earth does facing my right palm up make my fingers curl inwards? How extremely annoying, and immersion breaking.


No response yet and no solution in sight.

I have presented clear video evidence proving that even the example created by Steam it's self is horribly broken and suffers from my exact issue.

Can someone please tag this as "confirmed bug"?

guiglass avatar Oct 26 '19 05:10 guiglass

Anyone?

guiglass avatar Oct 30 '19 21:10 guiglass

Yep!! Having same exact issue here. There appears to be no fix and no way to turn off the finger curling feature.

And good catch on noticing the Left and Right hand are not mirrored correctly. Now that I am looking for it I can clearly say it makes the VR hand look super fake!!

Whoever wrote the skeleton poser stuff definitely did not test if very well.

If Valve only would allow us to disable the gravity influence (or as you call it: user wrist rotation) then all problems would be solved.

Instead they just added some useless extra feature and essentially made the whole thing crap.

Please fix this Valve, I don't want my fingers curling by themselves. WTF?

grant541 avatar Oct 31 '19 23:10 grant541

Hi, can you talk a little more about your specific scenarios so we can better understand the situation? What are you trying to do with the skeletal data that is negatively effected by this behavior?

I can talk a little bit about why this decision was made. The purpose of Skeletal Input is to get our best estimation of what the users hands are doing. With vive wands we don't get a lot of data but we notice people's fingers tend to curl slightly when they raise them inwards and relax out when they put them down so we were replicating this behavior in the Without_Controller data.

It may be helpful to switch to the With_Controller data to get more accurate finger positions but they'll look like they're curled around a controller.

zite avatar Nov 01 '19 20:11 zite

Hi, thank you very much for your response.

My specific scenario is exactly the same as the Alien floppy hands example. I followed exactly the Alien floppy hands example provided in this Git. I created a set of custom hands and linked them to a proxy skeleton, this is the exact same way the alien floppy hands example was done in your example (which I download from here).

Because I followed your example exactly I get exactly the same bug that exists in your Alien floppy hand's example: https://youtu.be/VYil9uY7kds?t=4

Do you see how the alien floppy finger curls up weirdly?? Did no one ever notice this? I think it's clear as day,

If you need more information then I implore you to please watch the video, then go try your alien floppy hands example again, I am confident you will notice the strange curling issue right away if you look for it.

It is all caused by the pinky curly nonsens that you mentioned. I understand you were attempting to mimic real-life. But by doing so you made it nearly impossible to create custom hands.

I think it was very unfair to promoted the alien floppy hands example without properly addressing that curing issue.

Now my game design is already locked in, and you will probably never add options to turn off that finger curing gravity features. Which means that no matter how much I try, my custom hands will always suffer from weird curling issues (just like the alien floppy hands do).

I just want to turn off the auto finger curing, PLEASE!!!!

And thank you for taking the time to read this post.

guiglass avatar Nov 02 '19 05:11 guiglass

The alien hands in the example shouldn't be curling quite that much. If they only curled slightly (like they do in the normal example hands) would that work for you?

zite avatar Nov 02 '19 19:11 zite

Hi, I am not sure if I follow you, are you saying that you can see the curling issue, but that it is not as severe for you as what I show in the video?

How can that be?? Did you check both Knuckles and Vive wands? I just recently downloaded this Git repo and right out of the box the alien floppy hands are curling nearly 90 degrees when I flip my wrist over.

I believe the curling is more noticeable when using Vive wands than for knuckls.

I also tested the demo on two machines (Win7 and Win10) and both show exactly the same issue.

Possibly you have different SteamVR settings than I do?? If so, what might they be? I would really like to get rid of the auto-curling feature as much as possible, or entirely!! And I would really like to inform my users on how to turn it off too.

Q. "If they only curled slightly would that work for you?" I can't think of any instance where auto-curl would be beneficial for custom hand controllers, If I wanted auto-curling feature, I would just roll my own code..

Thank you for giving this attention.

guiglass avatar Nov 03 '19 06:11 guiglass

Sorry I wasn't clear, I meant that it is a bug that they are curling that much. I don't believe the normal hands curl that much. The alien hands are a unity-specific sample that may have a bug that the normal hands do not have.

If you're looking to do your own curl based animations separate from our estimation you may want to create your own vector1 actions for curls and bind those per controller. The point of Skeletal Input is to give you our best guess at finger positions.

We have a specific api you can use for curls specifically: SteamVR_Action_Skeleton has a summaryDataType member https://github.com/ValveSoftware/steamvr_unity_plugin/blob/a471e5a94c2ea823b79654616cff0c54453b1eff/Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs#L114 You can set this to "FromDevice" which will give you data direct from the device. But only if the device provides it. If it doesn't then we'll substitute the FromAnimation data.

For scenarios where you really do care about curls you probably want to customize what triggers a curl on a specific controller. Which you can do with actions in the binding layer. If you want to leave to up to the controller only when it has per finger data you can check SteamVR_Action_Skeleton's skeletalTrackingLevel https://github.com/ValveSoftware/steamvr_unity_plugin/blob/a471e5a94c2ea823b79654616cff0c54453b1eff/Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs#L126

zite avatar Nov 03 '19 07:11 zite

That sounds very promising but I am unsure how to use it.

I just tried adding a script that runs after the scene has fully loaded.

I try to set the summaryDataType for all hands in the scene, but I did not see any of them change. Am I using it correctly?

void OnEnable()
{
	foreach (var hand in GameObject.FindObjectsOfType<SteamVR_Behaviour_Skeleton>())
	{
		//set the summaryDataType for each SteamVR_Behaviour_Skeleton in the scene.
		hand.skeletonAction.summaryDataType = EVRSummaryType.FromDevice;
	}
}

What should I expect to see after changing that value? I would expect the skeleton to immediately start using raw values from the device, but I am very unsure.

And I really appreciate your assistance.

guiglass avatar Nov 03 '19 09:11 guiglass

Ah that doesn't work quite like you're hoping. That member changes the values that come out of the finger curls.

https://github.com/ValveSoftware/steamvr_unity_plugin/blob/a471e5a94c2ea823b79654616cff0c54453b1eff/Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs#L135

or

https://github.com/ValveSoftware/steamvr_unity_plugin/blob/a471e5a94c2ea823b79654616cff0c54453b1eff/Assets/SteamVR/Input/SteamVR_Action_Skeleton.cs#L187

zite avatar Nov 05 '19 18:11 zite