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
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
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)))
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)
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
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