Difference between revisions of "Project1SP15"

From Immersive Visualization Lab Wiki
Jump to: navigation, search
(Created page with "=Project 1: Moving a Cube= Your project should build on the provided starter code. Before you start with this project, you will need to look through t...")
 
(2. Controlling the Cube (46 points))
 
(9 intermediate revisions by one user not shown)
Line 1: Line 1:
 
=Project 1: Moving a Cube=
 
=Project 1: Moving a Cube=
  
Your project should build on the provided [[BasecodeCSE167F15 | starter code]]. Before you start with this project, you will need to look through the starter code and get familiar with it.  
+
Your project should build on the provided [[BasecodeCSE167S15 | starter code]]. Before you start with this project, you will need to look through the starter code and get familiar with it.  
  
 
This project has three parts, but only the first two are mandatory to get full credit (100 points). The number of points you can get for each part is indicated below. In the first part you will need to create C++ classes for vectors and matrices. You will use these classes in the remaining projects throughout the quarter. In the second part of this project you will enable the user to interactively manipulate the cube from the starter code with keyboard keys.
 
This project has three parts, but only the first two are mandatory to get full credit (100 points). The number of points you can get for each part is indicated below. In the first part you will need to create C++ classes for vectors and matrices. You will use these classes in the remaining projects throughout the quarter. In the second part of this project you will enable the user to interactively manipulate the cube from the starter code with keyboard keys.
Line 19: Line 19:
 
Your Vector3 class must support at least the following functions. You will get 2 points for each function.
 
Your Vector3 class must support at least the following functions. You will get 2 points for each function.
  
* Vector3::Vector3(double x, double y, double z): constructor with three parameters for the vector coordinates
+
* Vector3::Vector3(float x, float y, float z): constructor with three parameters for the vector coordinates
* Vector3 operator+(const Vector3&): overload operator '+' for addition
+
* Vector3::operator+(Vector3): overload operator '+' for addition
* Vector3 operator-(const Vector3&): overload operator '-' for subtraction
+
* Vector3::operator-(Vector3): overload operator '-' for subtraction
* void negate(): negation
+
* Vector3::negate(): negation
* void scale(double s): scale (multiplication with scalar value)
+
* Vector3::scale(float s): scale (multiplication with scalar value)
* double dot(const Vector3&, const Vector3&): dot product, returns result
+
* Vector3::dot(Vector3): dot product, returns result
* Vector3 cross(const Vector3&, const Vector3&): cross product, returns result and puts it in calling vector
+
* Vector3::cross(Vector3): cross product, returns result
* double length(): length of the vector
+
* Vector3::length() or Vector3::magnitude(): length of the vector
* void normalize(): normalize the vector (make it so that its length is equal to one)
+
* Vector3::normalize(): normalize the vector (make it so that its length is equal to one)
* void print(string comment): print x,y and z components of the vector after a comment string
+
* Vector3::print(string comment): print x, y and z components of the vector after a comment string
  
 
===1b. Vector4 Class (10 Points)===
 
===1b. Vector4 Class (10 Points)===
Line 34: Line 34:
 
Your Vector4 class must support at least the following functions. You will get 2 points for each function.
 
Your Vector4 class must support at least the following functions. You will get 2 points for each function.
  
* Vector4::Vector4(double x, double y, double z, double w): constructor with four parameters for the vector coordinates
+
* Vector4::Vector4(float x, float y, float z, float w): constructor with four parameters for the vector coordinates
* Vector4 operator+(const Vector4&): overload operator '+' for addition
+
* Vector4::operator+(Vector4): overload operator '+' for addition
* Vector4 operator-(const Vector4&): overload operator '-' for subtraction
+
* Vector4::operator-(Vector4): overload operator '-' for subtraction
* void dehomogenize(): dehomogenize the vector (scale it so that its fourth component is equal to one)
+
* Vector4::dehomogenize(): dehomogenize the vector (scale it so that its fourth component is equal to one)
* void print(string comment): print x,y, z and w components of the vector after a comment string
+
* Vector4::print(string comment): print x,y, z and w components of the vector after a comment string
  
 
===1c. Matrix4 Class (24 Points)===
 
===1c. Matrix4 Class (24 Points)===
Line 45: Line 45:
  
 
* Matrix4::Matrix4(): constructor, initializing each matrix element with zero
 
