Example #1
0
 def scatter(self, r_in, rec):
     reflected = reflect(r_in.direction(), rec.record[2])
     attenuation = vec3(1.0, 1.0, 1.0)
     
     if (vec3.dot(r_in.direction(), rec.record[2]) > 0):
         outworld_normal = -rec.record[2]
         ni_over_nt = self.ref_idx
         cosine = self.ref_idx * vec3.dot(r_in.direction(), rec.record[2]) / r_in.direction().length()
     else:
         outworld_normal = rec.record[2]
         ni_over_nt = 1.0 / self.ref_idx
         cosine = -vec3.dot(r_in.direction(), rec.record[2]) / r_in.direction().length()
     
     isok, refracted = refract(r_in.direction(), outworld_normal, ni_over_nt)
     if isok:
         reflect_prob = schlick(cosine, self.ref_idx)   
     else:
         reflect_prob = 1.0
         
     if random.random() < reflect_prob:
         scattered = ray(rec.record[1], reflected)
     else:
         scattered = ray(rec.record[1], refracted)
         
     return True, scattered, attenuation
Example #2
0
def render(width=200, height=100):
    hor_size = 4.0
    ver_size = hor_size * 0.5
    line = []
    # Preload function
    line_append = line.append
    frame = []
    # Preload function
    frame_append = frame.append
    nx = width
    ny = height
    lower_left_corner = vec3(-(hor_size / 2.0), -(ver_size / 2.0), -1.0)
    horizontal = vec3(hor_size, 0.0, 0.0)
    vertical = vec3(0.0, ver_size, 0.0)
    origin = vec3(0.0, 0.0, 0.0)

    for j in range(ny - 1, -1, -1):
        line.clear()
        v = float(j) / float(ny)
        for i in range(nx):
            u = float(i) / float(nx)
            r = ray(origin, lower_left_corner + u * horizontal + v * vertical)
            col = color(r)
            #pix = vec3(int(255.99 * col.r), int(255.99 * col.g), int(255.99 * col.b))
            #line.append([pix.x, pix.y, pix.z])
            # line.append([int(255.99 * col.r), int(255.99 * col.g), int(255.99 * col.b)])
            line_append([
                int(255.99 * col.r),
                int(255.99 * col.g),
                int(255.99 * col.b)
            ])
        # frame.append(line.copy())
        frame_append(line.copy())
    return frame
Example #3
0
    def __init__(self, win, pos):
        self.win = win
        self.pos = vector2D(pos)
        self.rays = []
        self.moveDist = 0.5
        self.fov = 90
        self.offset = 0

        for angle in range(-self.fov // 2, self.fov // 2):
            self.rays.append(ray(self.win, self.pos, math.radians(angle)))
Example #4
0
 def get_ray(self, s, t):
     rd = self.lens_radius * random_in_unit_disk()
     offset = self.u * rd.x() + self.v * rd.y()
     return ray(
         self.origin + offset, self.lower_left_corner +
         s * self.horizontal + t * self.vertical - self.origin - offset)
Example #5
0
 def scatter(self, r_in, rec):
     target = rec.record[1] + rec.record[2] + random_in_unit_sphere()
     scattered = ray(rec.record[1], target - rec.record[1])
     return True, scattered, self.albedo
Example #6
0
 def scatter(self, r_in, rec):
     reflected = reflect(vec3.unit_vector(r_in.direction()), rec.record[2])
     scattered = ray(rec.record[1], reflected + self.fuzz*random_in_unit_sphere())
     isok = (vec3.dot(scattered.direction(), rec.record[2]) > 0)
     return isok, scattered, self.albedo