diff --git a/__pycache__/raytracer.cpython-33.pyc b/__pycache__/raytracer.cpython-33.pyc index 30618db9ed94af2cbefc1ffb44ebb596ab27ebfc..89eb08a1605bcffef331f543624caa5026ea71a1 100644 Binary files a/__pycache__/raytracer.cpython-33.pyc and b/__pycache__/raytracer.cpython-33.pyc differ diff --git a/raytracer.py b/raytracer.py index e6b7538254ee496b7c3c805b0bc90ac9d441a56c..2253a80bbe483f4c139fd781399802ad89c78fbb 100644 --- a/raytracer.py +++ b/raytracer.py @@ -8,7 +8,7 @@ class Ray: self.starting_point = starting_point self.direction = direction -def trace_ray(ray, scene, camera): +def trace_ray(ray, scene, camera, number_iterations = 20): intersect_list = [] distance = float('inf') for o in scene.object_list: @@ -24,7 +24,16 @@ def trace_ray(ray, scene, camera): for light in scene.light_list: # color += phong_illuminate(light, class_intersect.position, class_intersect.normal, class_intersect.object, Vector([0,0,0])) color += compute_light(light, scene, class_intersect, Vector([0,0,0])) - color_object = class_intersect.object.material.color + c_x, c_y, c_z = color.coord() + color = Vector([max(min(c_x, 1), 0), max(0, min(c_y, 1)), max(0, min(c_z,1))]) + if number_iterations > 0: + D, N = ray.direction.normalized(), class_intersect.normal + reflected_direction = D - 2*(D*N)*N + new_ray = Ray(class_intersect.position + 1e-2 * reflected_direction, reflected_direction) + r = class_intersect.object.material.reflection + trace_ray_color = trace_ray(new_ray, scene, camera, number_iterations - 1) + #if trace_ray_color != Vector([0,0,0]): + color = (1 - r)*color + r*trace_ray_color c_x, c_y, c_z = color.coord() return Vector([max(min(c_x, 1), 0), max(0, min(c_y, 1)), max(0, min(c_z,1))]) diff --git a/scenes/reflection.py b/scenes/reflection.py new file mode 100644 index 0000000000000000000000000000000000000000..cde3e1bdd15015c77dbfa529760682662ad46c6d --- /dev/null +++ b/scenes/reflection.py @@ -0,0 +1,23 @@ +# Show to python where to find the modules +import sys +sys.path.append('..') + +from scene import * +from light import Spotlight +from camera import Camera +from raytracer import raytracer_render +from matplotlib.image import imsave +import sys + +camera = Camera(200,200,1) +materiau_sphere_bleue = Material(Vector((0,0,1)), .7, .7, .7, 100, .7) +materiau_sphere_rouge = Material(Vector((1,0,0)), .7, .7, .7, 100, .7) +sphere_bleue = Sphere(Vector([0,0,3]), .8, materiau_sphere_bleue) +sphere_rouge = Sphere(Vector([0.5,0.5,2]), .5, materiau_sphere_rouge) +lumiere = Spotlight(Vector((1,1,0)), Vector((1,1,1))) +scene = Scene() +scene.add_object(sphere_bleue) +scene.add_object(sphere_rouge) +scene.add_light(lumiere) +affiche = raytracer_render(camera, scene) +imsave('two_spheres_reflection.png',affiche) diff --git a/scenes/two_spheres.png b/scenes/two_spheres.png index fc1cbb5af975fb4411ef0fa31dea1e704954f6f4..aca009bc7477dccc24c1f1bbbaa51f2ee7e61e1a 100644 Binary files a/scenes/two_spheres.png and b/scenes/two_spheres.png differ diff --git a/scenes/two_spheres_reflection.png b/scenes/two_spheres_reflection.png new file mode 100644 index 0000000000000000000000000000000000000000..3345277b857a806c034bb22e1094bef0573fbc05 Binary files /dev/null and b/scenes/two_spheres_reflection.png differ