def intersect_lights(scene, lights, pos, normal): # scene, light, vector -> float color = 1 for light in lights: dirn = vr.normalize(vr.sub_vector(lt.get_pos(light), pos)) new_ray = ry.make_ray(pos, dirn) t, n = intersect_scene(scene, new_ray) if not t: dot_or_0 = max([vr.dot_prod(dirn, normal), 0]) incr = dot_or_0 * lt.get_brightness(light) color += incr if color: return min([8, color])
def intersect_sphere(sphere, ray): # sphere a, ray a -> Maybe int dirn = ry.get_dirn(ray) pos = ry.get_pos(ray) center = get_center(sphere) to_center = vr.sub_vector(pos, center) a = vr.dot_prod(dirn, dirn) b = 2*vr.dot_prod(dirn, to_center) c = vr.dot_prod(to_center, to_center) - get_radius(sphere) ** 2 det = b ** 2 - 4 * a * c if det < 0: return None else: t1 = (-b + math.sqrt(det)) / (2*a) t2 = (-b - math.sqrt(det)) / (2*a) return min([t1, t2])
def sphere_normal(sphere, pt): return vr.normalize(vr.sub_vector(pt, get_center(sphere)))
def make_view_geometry(eye, up, center): # (vector a) ** 3 -> seq (vector a) forward = vr.normalize(vr.sub_vector(center, eye)) side = vr.normalize(vr.cross_prod(forward, up)) up = vr.normalize(vr.cross_prod(side, forward)) return [forward, side, up]