def prepare_computations(intersection, ray, xs=None): c = comps() c.t = intersection.t c.object = intersection.object c.point = position(ray, c.t) c.eyev = -ray.direction c.normalv = normal_at(c.object, c.point) if dot(c.normalv, c.eyev) < 0: c.inside = True c.normalv = -c.normalv else: c.inside = False c.over_point = c.point + c.normalv * EPSILON c.under_point = c.point - c.normalv * EPSILON c.reflectv = reflect(ray.direction, c.normalv) containers = [] if xs: for i in xs: if i == intersection: if len(containers) == 0: c.n1 = 1.0 else: c.n1 = containers[-1].material.refractive_index if i.object in containers: containers.remove(i.object) else: containers.append(i.object) if i == intersection: if len(containers) == 0: c.n2 = 1.0 else: c.n2 = containers[-1].material.refractive_index break return c
print("Starting render...") for y in range(canvas_pixels): world_y = half - pixel_size * y for x in range(canvas_pixels): world_x = -half + pixel_size * x pos = point(world_x, world_y, wall_z) r = ray(ray_origin, normalize(pos - ray_origin)) xs = intersect(shape, r) if hit(xs) is not None: pnt = position(r, xs[0].t) normal = normal_at(xs[0].object, pnt) eye = -r.direction color = lighting(xs[0].object.material, xs[0].object, light, pnt, eye, normal) write_pixel(canvas, x, y, color) end = time.time() print("Finished render.") print(str(round(end - start, 2)) + "s") start = time.time() print("Start writing file...") canvas_to_ppm(canvas).write_file("images/sphere.ppm") end = time.time() print("Finished writing file.")
def step_impl(context): assert position(context.r, -1) == point(1, 3, 4)
def step_impl(context): assert position(context.r, 2.5) == point(4.5, 3, 4)
def step_impl(context): assert position(context.r, 0) == point(2, 3, 4)