This assignment is due
by September 7, 2018 by 11:59pm.
Decked out in your new shirt, hat, shoes, and lunch box you decide to head back to the garage
to see how the work is coming along. You can't believe it, they've put it all together but it looks nothing
like you left it as. You ask what they have done.
Feabhsaigh muid d'aois d'aois. Anois, beidh tú cinnte agus cáil a bhaint as an rás.
(We improved your old ride. Now you will certainly qualify and win the race.)
Hesitant, but excited, you ask if its ready to drive. They assure you it is and recommend you take it
to learn how it handles and what special features they added to give you an advantage during the race.
Part I - See the World
You get in behind the steering wheel and find a note taped inside:
For this assignment, you will
write an OpenGL/GLFW program that displays a 2D animated and
interactive Hero or Vehicle. Make your window a traditional size, in fact make it
512x512 (the same as Lab00b, hmm). Your Hero must be made up of OpenGL
primitives, at least one of which is solid, and drawn in hierarchical
fashion. In other words, the eyes and mouth should be drawn with
respect to the head and the head with respect to the body, etc. A
carefully placed call with
glm::translate()
could be used to move entire portions of the Hero's body.
Your Hero must have some form of constant animation regardless of user
interaction (head bobbing side to side, arms waving up and down,
etc.).
The user must be able to move the Hero around the screen with
the keyboard and the Hero must wrap around the screen. That is, when
the Hero gets to the left edge of the screen, the Hero should then
reappear on the right edge of the screen. Same scenario for
right-to-left, top-to-bottom, and bottom-to-top. When each of these
four scenario happens, you must call the following respective
functions:
moveLeft()
,
moveRight()
,
moveUp()
, and
moveBottom()
. This will take care of advancing the map for you. Make sure to keep
the function call to
drawMap()
at the beginning of your
renderScene()
function, right after we load the identity matrix to the ModelView
Matrix. The Hero must also interact with the mouse (change
the Hero's color, expression, fire an arrow, etc.) and the interaction
must be based on the position of the mouse (the Hero runs away from
the mouse, it fires an arrow at the mouse, the Hero constantly looks
at the mouse, etc.). Your program must register a callback for the
keyboard and mouse. As discussed in class, it is
possible to combine the mouse and keyboard together for Shift +
Click or similar operations. Have fun and be creative! Don't be
limited to just the suggestions above. Try out different key
combinations (maybe allow the arrow keys to move your hero in addition to ASDW), make full use of the mouse, make your assignment as cool
as possible! Your Hero will be added to the Hero page so if you have a
particularly cool pose you'd like to use, be sure to capture that as
your screenshot. Use this source code package
(NOTE: it depends on SOIL which is included
for the Windows lab machines and my Mac build, you'll need to set up on your own machine. If you can't get SOIL set up properly, post
to Piazza and I'll tell you how to disable it.)
as the starting point since it contains the necessary shell to create
the world map. Additionally, download these
world map images and put them into the
images/
folder to populate the world map.
Ready to go, you set out to test your new vehicle.
Part II - Website
Update the webpage that you submitted
with A1 to include an entry for this assignment. As usual, include a
screenshot (or two) and a brief description of the program, intended to
showcase what your program does to people who are not familiar with the
assignment.
Part III - Questions
Briefly answer the questions below. Include your response in the
README.txt
file.
- Provide a series of OpenGL/glm calls that accomplish the following
transformations. Assume you have a function
drawHelmet()
which takes care of drawing the Mines helmet to the screen.
- As seen in class, it is very simple to rotate an object and have
it spin around its own local axis. The Mines helmet is located at
(x, y). How can we rotate the helmet around the origin (0, 0)
without the object spinning, but staying stationary around its own
local axes? An angle of rotation
θr
is provided and updated each frame to simulate the animation.
(Think back to the example from the end of class on Monday,
August 27).
- Instead of rotating around the origin (0, 0), how can we rotate
the helmet around an arbitrary point (i, j)?
- We have discussed the Shear transformation in class. GLM does
not provide a built in
glm::shear() as it does for
translate, rotate, or scale. Provided an angle of shear
θs
, how can you tell OpenGL the necessary transformation matrix
and apply the matrix to the drawing of the helmet? (Hint: Your
answer will not require any reference to glm::translate() ,
glm::rotate() , or glm::scale() .
)
Documentation
With this and all future assignments, you are expeced to appropriately
document your code. This includes writing comments in your source code
- remember that your comments should explain what a piece of code is
supposed to do and why; don't just re-write what the code says in plain
English. Comments serve the dual purpose of explaining your code to
someone unfamiliar with it and assisting in debugging. If you know what
a piece of code is supposed to be doing, you can figure out where it's
going awry more easily. Proper documentation also means
including a
README.txt
file with your submission. In your submission folder, always include a
file called
README.txt
that lists:
- Your Name / HeroName
- Assignment Number / Project Title
- A brief, high level description of what the program is / does
- A usage section, explaining how to run the program, which keys
perform which actions, etc.
- Instructions on compiling your code
- Notes about bugs, implementation details, etc. if necessary
- How long did this assignment take you?
- How much did the lab help you for this assignment? 1-10 (1 - did
not help at all, 10 - this was exactly the same as the lab)
- How fun was this assignment? 1-10 (1 - discontinue this
assignment, 10 - I wish I had more time to make it even better)
Grading Rubric
Your submission will be graded according to the following rubric.
20% |
Hero is correctly drawn with OpenGL
primitives. Draw calls are structured hierarchically, with some form
of model instancing [1]. Hero must be broken down into function
calls that handle smaller components. |
25% |
Hero is in a state of constant animation,
even when the user is not interacting with it. |
20% |
Hero responds to keyboard presses by moving
around the screen. Proper bounds checking is performed to move your
Hero from world to world and the worlds update. Pressing ESC closes
the program. |
20% |
Hero responds to mouse clicks and mouse
movement. The response is based on the location of the mouse. |
5% |
Questions from Part III are answered and
included in the README.txt file.
|
5% |
Submission includes source code, Makefile,
and README.txt . Source code is well documented.
Webpage named <HeroName>.html submitted and updated with
screenshot from latest assignment.
|
5% |
Submission compiles and executes. |
[1] In other words, a
call to drawHero() would be made up of calls to drawHead(), drawBody(),
etc.. Within drawHead() are two calls to drawEye() to place each eye on
the head. A properly placed call using glm::translate() could move the
entire head (and eyes) with respect to the Hero's body. Each component
should be drawn with respect to the component it is attached to (i.e.
eye locations are set as offset from center of head) rather than being
specified with respect to the center of the Hero. Individual components
can then be moved hierarchically. If there are any questions, feel free
to post a question to Piazza.
Experience Gained & Available Achievements
Assignments +100 XP |
Web +100 XP |
Point, Set, Match
|
Submission
Please update your Makefile so it produces an executable with
the name a2. When you are completed with the assignment, zip
together your source code, Makefile, and
README.txt
into a folder named src/ plus include your www/ folder. Name the zip
file,
HeroName_A2.zip
. Upload this file to Canvas under A2. The structure of your submission
should look as follows:
- HeroName_A2.zip
- src/
- images/
- README.txt
- Makefile
- main.cpp
- all_additional_code
- www/
- images/
- HeroName.html
- all_additional_files
This assignment is due
by September 7, 2018 by 11:59pm.
|