"Voyage: Oceana" (2024) is a Tethered Virtual Reality experience, combing immersive visuals with motion simulation. The experience invites the user along a research tagging operation, where they learn and explore a diverse and intrigue coral reef.
Come and experience Voyage: Oceana in person at the 2024 Immersive Media Design Capstone Fair!
4pm, May 9th
Room 3219, A.V. Williams Building, University of Maryland,
8223 Paint Branch Dr,
College Park, MD 20742
Voyage Oceana is a tethered VR experience developed for the Vive Focus 3, utilizing the DOF reality motion simulation platform. Set in a vibrant coral reef, this interactive and educational application allows users to explore and tag various marine creatures, providing a deep understanding of the surrounding ecosystem. The primary objective is to create an immersive experience akin to those found in museums and aquariums, combining VR technology with motion simulation to enhance the experience's immersive qualities.
The end goal for this project is to create an educational VR exhibit comparable to those found at museums and aquariums across the world. Virtual Reality is a unique medium; one that it allows its users to have experiences that they would never be able to have in real life. We believe this can have a profound impact, especially in an educational context. In Voyage: Oceana, the users not only learn about the ocean, but also interact with it in an intimate way. The Voyage Team believes this can be instrumental in fostering care for our ocean ecosystems within our audience.
VR Headset: Vive Focus 3
Motion Simulation: DOF Reality H3 motion simulation platform
Controllers: Initial implementation with Vive controllers, later transitioned to Xbox controllers.
Game Engine: Unity
Coding Language: C#
Motion Simulation: Sim Racing Studio
VR: Vive Business Streaming and OpenXR
I was the Lead Developer on the Voyage: Oceana Team. I was responsible for all of the scripting, hardware integration, and user interface. Additionally, I actively helped the artistic team with modeling, animation, rigging, and environment design.
Voyage: Oceana is created with Unity 2021.3.20f1, and all of the scripting is in C#. The core of the experience's functionality is controlled by the GameManager Script. Using the singleton approach, The GameManager keeps reference to the trackable creatures, Player, and Dialogue, facilitating communication between these different pieces of the experience. The Game Manager also tracks the experiences current state. Input in handled through the OceanaController Script, which uses unity new input system to move the player and interact with the enviroment.
Voyage: Oceana used a DOF Reality (H3) motion simulation rig to increase the immersive quality of the experience. Through unity and SimRacingStudio, the DOF Rig's pitch, yaw, and roll could be manipulated to simulate the motion and forces applied to the user.
The Sim Racing Studio’s API originally uses the euler angles of the vehicle’s rigidbody to control the platform’s roll, pitch, and yaw. This works well to calibrate and check communication between Unity3D and Sim Racing Studio. However, this configuration does not simulate the desired forces acting upon the user in game. In order to simulate the virtual movement and forces, the pitch and roll were calculated based on data from the vehicle's rigid body
Pitch Calculation:
the in-game pitch and forwards acceleration were both considered.
Changing of pitch based on virtual forwards acceleration mimics the inertial forces acting on the user’s body during real life acceleration.
Roll Calculation:
The centrifugal force of the in-game turning was calculated based the formula F꜀ = mω ²r, which for ease of calculation was simplified to F꜀ = mωv (F꜀ being centrifugal force, m being mass, ω being angular velocity, r being radius, and v being linear velocity.
Mass was ignored and the force calculation was used to roll the player away from the turn, e.i. While the player was turning to the left, they would roll to the right.
This rolling action causes gravity to act in a similar way to the inertial forces the player would experience from in-game motion, mimicking the feeling of turning.
Voyage: Oceana's narrative was split into two seemingly distinct parts, the linearly progressing onboarding portion and then the repeating Tracking/Tagging portion. To track and control the Games's flow, a game manager and the Message classes were created. The Message Classes were components of the UI appearing on the in-game dashboard; These dashboard messages were responsible for controlling valid input actions, relaying information, and moving the game's narrative along. The Game Manager controlled the transition between messages, as well as tracked other important data and game information. The Message Classes can be simplified into three subcategories: Duration States (messages that remained for a set duration), Untimed States (messages that remained until an event occurred), and time limited states (messages that remained until an event occurred or the state went above a time limit).
Voyage: Oceana Required several different entities with unique behaviors matching their real-life counterparts. These behaviors can be broken down between the trackable creatures and the flocking creatures.
Trackable Creatures
Functionally, the trackable creatures needed to exist in the scene until the player either succeeds or fails to tag the creature, at which point the creature would leave the scene. Thus, The Trackable creature's behavior could be broken down into the following states: The Idle State, The Scared State, and The Fleeing State. In the fleeing state, the creature would need to navigate away from the player, avoiding creatures and obstacles.
Originally, the trackable creatures in the fleeing state interacted and perceived their surroundings using Unity's built in NavMesh class. While this allowed the creatures to easily navigate around the scene, it was also considerably costly for the purpose. Eventually I moved towards using a waypoint system. In this waypoint system, each creature had four predetermined paths. When spooked, the creature would choose the path most perpendicular to the players forward direction, allowing the creature to be out of view as quickly as possible.
Flocking Creatures
For the Schools of fish, I reworked an old flocking Script I had created for the project "Into the Deep" (2022) based on BOID mechanics. While the flocking mechanics were strong, the script struggled with obstacle and player avoidance. It was also rather costly, especially for the multitude of fish I wanted in the scene. When beginning to rework the script, I first optimized it by creating a distance based-activation script. This script ensured only schools within a certain distance from the player would be enabled and actively updating. Then I moved on to player avoidance. I took the 2-dimensional obstacle avoidance I had been working on earlier and updated it to avoid a three-dimensional point. I weighed vertical avoidance slightly higher than horizontal avoidance to encourage entities to swim above or below player rather than around, leading to cleaner look. However, this player avoidance still had major faults, especially due to the speed of the vehicle compared to the speed of the entities. To help mitigate this fault I increased the entity speed when close to the player. Additionally, I the frequency of Boid Updates (updates applying the BOID rules to entities) was made to be variable. the closer the entities were to the player; the more frequent BOID updates would occur.