Example #1
0
    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)
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
    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)
Example #7
0
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
Example #8
0
    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)
Example #9
0
    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)
Example #10
0
    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)
Example #11
0
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)
Example #12
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)
Example #13
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)
Example #14
0
    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)
Example #15
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)
Example #16
0
 def __init__(self, origin: Vec3, dir: Vec3):
     self.origin = origin
     self.dir = dir.normalize()
Example #17
0
            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 ',
Example #18
0
    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))
Example #19
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)