So for some reason I decided to invest more time into the throwing mechanic. Although I’ve validated that the current mechanic is better than the “native” throwing mechanic, I didn’t get into details of either. I’m also quite shortsighted at that moment and didn’t look into other games and how they implemented throwing.
Instantaneous Direction (ID) Throwing
So let’s get things clear and clarified. The “native” throwing mechanic I’ve been talking about, is basically checking the direction of the controller is moving, at the exact point when the grip button is released. The direction is determined by the position of the controller at the frame where the grip button is released, and the the position of it in the last frame. So for the sake of better understanding and explaining, I’m going to name it Instantaneous Direction (ID) throwing .
This method has a problem: when player throws an object, they expect the object to gradually roll off the finger instead of immediately separated from the hand. This means that the grip button is not fully released by the player, when the movement direction of the controller is lined up with the target. By the time the grip is released, the hand is already past the “release” point, or even worse, the controller is already travelling in the opposite direction at that point. Of course, the throwing movement of the player in this case is more of a flicking action, where most of the movement is on the wrist rotation. An example of this is how normal people throws a shuriken, which coincidently is what this whole game is about. This mismatch in direction can be countered by using a “push” motion, where the player throw by moving the whole arm generally, instead of using the writs. The push method, however, doesn’t feel very natural, and is not very “shuriken throwing” at all.
I’ve tracked the position of the controller and the grip pressure in each frame, and plotted it in a top-down view, where I was trying to throw the object at the target, using a flick-throwing motion. As seen below, the white line indicates the direction to the target, and the curve is the trail of the controller. The blue arrow indicates what will the projectile be travelling if we use the ID throwing method. Obviously it’s not accurate at all. Check out ShurikenVR Devlog#6 to see it in video.
Aim Locked (AL) Throwing
I’ve been calling the throwing I implemented “Aim before throwing”, but I wanted to give it a more proper name, so here it is: Aim Locked (AL) Throwing. Here’s how it works, in AL, you aim by the back of your hand, and when grip button is pressed, the aim is locked. This means that when you throw, neither will releasing the grip button early nor late will affect the aim, because it’s locked. This has the advantage of being extremely accurate, as it doesn’t rely on the “feel” of the player to aim. But the disadvantages is also apparent — it feels a bit unnatural, as no one aims with the back of their hand to throw in real life. The unnatural feel might be partly contributed by the angle of the aim, biasing the aim towards the front of the hand might makes it feel more natural.
Also, it might be creator bias, but I think this mechanic actually feels quite smooth after getting used to it.
Reddit suggestions
I posted in the r/VirtualReality subreddit, and asked people about their opinions on throwing in other games and headset. A lot of the comments emphasized that it’s more on the implementation on the game, not the headset. Surprisingly, SuperHot, which I think is a game that relies on throwing a lot, seems to have a bad rating in terms of throwing mechanic. On the other side of the spectrum, Half-Life: Alyx has a lot of praises from the comments. Conveniently HLA has a commentary regarding their implementation on the throwing mechanic. Basically it takes the data in 10 frames preceding the release of the button, and then averages the (direction of the) velocity in the 3 frames bracketing the highest velocity in that 10 frames.
So let’s use HLA method to evaluate the same track data we used for ID, and here’s the result. As seen below, the blue arrow indicates the direction of the projectile using HLA method:
It’s much better than the ID method, but still not quite the accuracy I was looking for. Of course, this doesn’t mean that HLA method is a bad throwing method. It doesn’t goes well with the wrist flicking motion (for throwing shuriken), but it is better suit for a overhead-throw motion like throwing grenade (which is what it’s design for).
One other notable suggestion is to use trigger button instead of grip button, I think this might make the grab and throw feel more natural, so I’ll probably make it as an alternative to the grip button.