183 lines
8.6 KiB
Markdown
183 lines
8.6 KiB
Markdown
# Assignment 1a: Getting Started with Ray Casting
|
|
|
|
In this assignment, you are asked to begin writing a basic ray casting program.
|
|
|
|
This program should:
|
|
|
|
1. read a simple scene description from a file that is provided as a command
|
|
line argument
|
|
2. define an array of pixels that will hold a computer-generated image of the
|
|
scene
|
|
3. use ray casting to determine the appropriate color to store in each pixel of
|
|
the output image
|
|
4. write the rendered image to an output file in ascii PPM format
|
|
|
|
As with assignment 0, the output file name should match the input file name
|
|
except for the suffix. You can also earn extra credit by enabling your program
|
|
to render a parallel projection and/or to render not only spheres but also
|
|
cylinders.
|
|
|
|
You are asked to run your program on multiple different input files, featuring a
|
|
diverse range of different input parameter settings. One of the objectives of
|
|
this assignment is to help you to develop an intuitive understanding of how each
|
|
of the various input settings affects the appearance of the rendered scene.
|
|
Please be sure to specifically consider these three questions:
|
|
|
|
- How does the direction of the 'up' vector affect the rendered view of a scene?
|
|
You should specifically consider tipping the 'up' vector from side to side and
|
|
forward to back. You will want to define scenes with multiple objects,
|
|
asymmetrically arranged, to explore this question.
|
|
- How do changes in the field of view settings affect the contents of your
|
|
rendered images?
|
|
- How do various modifications of the viewing parameters affect the amount of
|
|
perspective distortion apparent in your image?
|
|
|
|
In subsequent assignments you will be asked to extend the code you write for
|
|
this assignment to incorporate additional effects like illumination, shadows,
|
|
specular reflections and transparency, with these latter effects being achieved
|
|
by recursive ray tracing. Be sure that your code is structured with these
|
|
extensions in mind. In particular, you are advised to write simple, modular code
|
|
following the example described in class.
|
|
|
|
Please be sure to check the grading criteria to ensure that all requirements are
|
|
understood.
|
|
|
|
### Detailed instructions
|
|
|
|
1. Your program should read the following information from an input scene
|
|
description file (the syntax is shown below each item; entries in italics
|
|
are variables, entries in bold are keywords):
|
|
|
|
- The view origin, also variously referred to as the 'eye position', 'camera
|
|
position' or 'center of projection' (a 3D point in space)
|
|
|
|
eye eyex eyey eyez
|
|
|
|
- The viewing direction (a 3D vector)
|
|
|
|
viewdir vdirx vdiry vdirz
|
|
|
|
- The 'up' direction (a 3D vector)
|
|
|
|
updir upx upy upz
|
|
|
|
- The horizontal field of view (in degrees, please)
|
|
|
|
hfov fovh
|
|
|
|
- The size of the output image (in pixel units)
|
|
|
|
imsize width height
|
|
|
|
- The 'background' color (using r, g, b components defined on a scale from
|
|
0-1)
|
|
|
|
bkgcolor r g b
|
|
|
|
- A 'material' color (in terms of r, g, b components defined on a scale from
|
|
0-1). The material color should be treated as a state variable, meaning
|
|
that all subsequently-defined objects should use the immediately-preceding
|
|
material color
|
|
|
|
mtlcolor r g b
|
|
|
|
- A sequence of one or more objects. For this assignment, your program is
|
|
only required to be able to handle spheres. In subsequent assignments you
|
|
will be asked to extend your code to handle triangles, so you will want to
|
|
write your code with this future extension in mind. A sphere should be
|
|
defined by the coordinates of its center point (a 3D point in space) and
|
|
radius.
|
|
|
|
sphere cx cy cz r
|
|
|
|
- If you would like to attempt the extra credit portion of this assignment,
|
|
please use this format to define a parallel projection
|
|
|
|
projection parallel
|
|
|
|
- If you would like to attempt the extra credit portion of this assignment,
|
|
please use this format to define a finite cylinder (without endcaps) that
|
|
is centered at the point (cx, cy, cz) and oriented in the direction (dirx,
|
|
diry, dirz).
|
|
|
|
cylinder cx cy cz dirx diry dirz radius length
|
|
|
|
2. Define an array of sufficient size to store the color values of your image.
|
|
|
|
3. Using knowledge of the view origin, viewing direction, up direction,
|
|
horizontal field of view and desired image aspect ratio, define an
|
|
appropriate “viewing window” in world coordinate space, and a 1-1 mapping
|
|
between points within this viewing window and pixel locations in your output
|
|
image.
|
|
|
|
4. For each pixel in the output image:
|
|
|
|
- Define the equation of the ray that begins at the view origin and passes
|
|
through the corresponding 3D point in the viewing window
|
|
- Then, for each object in the scene:
|
|
- Determine whether the current viewing ray intersects that object, and if
|
|
so at what point or points
|
|
- If there are one or more ray/object intersection points that are 'in
|
|
front of' the view origin with respect to the positive viewing
|
|
direction, determine which of them is closest to the view origin,
|
|
remembering that ray/object intersection points that are 'behind' the
|
|
view origin, with respect to the viewing direction, should be ignored
|
|
- Determine the color of the object at the closest forward ray/object
|
|
intersection point, if there is one, and return that value to be stored
|
|
at the appropriate location in your image array
|
|
- If no ray/object intersection is found, return the background color
|
|
|
|
5. After all of the rays have been cast and a color has been determined for
|
|
each pixel in the output image, write the final image to an output file,
|
|
using the ascii PPM format.
|
|
|
|
You are strongly encouraged to begin with a very simple scene description,
|
|
consisting for example of a single sphere located directly in front of the eye
|
|
in the direction of view. You are also advised to begin by using a very small
|
|
image size, to expedite the debugging process.
|
|
|
|
To explore the effects of various scene parameters, you are advised to start by
|
|
varying the values of just one viewing parameter at a time, such as: the eye
|
|
position, the viewing direction, the direction of the 'up' vector, the vertical
|
|
field of view, the image aspect ratio, etc. Once you understand the effect of
|
|
each parameter in isolation, you should experiment with combinations of changes,
|
|
such as: co-varying the field of view and the proximity of the eye to the
|
|
objects in your scene. Your ability to appreciate the effects of different view
|
|
settings will be improved if you use a relatively complex but intuitively
|
|
organized scene, with some asymmetric features and not too much empty space. One
|
|
example is: spheres centered at each of the 8 corners of a cube, using different
|
|
colors for each corner, or cylinders arranged along each of the 12 edges of a
|
|
cube.
|
|
|
|
### What you should turn in
|
|
|
|
- All of your source code, clearly commented, plus a ~~readme file with
|
|
compiling instructions or a~~ Makefile or CMake file that the TA can use to
|
|
compile your code.
|
|
- One "showcase" image produced by your program, that I can share with the rest
|
|
of the class. To save time for the TA, we would be grateful if you could
|
|
provide this image in a format that is supported for direct display in Google
|
|
Slides or Powerpoint.
|
|
- A 1-3 page writeup (including pictures) in which you discuss your observations
|
|
on how the key viewing parameters affect the appearance of the rendered scene.
|
|
Please incorporate sufficient images produced by your ray casting program to
|
|
illustrate and explain your findings. In your writeup, be sure to specifically
|
|
address each of these three points:
|
|
- How does the apparent rotation of the scene with respect to the viewpoint
|
|
change with changes in the direction of the 'up' vector?
|
|
- How do changes in the field of view settings affect the appearance of the
|
|
scene in your rendered image?
|
|
- How can the viewing parameters (e.g. the camera location, field of view
|
|
settings, …) be adjusted to achieve a less exaggerated vs more exaggerated
|
|
amount of apparent perspective distortion in your image?
|
|
- Please submit all of the above as a single zip file, containing appropriate
|
|
subfolders, using the naming convention hw1a.firstname.lastname.zip. Please
|
|
do not use tar or rar or any other alternative compression mode that could
|
|
complicate the grading process for the TA.
|
|
|
|
---
|
|
|
|
Two sample input files with their corresponding output images are provided in
|
|
the Files directory of this Canvas website. Please feel free to use these
|
|
examples to partially check the functionality of your program. We will be
|
|
testing your code on additional input files.
|