Virtual Reality experiences are super immersive. Exploring a completely different world, being absorbed by it, feeling as if one is really there… until somebody shoots you and all you see is a bit of red glow indicating you were hit.
Using small vibrations it is now also possible to give haptic feedback to the player. Some of the coolest gear around comes from bHaptics and I just added support for it to traVRsal. They have multiple accessories, most importantly the vest, followed by the arm pieces and even a headset piece for facial haptics.
Is it any good? You bet. In my research how to best implement it I played multiple games like Half Life: Alyx and Population one and I have to say: the gear always adds to the immersion, and it especially shines with shooters.
Take the A.I. Take-Over world in traVRsal. All of a sudden you feel the impact of a shot and even more impressive, the direction it came from. That actually gives you an advantage as you can now react much faster to enemies.
The vest supports a vast array of different possible patterns. Many are already included in the SDK to make it easy to start but there is even a designer to go full out and create custom patterns. One cool example is a slashes when a virtual sword hits you, impacting you diagonally from top left to lower right. Another one would be a heart-beat.
I made a big brainstorming list where haptics could add to the experiences. Here is what I finally ended up with implementing (see github for details):
click(arms): using pointer in menu
collect(arms): collecting items in-game with hands
death(all): when dying
exit-found(all): when having found the exit of a world
falling(all): when falling from heights
health-critical(vest): when health is below 20%
impact-all(all): when hit by explosion
impact-arm(arms): when hit by projectile
impact-body(body): when hit by projectile
impact-head(head): when hit by projectile
melee(arms): when destroying targets with arms
pistol(arms + body): when shooting
reload(arms): reloading weapon
slowdown(arms): when initiating time slowdown
startup(all): upon game start
world-loaded(all): after world has been loaded and player can start to walk
In order to add all this, I actually needed to enhance multiple core systems of the traVRsal engine. Most importantly, all player parts now react differently, meaning I now know which part of the player got hit and you get less damage on your hands than when shot in the head. Also, you cannot die anymore just because of hand damage. Items that can damage you now carry information about how such damage would feel like. E.g, a bullet hit or an explosion.
A bit tricky is that one cannot assume that players have all devices. Many players have only the vest so it is important to design the system in a way that either always the vest is giving feedback as well (e.g. a recoil in the shoulder and a vibration in the arm when shooting) or to have an intelligent fallback system with different haptic files to be played when only the vest is available. I decided for the latter approach as that let’s me design the experience even better.
Another tricky part is mirroring. A haptic clip is for example designed for a specific arm piece, let’s say the left one. To get it also on the right-hand side the pattern needs to be inverted. This means either create a second file or use the “reverse” property in the SDK, either at design or (luckily also) at runtime. I implemented a system which allows me to declare only one side and at runtime the correct mirroring will be done automatically, saving lots of time when designing the haptics. Also, I created a system to either play one out of multiple clips randomly for more variety or a whole group at once which is very hands to play effects in multiple devices at once.
A final learning is to dial up the intensity significantly. The default value of 1 is not enough for serious play, which was also feedback from testers. I usually have to dial it up to (not 11, beware) 1.5 or 2.
Right now, traVRsal comes with many haptic experiences out of the box. For world builders I hesitated a bit if to open that can of worms, but ultimately I said, let’s go for it. So now, bHaptics is an integral part of my own SDK and the DamageInflictor supports custom haptics to be played. Go wild!
With that I’m at the end of my short overview. If you have bHaptics gear, make sure to report back on how you liked it in my Discord!