Where's Waldo 3D
In this first programming project of the course you need to extend our starter code to a game in which the player needs to find a highlighted sphere among a 3D array of similar spheres, and click on it. The player has one minute to click on as many highlighted spheres as possible.
This project is a team project: it should be done in teams of two. But individual submissions are allowed as well.
We recommend using this Oculus Minimal Example code from GitHub to start with. It's very compact but yet uses all of the API functions you will need.
To the minimum example you will need to add controller support, which this piece of sample code illustrates how it can be done. You can add this code to the draw() function of the minimal example to get printouts of the controller parameters. To see the cerr messages you have to display the terminal window, which you can do by replacing the line with WinMain with this one: int main(int argc, char** argv);
To better understand how the Oculus API works, we recommend this example from Oculus.
Project Description (100 Points)
Download the starter code and get it to work with the Oculus Rift. (10 points)
Based on the starter code, write a VR application for the Oculus Rift and the Touch controllers with the Oculus SDK in C++ and OpenGL (no Unity, Unreal, DirectX, etc). Here are step by step instructions for it:
- Use a background color of your choice other than black for your application (5 points).
- Load the the OBJ file of a sphere and display it at the user's dominant hand's controller position. This is the cursor. To load the sphere you can use the Assimp library. (10 points)
- Create and render a 3D array of 5x5x5 = 125 spheres in a color of your choice. Each sphere should be the size of a tennis ball (0.07 meters diameter), and the balls' center points should be 0.14 meters apart from one another in all three dimensions. (10 points)
- Wait for the user to pull the trigger button (index finger) to start the game. (10 points)
- Create a way to change the color of a random sphere of the array to highlight it. (10 points)
- Create the ability to move the cursor sphere to the highlighted sphere and upon trigger button click on the controller (index finger) test to see if the cursor is touching the highlighted sphere (a simple center-distance test will do). (15 points)
- Once the highlighted sphere has been clicked on, move the highlight to a new randomly selected sphere. (10 points)
- Repeat the above until one minute has passed since the game was started. (10 points)
- Display the number of correctly clicked spheres in the terminal window (not in VR), and restart the game. (10 points)
- -3 points if spheres aren't 0.07 meters in diameter
- -3 points if spheres aren't 0.14 meters apart from each other
Extra Credit (Max. 10 Points)
Options for extra credit are:
- Avatar hands: use the Oculus Avatar SDK to show stylized hands and/or touch controllers in their correct locations (where the user's physical hands are). (10 points)
- New game play: come up with a game that also involves clicking on things but is more fun than the homework project. (up to 10 points)
- Instead of displaying text in the terminal window, display all text within the VR environment. You need to display at least the following things: a message to start the game, a countdown timer that shows the remaining seconds in the game, a message that the game is over along with the number of correctly clicked spheres. (5 points)
- Support grabbing the set of spheres with the controller in the non-dominant hand: pressing and holding a button on the controller anywhere in space grabs the entire set of spheres as if they're all invisibly connected rigidly to the user's hand. They cannot snap to the hand but have to stay put when the user presses the button. While the user holds the button down, the spheres need to both translate and rotate with the controller. Once the button is released the movement of the spheres stops. (5 points)
- Instead of (or in addition to) highlighting the sphere that is to be clicked on, wrap a picture of Waldo around it as a texture. (5 points)