Last active
December 29, 2015 17:39
-
-
Save danoli3/7705436 to your computer and use it in GitHub Desktop.
Ray Tracer Stereo Snippets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Implement the following virtual functions in your camera classes. | |
*/ | |
/** Pinhole.h */ | |
render_stereo(const World& w, float x, int pixel_offset, const std::vector<Pixel>& pixels); | |
/** Pinhole.cpp */ | |
// ---------------------------------------- render_stereo function | |
void | |
Pinhole::render_stereo(const World& w, float x, int pixel_offset, const std::vector<Pixel>& pixels) { | |
RGBColor L; | |
ViewPlane vp(w.vp); | |
Ray ray; | |
int depth = 0; // recusrion depth | |
Point2D sp; // sample point in [0,1] x [0,1] | |
Point2D pp; // sample point on a pixel | |
vp.s /= zoom; | |
ray.o = eye; | |
list<RenderedPixel> render; // for send every row | |
RenderedPixel pixel; // " | |
int count = 0; | |
int jump = 0; | |
for(int i = 0; i< pixels.size(); i++) | |
{ | |
Pixel screen_pixel = pixels[i]; | |
L = black; | |
int sp_count = 0; | |
int sp_jump = 0; | |
for (int j = 0; j < vp.num_samples; j++) | |
{ | |
sp = vp.sampler_ptr->sample_unit_square(sp_count, sp_jump); | |
pp.x = vp.s * (screen_pixel.x - 0.5 * vp.hres + sp.x) + x; // asymmetric view frustum | |
pp.y = vp.s * (screen_pixel.y - 0.5 * vp.vres + sp.y); | |
ray.d = get_direction(pp); | |
L += w.tracer_ptr->trace_ray(ray, depth, count, jump); | |
} | |
L /= vp.num_samples; | |
L *= exposure_time; | |
pixel.color = L; // for send every row | |
pixel.xy = Point2D(screen_pixel.x + pixel_offset,screen_pixel.y); // " | |
render.push_back(pixel); | |
if(w.stop_rendering()) // if the program is asked to close, we need end this now | |
{ w.display_pixel(render); | |
render.clear(); | |
return; } | |
if(w.render_display() == EVERY_PIXEL) | |
{ w.display_pixel(render); // send to the screen buffer every pixel rendered | |
render.clear(); | |
} | |
else if(w.render_display() == EVERY_ROW) | |
{ | |
if(i % (pixels.size()/10) == 0) | |
{ | |
w.display_pixel(render); // send to the screen buffer every pixel rendered | |
render.clear(); | |
} | |
} | |
} | |
if(w.render_display() == EVERY_JOB || w.render_display() == EVERY_ROW) | |
{ w.display_pixel(render); // send to the screen buffer every row of pixels rendered | |
render.clear(); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//StereoCamera.h | |
// ----------------------------------------------------------------------------- | |
virtual void | |
render_scene(const World& w, const std::vector<Pixel>& pixels); | |
// ----------------------------------------------------------------------------- | |
//StereoCamera.cpp | |
/*** | |
Also make sure to set the bool "stereo" to true in the following places: | |
- default contructor | |
- overloaded constructor | |
- copy constructor | |
- assignment operator | |
Like so: | |
stereo = true; | |
( stereo is defined in the Camera.h class ) | |
*/ | |
// ----------------------------------------------------------------------------- render_scene - MT | |
void | |
StereoCamera::render_scene(const World& w, const std::vector<Pixel>& pixels) | |
{ | |
double r = eye.distance(lookat); | |
double x = r * tan(0.5 * beta * PI_ON_180); | |
if (viewing_type == parallel) { | |
left_camera_ptr->render_stereo(w, x, 0, pixels); // left view on left | |
right_camera_ptr->render_stereo(w, -x, w.vp.hres + offset, pixels); // right view on right | |
} | |
if (viewing_type == transverse) { | |
right_camera_ptr->render_stereo(w, -x, 0, pixels); // right view on left | |
left_camera_ptr->render_stereo(w, x, w.vp.hres + offset, pixels); // left view on right | |
} | |
} | |
//------------------------------------- |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment