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
// 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!