Rubik's Cube Due Date: Monday, April 2 This project will give you some experience with interaction and with building, transforming and manipulating 3D models. Rubik's cube consists of 27 sub-cubes arranged to form a larger 3×3×3 cube. Each of the subcubes has sides colored as red, green, blue, white, yellow and magenta. The same-colored faces of the sub-cubes are initially aligned so that the larger cube appears as if it had six solid differently colored faces. We can move the Rubik's cube by rotating any plane of 9 sub-cubes by 90 degrees. The usual way of playing with Rubik's cube is that one person distorts the original configuration by making a series of 90 degree rotations and the other tries to return the cube to its original state. The first part of this assignment is to construct a Rubik's cube and to display it. Since we will manipulate the cube in the second part, you should give some thought to how to represent the cube in order to emphasize that it includes 27 instances of a simple cube. The second part of the project involves manipulating the Rubik's cube. You are required to put it initially in some random configuration by having your program perform a random series of rotations of various faces. Once the cube is initialized, it will be ready for the user to manipulate. The user should be able to look at the cube from different angles to decide on a move. Thus, the user should be able to rotate the large cube as a whole any time she wishes. You should give some thought to what kind of user interface you want for the user to specify how she wants to look at the cube and what move she would like to perform. You are expected to implement a picking mechanism to decide on which face to rotate. The easiest way to implement picking is to make use of another buffer other than the front buffer for rendering each object with some unique color. See the relevant lecture slides on Input & Interaction (do not use the deprecated glRenderMode() functionality). See also Section 3.13 in your textbook to see different alternatives of user interface to rotate objects with mouse (or keyboard). Your program is not expected to know how to solve Rubik's cube for any initial configuration. Since we are just beginning to talk about viewing, you may simply use orthographic viewing, thus the viewing procedures in the simple sample programs should suffice. Your grade will depend on how nicely you model the Rubik's cube, both statically and dynamically, the quality of your user interface, and the quality of your display. You should consider things like whether or not you want to display edges of the sub-cubes in addition to the face colors and whether you want to show a move as simply the cube in its final position or as a continuous rotation of smaller angles. However, simply showing the cube without the animationcan be done very trivially and will not necessarily demonstrate the understanding of transformations, which is the key goal of this project. Implementation hints: • The most difficult part of this assignment is to be able to keep track of the position of each sub-cube as the user applies a series of rotations of the faces. If you specify an index i (i = 0,1,…,5) for each face, and an index j (j = 0,1,…,26) for each sub-cube, then the indices {j} of the 9 cubes belonging to each face i change each time a rotation is applied, depending on which face is rotated. • Once you determine which face, thus which sub-cubes to rotate, with picking, the next task is to be able perform this rotation properly. For that, you may need to store 28 different modelview matrices, one matrix to store the global view angle, and 27 matrices for the subcubes (that is, one matrix for each sub-cube). Of course there may be different ways of achieving the same goal. • For smooth rotations, you may need glut timer function to adjust the speed of the rotation. • You are also required to provide a help interface that instructs the user how to use input devices for interaction. The simplest way is to define a keyboard callback function that prints a description to the command line window. Grading policy: You are normally capable and expected to accomplish all the tasks necessary to manipulate the Rubik’s cube properly. Anyway, please submit your work even if it is partial, but make sure that your code can be compiled and executed and does at least some part of the task coherently. The tentative grading policy is as follows: • %35 for initial modeling and display of the Rubik’s cube with an interface to view the cube as a whole from different angles. • %35 for picking one face and rotating it properly at least once. • %35 for smooth animations and capability of applying a series of face rotations (including the random initialization) Remember that an interface providing help on how to use the program is mandatory. Creative design and implementation will be rewarded. Cheating will not be tolerated. Note: You must NOT use any of the deprecated OpenGL functions except GLUT, which were all removed as of version 3.1. Your program must include a vertex shader and a fragment shader.