This will be an extremely simple assignment, just to set up the basic framework of ray tracing.

As we discussed in class,
you can form a ray from a camera
into a scene for every pixel
of the image.
The ray goes from
**v** = [v_{x},v_{y},v_{z}]
into direction
**w** = [w_{x},w_{y},w_{z}].

We can just place the camera eyepoint at the origin,
so the first **v** will be [0,0,0].
Of course, when we start bouncing rays off of
objects to get reflections, shadows, etc.,
then **v** will take on all sorts of values.

You can calculate **w** for any pixel (i,j)
by placing the image into the scene
as sort of film plane, as we discussed
in class. You can put it along the z axis,
at z = -focalLength.
Remember, the smaller the value you choose
for focalLength, the more wide angle will be the view.
You will get reasonable looking pictures at focalLength values
of around 3.

If your image has W columns by H rows, then you can create the ray at each pixel by:

v[0] = 0; v[1] = 0; // CAMERA EYEPOINT IS AT THE ORIGIN v[2] = 0; for (int i = 0 ; i < W ; i++) // LOOP OVER IMAGE COLUMNS for (int j = 0 ; j < H ; j++) { // LOOP OVER IMAGE ROWS w[0] = (double)(i - W/2) / (W/2); // COMPUTE RAY DIRECTION AT EACH PIXEL w[1] = (double)(H/2 - j) / (W/2); // w[2] = -focalLength; // PLACE IMAGE PLANE AT z=-focalLength /* image[i][j] = rayTrace(v, w); // COMPUTE COLOR AT PIXEL BY RAY TRACING */ g.setColor(rayTrace(v,w)); g.fillRect(i,j,1,1); }

Given a ray **v**,**w**,
and a collection of spheres, each of
which is described by center coordinates and radius
[c_{x},c_{y},c_{z},r],
we can figure out which sphere the ray hits
(if any) as follows:

- Set t = infinity
- Set color = bgColor
- Loop through all the spheres. For each sphere S
_{n}- Try to intersect the ray with S
_{n}, to get t_{n}; - If the ray intersects S
_{n}at t_{n}, and t_{n}< t, then this is the nearest sphere, so:- Set t = t
_{n} - Set color = color of S
_{n}

- Set t = t

- Try to intersect the ray with S

For now, make all your spheres a single solid color, since you're only going to check to see whether you can get the above logic to work.

As we discussed in class, you can
intersect ray **v**,**w** with sphere

(x-cby substituting (v_{x})^{2}+ (y-c_{y})^{2}+ (z-c_{z})^{2}= r^{2}

When you do this you'll get some quadratic
equation in t.
There are two possibilities:
Either
*(i)*
this equation will have no real roots
(which means the ray missed the sphere entirely),
or else
*(ii)*
the equation will have two roots,
which means the ray has indeed hit the sphere.
In this case, the value of t that you want is the smaller of these two roots,
because that's where ray hits the *front* of the
sphere.

So let's do this substitution:

( vMultiplying this out, we get:_{x}+ t w_{x}- c_{x})^{2}+ ( v_{y}+ t w_{y}- c_{y})^{2}+ ( v_{z}+ t w_{z}- c_{z})^{2}= r^{2}

(v_{x}-c_{x})^{2}+ 2 (v_{x}-c_{x})w_{x}+ t^{2}w_{x}^{2}+ (v_{y}-c_{y})^{2}+ 2 (v_{y}-c_{y})w_{y}+ t^{2}w_{y}^{2}+ (v_{z}-c_{z})^{2}+ 2 (v_{z}-c_{z})w_{z}+ t^{2}w_{z}^{2}= r^{2}

This can be written as the quadratic equation At^{2} + Bt + C = 0, by rearranging terms:

A = w_{x}^{2}+ w_{y}^{2}+ w_{z}^{2},

B = 2 (v_{x}-c_{x})w_{x}+ 2 (v_{y}-c_{y})w_{y}+ 2 (v_{z}-c_{z})w_{z},

C = (v_{x}-c_{x})^{2}+ (v_{y}-c_{y})^{2}+ (v_{z}-c_{z})^{2}- r^{2}

A more compact way of saying this using dot products is:

A =w•wB = 2 (v-c) •wC = (v-c) • (v-c) - r^{2}.

Your job is to come up with an interesting collection of spheres, each of which has a different color, and use the above code and equations to ray trace to them, to produce a picture.

Next week we'll work on the more advanced topics like shading, reflections and shadows.