Assignment 4: You spin me round
In which, euler angles and rotation matrices become part of our 3D programming skillset
Due Friday, Oct 8, before midnight
The goals of this lab are to
Understand the matrix form of euler angles
Understand how to get euler angles from a rotations matrix
Implement euler conversions
In this assignment, you will implement conversions between euler angles and matrices. To help test your conversions, you have been given a grid of spinning teapots as well as a console program for unit testing.
In the teapot viewer, you should see a grid of teapots. The UI on the top left allows you to enter test values. Each teapot tests a conversion function. This week, you will implement 6 of the teapots to match the top right. In your next assignment, you will implement the remaining two teapots.
|For this assignment, you do not need to implement the quaternion conversions that animate the bottom, left two teapots.|
|To type a value into the GUI’s slider, do control+<left click>|
Get the source
On Github, do a
Fetch Upstream to synchronize your forked repository with the class repository.
Then update the source on your local machine and rebuild.
> git pull > cd build > cmake ..; make
1. Euler to Matrix
In the file
libsrc/atkmath/matrix3-basecode.cpp, implement the conversions from euler angles to a matrix.
In this assignment, you will complete the implementations for Matrix3 in
To start, implement the function
Matrix3::fromEulerAnglesZYX(). This function
takes a parameter called angleRad which stores euler angles as a 3-tuple
angleRad contains the rotation around the X axis (in radians)
angleRad contains the rotation around the Y axis (in radians)
angleRad contains the rotation around the Z axis (in radians)
|You will be implementing many similar functions. I recommend you add methods or functions to compute Rx, Ry, and Rz matrices.|
matrix3.h, you will see that
Matrix3 supports two types of syntax for accessing elements: indexing or by element name. For example,
std::cout << mM << std::endl; // indexing notation std::cout << m11 << std::endl; // lecture matrix notation mM[row][col] = 0.4; m11 = 3;
Use the utility
test_euler.cpp to help you implement your methods. Note that you can add more tests to this utility to help debug special cases!
When a test fails, it prints the expected value followed by the computed value, for example,
ZYX TEST FAIL 0 0 1 0 -1 0 1 0 0 1 0 0 0 1 0 0 0 1
2. Matrix to Euler
In class, we derived recipes for extract euler angles from XYZ and ZYX rotation matrices. In this question, derive the remaining formulas for extracting euler angles and implement them in your basecode.
In your implementation, be carefull of edge cases around 90 degrees!
To run the teapots from the build directory, type
To run the unit tests from the build directory, type
|Implement the special cases (e.g. when the middle angle is 90 or -90 degrees) after implementing the main algorithms for each case.|
3. Be Unique!
Implement your own unique animation or image in
a4-euler/unique.cpp. Some ideas:
Make a demo with rotating objects
Make a cone that follows a trajectory
Create a shape whose orientation and position is controlled using the keyboard
4. Hand-in your work
4.1. What to hand-in
Images, movies, gifs, as appropriate
4.2. How to hand-in
Check-in your code, images, and writeup and push the changes to Github. If everything is uploaded correctly, you will see your work on Github.
> cd animation-toolkit > git add <files> > git commit -m "helpful message" > git push
Best practice is to always commit changes as you work, rather than waiting until the end to commit changes. You can always revert to an old version if you need to!
Your code should download and compile without modifications. Test your assignment on a lab machine (Park 230) to ensure that it works.
4.3. Generating images, movies and gifs
On Ubuntu, you can take a screenshot by
Prt Scrn to take a screenshot of the desktop.
Alt + Prt Scrn to take a screenshot of a window.
On Ubuntu, you can use Peek to create gifs.
On Ubuntu, you can use
recordmydesktop to record movies in .ogv format.
By default, the whole desktop is recorded unless you give it a window id.
To get the window id, call
xwininfo and click on the window. Then pass the
> recordmydesktop --windowid <WindowId> --no-sound --v_quality 30 -o <name>.ogv
To check the video, open it in firefox.
> firefox <name>.ogv
|Files larger than 100 MB cannot be checked into git. In general, videos should be less than 5 MB.|
4.4. Update your Readme.md
assignments/a4-euler/Readme.md to document the features in your assignment. Your readme should contain your images, gifs, and movies.
On github, you can drag and drop movies into your readme files. Images and gifs can also be added that way, or by including text such as the following
![Alternate text here](/path/to/image.png)
This Guide can help you with writing markdown.