def test_add(self): v1 = Vec3(1, 2, 3) v2 = Vec3(10, 20, 30) v3 = v1 + v2 self.assertEqual(v3.r, 11) self.assertEqual(v3.g, 22) self.assertEqual(v3.b, 33) self.assertEqual(v1.r, 1)
def test_div_vec(self): v2 = Vec3(5, 20, 24) v1 = Vec3(5, 4, 3) v2 /= v1 self.assertEqual(v2.r, 1) self.assertEqual(v2.g, 5) self.assertEqual(v2.b, 8) self.assertEqual(v1.r, 5) self.assertEqual(v1.g, 4)
def test_mul_vec(self): v = Vec3(1, 2, 3) v2 = Vec3(3, 4, 5) v3 = v * v2 self.assertEqual(v3.r, 3) self.assertEqual(v3.g, 8) self.assertEqual(v3.b, 15) self.assertEqual(v.r, 1) self.assertEqual(v2.r, 3)
def test_sub(self): v1 = Vec3(1, 2, 3) v2 = Vec3(10, 20, 30) v3 = v2 - v1 self.assertEqual(v3.r, 9) self.assertEqual(v3.g, 18) self.assertEqual(v3.b, 27) self.assertEqual(v1.r, 1) self.assertEqual(v2.r, 10)
def test_isub(self): v1 = Vec3(1, 2, 3) v2 = Vec3(10, 20, 30) v2 -= v1 self.assertEqual(v2.r, 9) self.assertEqual(v2.g, 18) self.assertEqual(v2.b, 27) self.assertEqual(v1.r, 1) self.assertEqual(v1.g, 2) self.assertEqual(v1.b, 3)
def test_iadd(self): v1 = Vec3(1, 2, 3) v2 = Vec3(10, 20, 30) v1 += v2 self.assertEqual(v1.r, 11) self.assertEqual(v1.g, 22) self.assertEqual(v1.b, 33) self.assertEqual(v2.r, 10) self.assertEqual(v2.g, 20) self.assertEqual(v2.b, 30)
def color(ray_, world, depth): assert isinstance(world, HitableList) hit, rec = world.hit(ray_, 0.001, 99999999999) if hit: b, attenuation, scattered = rec.material.scatter(ray_, rec) if depth < 50 and b: return attenuation * color(scattered, world, depth + 1) else: return Vec3(0, 0, 0) else: unit_dir = unit_vector(ray_.direction) t = 0.5 * (unit_dir.y + 1.0) return Vec3(1, 1, 1) * (1.0 - t) + Vec3(0.5, 0.7, 1.0) * t
def test_mul_scalar(self): v = Vec3(1, 2, 3) v2 = v * 2 self.assertEqual(v2.r, 2) self.assertEqual(v2.g, 4) self.assertEqual(v2.b, 6) self.assertEqual(v.r, 1)
def test_div_scalar(self): v = Vec3(10, 20, 30) v2 = v / 2 self.assertEqual(v2.r, 5) self.assertEqual(v2.g, 10) self.assertEqual(v2.b, 15) self.assertEqual(v.r, 10)
def __init__(self, origin: Vec3, focal_length: float, view_dir: Vec3, l: int, r: int, b: int, t: int): self.origin = origin self.focal_length = focal_length self.view_dir = view_dir.normalize() self.l = l self.r = r self.b = b self.t = t # Construct coordienate frame for camera (2.4.7) self.w = self.view_dir.scale(-1) up_vector = Vec3(0, 0, 1) self.u = up_vector.cross(self.w) self.u = self.u.normalize() self.v = self.w.cross(self.u)
def rayColor(ray: Ray, objects: list, depth: int, obj_ignore: Surface): if depth == 5: return (0, 0, 0) obj_hit, t, n = hit(ray, objects, obj_ignore) if (obj_hit): lightsource = Vec3(-50, 20, 50) lightsource_dir = (lightsource - ray.getPoint(t)).normalize() shadow_ray = Ray(ray.getPoint(t), lightsource_dir) SHADOWED = False # hex_fill = None for o in objects: res = o.hit(shadow_ray) if (res[0]): SHADOWED = True break if (not SHADOWED): h = ((ray.dir.scale(-1)) + lightsource_dir).normalize() reflection_dir = ray.dir - n.scale(2*ray.dir.dot(n)) reflection = Ray(ray.getPoint(t), reflection_dir) rec_ref = rayColor(reflection, objects, depth+1, obj_hit) Lr = min(int((0.1 * 4.5 * max(0, n.dot(lightsource_dir)) + 0.5 * 4.5 * max(0, n.dot(h)**8) + 2*rec_ref[0]/255) * 255), 255) Lg = min(int((0.3 * 3 * max(0, n.dot(lightsource_dir)) + 0.5 * 3 * max(0, n.dot(h)**8) + 2*rec_ref[1]/255) * 255), 255) Lb = min(int((0.6 * 0.3 * max(0, n.dot(lightsource_dir)) + 0.5 * 0.3 * max(0, n.dot(h)**8) + 2*rec_ref[2]/255) * 255), 255) return (Lr, Lg, Lb) else: h = ((ray.dir.scale(-1)) + lightsource_dir).normalize() # print(ray.getPoint(t)) Lr = min(int(0.1 * 4.5 * max(0, n.dot(lightsource_dir)) * 255), 255) Lg = min(int(0.3 * 3 * max(0, n.dot(lightsource_dir)) * 255) , 255) Lb = min(int(0.3 * 0.3 * max(0, n.dot(lightsource_dir)) * 255) , 255) return (Lr, Lg, Lb) return (0 , 0, 0)
def test_init(self): v1 = Vec3(1, 2, 3) self.assertEqual(v1.r, 1.0) self.assertEqual(v1.g, 2.0) self.assertEqual(v1.b, 3.0)
def initUI(self): self.master.title("ray tracing test") self.pack(fill=BOTH, expand=1) canvas = Canvas(self) canvas.create_rectangle((5, 5)*2, outline="", fill="#8c8c8c") # def __init__(self, origin: Vec3, focal_length: float, view_dir: Vec3, l: int, r: int, b: int, t: int): cam_pos = Vec3(0,10,-20) cam_dir = Vec3(0,1,0.1) cam = Camera(cam_pos, 100, cam_dir, -WIDTH//2, WIDTH//2, -HEIGHT//2, HEIGHT//2) objects = [] # sphere = Sphere(Vec3(0, 100, 0), 50) objects.append(Sphere(Vec3(0, 100, 0), 50)) objects.append(Sphere(Vec3(-12, 60, -20), 10)) objects.append(Sphere(Vec3(-12, 60, 20), 10)) objects.append(Sphere(Vec3(12, 60, 20), 10)) objects.append(Sphere(Vec3(-12, 80, 40), 10)) objects.append(Triangle(Vec3(0, 60, -30), Vec3(40, 60, -20), Vec3(10, 60, 10))) objects.append(Triangle(Vec3(0, 60, -30), Vec3(10, 40, -50), Vec3(40, 60, -20))) objects.append(Sphere(Vec3(-35, 34, 34), 5)) objects.append(Triangle(Vec3(-50, 20, -80), Vec3(50, 20, -80), Vec3(-50, 200, -80))) objects.append(Triangle(Vec3(50, 20, -80), Vec3(50, 200, -80), Vec3(-50, 200, -80))) objects.append(Triangle(Vec3(-50, 20, 100), Vec3(-50, 200, 100), Vec3(50, 20, 100))) objects.append(Triangle(Vec3(50, 20, 100), Vec3(-50, 200, 100), Vec3(50, 200, 100))) for i in range(0, WIDTH): for j in range(0, HEIGHT): ray = cam.compute_ray(i, j, WIDTH, HEIGHT) Lr, Lg, Lb = rayColor(ray, objects, 0, None) Lr = hex(Lr)[2:] Lg = hex(Lg)[2:] Lb = hex(Lb)[2:] if len(Lr) == 1: Lr = '0'+ Lr if len(Lg) == 1: Lg = '0'+ Lg if len(Lb) == 1: Lb = '0'+ Lb hex_fill = '#' + Lr + Lg + Lb canvas.create_rectangle((i, j)*2, outline="", fill=hex_fill) canvas.pack(fill=BOTH, expand=1)
def test_squared_length(self): v = Vec3(1, 2, 3) self.assertEqual(v.squared_length(), 14.0) v = Vec3(1, -2, 3) self.assertEqual(v.squared_length(), 14.0)
def test_unit_vector(self): v = Vec3(5, 10, 20) u = v.unit_vector() self.assertEqual(u.r, 0.25) self.assertEqual(u.g, 0.50) self.assertEqual(u.b, 1.0)
def __init__(self, origin: Vec3, dir: Vec3): self.origin = origin self.dir = dir.normalize()
return attenuation * color(scattered, world, depth + 1) else: return Vec3(0, 0, 0) else: unit_dir = unit_vector(ray_.direction) t = 0.5 * (unit_dir.y + 1.0) return Vec3(1, 1, 1) * (1.0 - t) + Vec3(0.5, 0.7, 1.0) * t if __name__ == '__main__': nx = 200 ny = 100 ns = 100 lower_left = Vec3(-2, -1, -1) horizontal = Vec3(4, 0, 0) vertical = Vec3(0, 2, 0) origin = Vec3(0, 0, 0) world = HitableList() world.append(Sphere(Vec3(0, 0, -1), 0.5, Lambertian(Vec3(0.8, 0.3, 0.3)))) world.append( Sphere(Vec3(0, -100.5, -1), 100, Lambertian(Vec3(0.8, 0.8, 0.0)))) world.append( Sphere(Vec3(1, 0, -1), 0.5, Metal(Vec3(0.8, 0.6, 0.2), fuzz=0.3))) world.append( Sphere(Vec3(-1, 0, -1), 0.5, Metal(Vec3(0.8, 0.8, 0.8), fuzz=1.0))) cam = Camera() pbar = ProgressBar( widgets=['Percentage ',
def test_length(self): v = Vec3(1, 2, 3) self.assertEqual(v.length(), math.sqrt(14.0)) v = Vec3(1, 2, -3) self.assertEqual(v.length(), math.sqrt(14.0))
def __init__(self): self.lower_left = Vec3(-2, -1, -1) self.horizontal = Vec3(4.0, 0, 0) self.vertical = Vec3(0, 2, 0) self.origin = Vec3(0, 0, 0)