* Matrix4::Matrix4(): constructor, initializing each matrix element with zero
* Matrix4 Matrix4::operator*(const Matrix4& m2): multiply matrix with matrix
+
* Matrix4::operator*(Matrix4): multiply matrix with matrix
* Vector4 Matrix4::operator*(const Vector4& v): multiply matrix with vector
+
* Matrix4::operator*(Vector4): multiply matrix with vector
* void Matrix4::identity(): make identity matrix
+
* Matrix4::identity(): make identity matrix
* void Matrix4::transpose(): transpose the matrix
+
* Matrix4::transpose(): transpose the matrix
* void Matrix4::makeRotateX(double angle): make rotation matrix about X axis with angle in degrees (note that the sin/cos functions in C++ expect radians so you need to convert to radians within the function)
+
* Matrix4::makeRotateX(float angle): make rotation matrix about X axis with angle in radians
* void Matrix4::makeRotateY(double angle): make rotation matrix about Y axis with angle in degrees
+
* Matrix4::makeRotateY(float angle): make rotation matrix about Y axis with angle in radians
* void Matrix4::makeRotateZ(double angle): make rotation matrix about Z axis with angle in degrees
+
* Matrix4::makeRotateZ(float angle): make rotation matrix about Z axis with angle in radians
* void Matrix4::makeRotate(double angle, const Vector3& axis): Make a rotation matrix about an arbitrary axis
+
* Matrix4::makeRotate(float angle, Vector3 axis): Make a rotation matrix about an arbitrary axis
* void Matrix4::makeScale(double sx, double sy, double sz): make a non-uniform scaling matrix
+
* Matrix4::makeScale(float sx, float sy, float sz): make a non-uniform scaling matrix
* void Matrix4::makeTranslate(double tx, double ty, double tz): make a translation matrix
+
* Matrix4::makeTranslate(float tx, float ty, float tz): make a translation matrix
* void Matrix4::print(string comment): print the matrix (display all 16 matrix components numerically on the screen in a 4x4 array)
+
* Matrix4::print(string comment): print the matrix (display all 16 matrix components numerically on the screen in a 4x4 array)
  
==2. Controlling the Cube (46 points)==
+
==2. Controlling the Cube (50 points)==
  
 
Using your vector math classes from part 1, control the cube in various ways with keyboard commands. During this entire time, the cube should keep spinning. The commands should be cumulative, meaning that they build on one another. Never reset the position of the cube or its size, except with the reset command.
 
Using your vector math classes from part 1, control the cube in various ways with keyboard commands. During this entire time, the cube should keep spinning. The commands should be cumulative, meaning that they build on one another. Never reset the position of the cube or its size, except with the reset command.
Line 69: Line 69:
 
* 'y'/'Y': move cube down/up by a small amount. (5 points)
 
* 'y'/'Y': move cube down/up by a small amount. (5 points)
 
* 'z'/'Z': move cube into/out of the screen by a small amount. (5 points)
 
* 'z'/'Z': move cube into/out of the screen by a small amount. (5 points)
* 'r': reset cube position, orientation, size and color. (5 points)
+
* 'r': reset cube position, orientation, and size. (5 points)
 
* With every key press, display the new cube position with your Vector3 print method in the text window. (5 points)
 
* With every key press, display the new cube position with your Vector3 print method in the text window. (5 points)
 
* 'o'/'O': orbit cube about the OpenGL window's z axis by a small number of degrees (e.g., 10) per key press, counterclockwise ('o') or clockwise ('O'). The z axis crosses the screen in the center of the OpenGL window. This rotation should not affect the spin other than that it will rotate the spin axis with the cube. (10 points)
 
* 'o'/'O': orbit cube about the OpenGL window's z axis by a small number of degrees (e.g., 10) per key press, counterclockwise ('o') or clockwise ('O'). The z axis crosses the screen in the center of the OpenGL window. This rotation should not affect the spin other than that it will rotate the spin axis with the cube. (10 points)
Line 76: Line 76:
 
==3. Optional: Bouncing Ball (10 Points)==
 
==3. Optional: Bouncing Ball (10 Points)==
  
