Sign in to follow this  

Requesting Ray Tracing Help

This topic is 3933 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello, I am new to these forums, and I have joined to get some help with my ray tracer. I started it just recently, and I've found a number of good resources on the internet, which have allowed me to get some very very very basic results (i.e. rendering a sphere in just a flat color). I mainly followed this tutorial: http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtexamp1.htm and it gave me these results: As you can see, the sphere is off-center, even though its origin is (0, 0, 10) and the "camera" is located at (0, 0, -10). The algorithm I used is exactly the same as the one described in the siggraph site (linked above) and I double- and triple-checked my vector math. My code, specifically, is as follows:
double worldx = left, 
       worldy = top, 
       dxpp = (right - left) / ((double) width), // change in x per pixel 
       dypp = (bottom - top) / ((double) height); // change in y per pixel 
vector3 orig(0, 0, -10); 

for(y = 0; y < height; y ++) 
{ 
   worldx = left; 
   for(x = 0; x < width; x ++) 
   { 
      // form direction vector 
      vector3 dir = vector3(worldx + (.5 + x) * dxpp, 
                            worldy + (.5 + y) * dypp, 0) - orig; 

      // normalize vector 
      dir.normalize(); 

      // Make the ray 
      Ray ray(orig, dir); 

      for(i = 0; i < numObjects; i ++) 
      { 
         if(objects[i]->Intersect(ray) > 0) 
         { 
            Color c = objects[i]->getMaterial()->getColor(); 
            DrawPixel(screen, x, y, c.r, c.g, c.b); 
         } 
      } 

      worldx += dxpp; 
   } 
   worldy += dypp; 
}
When worldx and worldy are (practically) zero, x and y are width/2 and height/2 respectively. That means that it should draw the pixel at the center of the sphere (since the sphere is located at 0, 0, 10) in the center of the screen... but as you can see, such is not the case. I noticed that it's basically scrunching the sphere into half the space both vertically and horizontally, so I tried:
       dxpp = (right - left) / ((double) width * 2), // change in x per pixel 
       dypp = (bottom - top) / ((double) height * 2); // change in y per pixel
and it fixed the problem... but I don't understand why and it doesn't seem right to me. Also, I seem to have a problem with the perspective. Spheres with origins along the z-axis are OK, but the more it moves away from the z-axis, the more it gets distorted: The tutorials I am following make no mention of this... so I'm not really sure what's going on/how to fix it. Any help is appreciated! -Yoshi

Share this post


Link to post
Share on other sites
I don't see why you increment worldx and worldy at the end of each loop. Those should stay constant, and only x and y should be changing to indicate the "sweeping" movement of the ray. I imagine your view plane is off-centered too because of your values for left/right/top/bottom.

So for starters, get rid of worldx += dxpp and worldy += dypp. This should eliminate a bunch of problems. Then try view parameters: left = -25, right = 25, top = -25, bottom = 25. These are world-space coordinates, on the Z = 0 plane, so if you center them around the origin then your sphere will appear centered. Also verify that the sphere intersection code is correct.

Let us know if this helps. I might not be able to reply again until Friday but I'm sure another resident math person can help you out.

Share this post


Link to post
Share on other sites
I think Zipster is right. As for the distortion, it is a normal effect. To reduce this you should change the FOV of the camera.
For a good RT tutorial, see this

Share this post


Link to post
Share on other sites

This topic is 3933 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this