Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.2 9/18/84; site gcc-bill.ARPA Path: utzoo!linus!philabs!cmcl2!harvard!gcc-bill!brad From: brad@gcc-bill.ARPA (Brad Parker) Newsgroups: net.graphics Subject: Re: ray casting (far too long...) Message-ID: <318@gcc-bill.ARPA> Date: Mon, 16-Sep-85 23:14:44 EDT Article-I.D.: gcc-bill.318 Posted: Mon Sep 16 23:14:44 1985 Date-Received: Fri, 20-Sep-85 01:06:21 EDT References: <1858@bmcg.UUCP> Reply-To: brad@gcc-bill.UUCP (Brad Parker) Organization: General Computer Company, Cambridge Ma (Home of the HyperDrive) Lines: 65 Summary: In article <1858@bmcg.UUCP> fredc@bmcg.UUCP (Fred Cordes) writes: > > I first saw ray casting/ray tracing at SIGGRAPH 83. I listened to James > Kajiya's paper... (He's only one crazy enough to ray trace fractals!) > The problem is I can't get a handle on how objects are described when they're > ray traced. > Thanks much, Fred Cordes This will probably be one of 10,000 replies, and I probably am the last who should try and explain this, but after listening to Turner Witted last year, I went out and wrote code to do this... The idea I use to explain this is a so called "pin hole camera". Imagine a camera which is made from a shoe box. The "film" is taped to one end of the inside of the box, and a small "pin hole" is made in the other end. All light stiking the film passes through the small hole. Your code creates an "image plane" which corresponds to the film. An easy way to do this is to create an array in which each element corresponds to one pixel. Your code sends a "ray" from each element in the array (or pixel) through the "pin hole" into the object space. When the ray hits and object in the object space, you calculate the intensity of the light at the intersection point and color the pixel in the array. Rays are described as a starting point and a direction. The starting point is easy (x in array, y in array, z = -(distance from image plane to pin hole)). The direction is a vector from the image plane point towards the pin hole. To find intersections in the image plane, you must describe each object in such as way that you can find the intersection of the object and a line described as a point and direction vector. Start with a sphere (ever wonder why so many ray traced pictures have spheres in them?). x**2 + y**2 + z**2 = r**2. Describe your ray as x = x0+x1*t, y = y0+y1*t, z = z0+z1*t. (x0, y0, z0) is the starting point and (x1,y1,z1) is th direction vector. Substitute the ray as a function of t into the equation of a sphere. Solve for t. Once you have the algebraeic eqation for the intersectoin in t, you are set. For each ray, solve for t. If t is real (not imaginary), you have an intersetion. Substitute t back into the ray equation and find the 3d point of the intersection. At this point, it is wise to calculate the normal vector at the point of intersection, as this is critical to calculating the illumination value (this is done by taking partial derivatives of the sphere equation in x,y, and z). See any good graphics text on this. You should also send a ray toward the light source to determine if the intersection point is in a shadow or is directly illuminated. There you have it, simple ray tracing (sorry to those who already know this). Other objects are similar, you need only determine a method of solving for for the intersection "t" alongs the ray and determine the normal vector at the point of intersection. Turner Whitted supposedly published some "cook book" code for this whole process at this year's SIGRAPH. You can produce code which treats the "image plane" as a normalized coordinate space (-1 < x < 1 and -1 < y < 1) and map the resultant pixel locations into your bitmap. Doing things in a normalized way has many advantages. Good Luck. Ps: Your pictures will probably come out upside down the first time. I assume this is homage paid to some graphics diety who no doubt resides somewhere in Utah ;-) (wow - did I really type all this?) -- J Bradford Parker uucp: seismo!harvard!gcc-bill!brad "She said you know how to spell AUDACIOUSLY? I could tell I was in love... You want to go to heaven? or would you rather not be saved?" - Lloyd Coal Brought to you by Super Global Mega Corp .com