Use the [https://www.opengl.org/resources/libraries/glut/spec3/node81.html glutSolidSphere()] function to create a ball. Switch between the ball and the cube with the 'b' key.
+
Use the Sphere class or [https://www.opengl.org/resources/libraries/glut/spec3/node81.html glutSolidSphere()] function to create a ball. Switch between the ball and the cube with the 'b' key.
  
 
In "Ball" mode, you don't need to support any of the functionality from part 2. What you need to do is to make the ball bounce. Give it a velocity vector and make it reflect off the edges of the window so it looks like it bounces around the window, moving around on straight lines. (7 Points)
 
In "Ball" mode, you don't need to support any of the functionality from part 2. What you need to do is to make the ball bounce. Give it a velocity vector and make it reflect off the edges of the window so it looks like it bounces around the window, moving around on straight lines. (7 Points)
  
 
To make the bouncing motion more realistic, make it look like the ball is getting pulled down by gravity by adding a constant down vector to your velocity every time you update it. You could even make it lose energy at every bounce, so that it eventually stops moving. (3 Points)
 
To make the bouncing motion more realistic, make it look like the ball is getting pulled down by gravity by adding a constant down vector to your velocity every time you update it. You could even make it lose energy at every bounce, so that it eventually stops moving. (3 Points)

Latest revision as of 16:18, 2 April 2015

Contents

Project 1: Moving a Cube

Your project should build on the provided starter code. Before you start with this project, you will need to look through the starter code and get familiar with it.

This project has three parts, but only the first two are mandatory to get full credit (100 points). The number of points you can get for each part is indicated below. In the first part you will need to create C++ classes for vectors and matrices. You will use these classes in the remaining projects throughout the quarter. In the second part of this project you will enable the user to interactively manipulate the cube from the starter code with keyboard keys.

The third part is optional: you are going to have to make the cube bounce.

This project is due on Friday, April 3rd. You will need to present your project in the CSE basement labs starting at 1pm that day.

TA Dylan is going to introduce this homework assignment in CSB 004 on Monday, March 30th at 4pm.

1. Vector and Matrix Classes (50 points)

Start with the spinning cube from the starter code. Part of the project is a class named Matrix4. Use it as a model and implement matrix and vector classes with frequently used functionality.

1a. Vector3 Class (20 Points)

Your Vector3 class must support at least the following functions. You will get 2 points for each function.

  • Vector3::Vector3(float x, float y, float z): constructor with three parameters for the vector coordinates
  • Vector3::operator+(Vector3): overload operator '+' for addition
  • Vector3::operator-(Vector3): overload operator '-' for subtraction
  • Vector3::negate(): negation
  • Vector3::scale(float s): scale (multiplication with scalar value)
  • Vector3::dot(Vector3): dot product, returns result
  • Vector3::cross(Vector3): cross product, returns result
  • Vector3::length() or Vector3::magnitude(): length of the vector
  • Vector3::normalize(): normalize the vector (make it so that its length is equal to one)
  • Vector3::print(string comment): print x, y and z components of the vector after a comment string

1b. Vector4 Class (10 Points)

Your Vector4 class must support at least the following functions. You will get 2 points for each function.

  • Vector4::Vector4(float x, float y, float z, float w): constructor with four parameters for the vector coordinates
  • Vector4::operator+(Vector4): overload operator '+' for addition
  • Vector4::operator-(Vector4): overload operator '-' for subtraction
  • Vector4::dehomogenize(): dehomogenize the vector (scale it so that its fourth component is equal to one)
  • Vector4::print(string comment): print x,y, z and w components of the vector after a comment string

1c. Matrix4 Class (24 Points)

Your Matrix4 class must support at least the following functions. You will get 2 points for each function.

  • Matrix4::Matrix4(): constructor, initializing each matrix element with zero
  • Matrix4::operator*(Matrix4): multiply matrix with matrix
  • Matrix4::operator*(Vector4): multiply matrix with vector
  • Matrix4::identity(): make identity matrix
  • Matrix4::transpose(): transpose the matrix
  • Matrix4::makeRotateX(float angle): make rotation matrix about X axis with angle in radians
  • Matrix4::makeRotateY(float angle): make rotation matrix about Y axis with angle in radians
  • Matrix4::makeRotateZ(float angle): make rotation matrix about Z axis with angle in radians
  • Matrix4::makeRotate(float angle, Vector3 axis): Make a rotation matrix about an arbitrary axis
  • Matrix4::makeScale(float sx, float sy, float sz): make a non-uniform scaling matrix
  • Matrix4::makeTranslate(float tx, float ty, float tz): make a translation matrix
  • Matrix4::print(string comment): print the matrix (display all 16 matrix components numerically on the screen in a 4x4 array)

2. Controlling the Cube (50 points)

Using your vector math classes from part 1, control the cube in various ways with keyboard commands. During this entire time, the cube should keep spinning. The commands should be cumulative, meaning that they build on one another. Never reset the position of the cube or its size, except with the reset command.

Add support for the following keyboard commands to control the cube. You can parse key presses with the glutKeyboardFunc command, for which you can find a tutorial here.

Note that some of the below keyboard commands distinguish between upper and lower case.

  • 't: toggle the direction of the spin between clockwise and counterclockwise. (5 points)
  • 'x'/'X': move cube left/right by a small amount. (5 points)
  • 'y'/'Y': move cube down/up by a small amount. (5 points)
  • 'z'/'Z': move cube into/out of the screen by a small amount. (5 points)
  • 'r': reset cube position, orientation, and size. (5 points)
  • With every key press, display the new cube position with your Vector3 print method in the text window. (5 points)
  • 'o'/'O': orbit cube about the OpenGL window's z axis by a small number of degrees (e.g., 10) per key press, counterclockwise ('o') or clockwise ('O'). The z axis crosses the screen in the center of the OpenGL window. This rotation should not affect the spin other than that it will rotate the spin axis with the cube. (10 points)
  • 's'/'S': scale cube down/up (about its center, not the center of the screen). To scale up means to make it bigger (6 points)

3. Optional: Bouncing Ball (10 Points)

Use the Sphere class or glutSolidSphere() function to create a ball. Switch between the ball and the cube with the 'b' key.

In "Ball" mode, you don't need to support any of the functionality from part 2. What you need to do is to make the ball bounce. Give it a velocity vector and make it reflect off the edges of the window so it looks like it bounces around the window, moving around on straight lines. (7 Points)

To make the bouncing motion more realistic, make it look like the ball is getting pulled down by gravity by adding a constant down vector to your velocity every time you update it. You could even make it lose energy at every bounce, so that it eventually stops moving. (3 Points)