Part 3: Gesture Steering/Constant Velocity

Christiane Snyder

The core of this VR experience is the ability to steer a character according to the user’s real life rotation and forward direction. The main character (in this case, a fish) will move at a constant velocity throughout the virtual space and can be controlled by the user changing their orientation (even if they are currently stationary).

Moving a stationary player in a virtual world is a tricky feat because players can easily get sick/nauseous, but we can actually minimize simulator sickness by following a few basic design guidelines:

  • Always move the player/camera at a constant velocity.
  • Do not allow jerky camera maneuvers that are not a direct product of the player’s movements, as they can disorient the player and cause nausea.
  • Encourage players to take frequent breaks from the simulation.
  • How can we design our experience with these rules in mind?

  • The GvrMain/Head/Main Camera will move by multiplying an invariable float by it’s forward vector in the Update() function. This forward vector will be dependant on the player’s actual forward direction.
  • The main character (fish) will always be placed directly in front of the camera, giving the appearance of steering the main character. At the same time, the fish’s rotation will be set to the user’s real life rotation, which will be accessible through the GoogleVR SDK.
  • By constraining rotation of the camera/character to the user’s physical rotation, we avoid the issue of jerky movements that are not caused directly by the player. This makes it significantly easier to ensure the user doesn’t get nauseous.
  • We’ll cover how we’ll ensure users don’t play for extended periods in the coming sections.
  • Create a “MainFish” script that will continuously set the fish’s position in front of the main camera in its update function:

    Attach this “MainFish” script to the “Fish” game object.

    Create a “SteadyMove” script that will propel “GvrMain” and its child objects through the space at a constant speed:

    Add “SteadyMove” to the “GvrMain” game object in the scene’s hierarchy.