Example #1
0
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])
Example #2
0
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])
Example #3
0
def sphere_normal(sphere, pt):
    return vr.normalize(vr.sub_vector(pt, get_center(sphere)))
Example #4
0
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]