示例#1
0
    def test_serialization(self):
        print("\nSpotLight serialization", end="")
        light = SpotLight(Vector3d(0))

        dict = json.loads(repr(light))
        splight = dict["SpotLight"]
        self.assertEqual(splight["Location"], json.loads(repr(Vector3d(0))))
        self.assertEqual(splight["Color"], json.loads(repr(Color(0xffffff))))
        self.assertEqual(splight["Intensity"], 1)
        self.assertEqual(splight["State"], True)
示例#2
0
 def test_tangent(self):
     print("\nTanget ray", end = "")
     sphere = Sphere(Vector3d(0,0,30), 10)
     ray = Ray(Vector3d(10,0,0),Vector3d(0,0,1))
     intersection = IntersectionRecord()
     
     hitted = sphere.hitRay(intersection,ray)
     self.assertEqual(hitted, True)
     self.assertEqual(intersection.distance, 30)
     self.assertEqual(intersection.intersection, Vector3d(10,0,30))
     self.assertEqual(intersection.normal, Vector3d(1,0,0))
示例#3
0
 def test_simple_constructor(self):
     print("\nSimple constructor", end = "")
     cm = ColorMaterial(Color(0x00ff00))
     
     self.assertEqual(cm.color, Color(0x00ff00))
     self.assertEqual(cm.ambient, Vector3d(1,1,1))
     self.assertEqual(cm.diffuse, Vector3d(1,1,1))
     self.assertEqual(cm.specular, Vector3d(1,1,1))
     self.assertEqual(cm.shinines, 1)
     self.assertEqual(cm.reflection, 0)
     self.assertEqual(cm.refraction, 0)
示例#4
0
    def test_ray_box_intersection(self):
        print("\nRay Box Intersection", end="")
        min_corner = Vector3d(-1)
        max_corner = Vector3d(1)
        box = BoundingBox(min_corner, max_corner)
        ray = Ray(Vector3d(0, 0, -3), Vector3d(0, 0, 1))

        intersection = RayBoxIntersectionRecord()
        rayBoxIntersection(ray, box, intersection)
        self.assertEqual(2, intersection.tmin)
        self.assertEqual(4, intersection.tmax)
示例#5
0
 def test_no_intersection(self):
     print("\nNo intersections", end = "")
     sphere = Sphere(Vector3d(0,0,30), 10)
     ray = Ray(Vector3d(0,0,0),Vector3d(0,0,-1))
     intersection = IntersectionRecord()
     
     hitted = sphere.hitRay(intersection,ray)
     self.assertEqual(hitted, False)
     
     ray = Ray(Vector3d(10.0001,0,0),Vector3d(0,0,1))
     hitted = sphere.hitRay(intersection,ray)
     self.assertEqual(hitted, False)
示例#6
0
    def test_containing_point(self):
        print("\nContaining point", end="")
        bb = bbox(Vector3d(0), Vector3d(5))

        self.assertTrue(bb.contains(Vector3d(0)))
        self.assertTrue(bb.contains(Vector3d(5)))
        self.assertTrue(bb.contains(Vector3d(3)))
        self.assertTrue(bb.contains(Vector3d(3, 0, 0)))
        self.assertTrue(bb.contains(Vector3d(0, 3, 0)))
        self.assertTrue(bb.contains(Vector3d(0, 0, 3)))

        self.assertFalse(bb.contains(Vector3d(-1)))
        self.assertFalse(bb.contains(Vector3d(6)))
示例#7
0
    def test_adding_point(self):
        print("\nAdd point", end="")
        bb = bbox()

        bb.addPoint(Vector3d(1))
        self.assertFalse(bb.isValid())

        bb.addPoint(Vector3d(0))
        self.assertTrue(bb.isValid())

        bb.addPoint(Vector3d(0.5))

        self.assertEqual(bb.min, Vector3d(0))
        self.assertEqual(bb.max, Vector3d(1))
示例#8
0
    def test_properties(self):
        print("\nProperties", end="")
        bb = bbox()

        self.assertEqual(bb.min, Vector3d(2147483647))
        self.assertEqual(bb.max, Vector3d(-2147483648))
        self.assertEqual(bb.center, Vector3d(-0.5))

        with self.assertRaises(AttributeError):
            bb.min = Vector3d(0)

        with self.assertRaises(AttributeError):
            bb.max = Vector3d(0)

        with self.assertRaises(AttributeError):
            bb.center = Vector3d(0)

        bb = bbox(Vector3d(0, 1, 2), Vector3d(4, 6, 8))
        self.assertEqual(bb.deltaX, 4)
        self.assertEqual(bb.deltaY, 5)
        self.assertEqual(bb.deltaZ, 6)

        with self.assertRaises(AttributeError):
            bb.deltaX = 0

        with self.assertRaises(AttributeError):
            bb.deltaY = 0

        with self.assertRaises(AttributeError):
            bb.deltaZ = 0
示例#9
0
    def test_simple_example(self):
        print("\nSimple example", end="")
        scene = Scene("example")

        self.assertEqual(scene.name, "example")

        ruby_material = ColorMaterial(Color(255, 0, 0),
                                      Vector3d(0.1745, 0.01175, 0.01175),
                                      Vector3d(0.61424, 0.04136, 0.04136),
                                      Vector3d(0.727811, 0.626959, 0.626959),
                                      76.8)
        sphere = Sphere(Vector3d(0, 0, 0), 10)
        object = RenderableObject(sphere, ruby_material)
        light = SpotLight(Vector3d(10, 10, 10))
        camera = Camera(Vector3d(0, 0, -10), Vector3d(0, 0, 0),
                        Vector3d(0, 1, 0), 60, 4 / 3, 1)

        scene.addObject(object)
        self.assertEqual(scene.objCnt, 1)
        scene.clearObjects()
        self.assertEqual(scene.objCnt, 0)

        scene.addLight(light)
        self.assertEqual(scene.lightCnt, 1)
        self.assertTrue(light.state)
        scene.setOnOffLight(0, False)
        self.assertFalse(light.state)
        scene.clearLights()
        self.assertEqual(scene.lightCnt, 0)

        scene.addCamera(camera)
        self.assertEqual(scene.camCnt, 1)
        scene.clearCameras()
        self.assertEqual(scene.camCnt, 0)
示例#10
0
 def test_two_intersections(self):
     print("\nRay intersects Sphere (two intersections)", end = "")
     sphere = Sphere(Vector3d(0,0,30), 10)
     ray = Ray(Vector3d(0,0,0),Vector3d(0,0,1))
     intersection = IntersectionRecord()
     
     hitted = sphere.hitRay(intersection,ray)
     self.assertEqual(hitted, True)
     self.assertEqual(intersection.distance, 20)
     self.assertEqual(intersection.intersection, Vector3d(0,0,20))
     self.assertEqual(intersection.normal, Vector3d(0,0,-1))
     
     intersection = IntersectionRecord()
     sphere = Sphere(Vector3d(0,0,0), 1)
     x = 1/math.sqrt(2)
     ray = Ray(Vector3d(x,0,-5),Vector3d(0,0,1))
     hitted = sphere.hitRay(intersection,ray)
     self.assertEqual(hitted, True)
     self.assertEqual(intersection.distance, 5-x)
     
     self.assertEqual(round(intersection.intersection.x,12), round(x,12))
     self.assertEqual(intersection.intersection.y, 0)
     self.assertEqual(round(intersection.intersection.z,12), round(-x,12))
     
     self.assertEqual(round(intersection.normal.x,12), round(x,12))
     self.assertEqual(intersection.normal.y, 0)
     self.assertEqual(round(intersection.normal.z,12), round(-x,12))
示例#11
0
    def test_properties(self):
        print("\nProperties", end="")
        light = SpotLight(Vector3d(1))

        light.location = Vector3d(1, 2, 3)
        self.assertEqual(light.location, Vector3d(1, 2, 3))

        light.color = Color(0xff00ff)
        self.assertEqual(light.color, Color(0xff00ff))

        light.intensity = 23
        self.assertEqual(light.intensity, 23)

        light.state = False
        self.assertEqual(light.state, False)
示例#12
0
 def test_get_direction(self):
     print("\nGet direction", end = "")
     camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1)
     
     width, height = 800, 600
     u, v = 400, 300
     actual = camera.direction(u/width,v/height)
     expected = Vector3d(0,0,1)
     self.assertEqual(actual, expected)
     
     temp = camera.direction(0,v/height)
     self.assertTrue(temp.y == 0)
     self.assertTrue(temp.x != 0)
     
     temp = camera.direction(u/width,0)
     self.assertTrue(temp.y != 0)
     self.assertTrue(temp.x == 0)
示例#13
0
    def test_get_functions(self):
        print("\nSpotLight direction at point", end="")
        light = SpotLight(Vector3d(0))

        self.assertEqual(light.direction(Vector3d(1, 0, 0)), Vector3d(1, 0, 0))
        self.assertEqual(light.direction(Vector3d(0, 1, 0)), Vector3d(0, 1, 0))
        self.assertEqual(light.direction(Vector3d(0, 0, 1)), Vector3d(0, 0, 1))
示例#14
0
    def test_normalization_in_constructor(self):
        print("\nConstructor with normalization", end="")
        ray = Ray(Vector3d(0, 0, 0), Vector3d(0, 0, 111))

        self.assertEqual(ray.origin, Vector3d(0, 0, 0))
        self.assertEqual(ray.direction, Vector3d(0, 0, 1))

        ray = Ray(Vector3d(0, 0, 0), Vector3d(1, 1, 1))

        self.assertEqual(ray.origin, Vector3d(0, 0, 0))
        x = 1 / math.sqrt(3)
        self.assertEqual(ray.direction, Vector3d(x, x, x))
示例#15
0
 def test_color_get_functions(self):
     print("\nColorMaterial get color functions", end = "")
     ruby_material = ColorMaterial(Color(255, 0, 0)
                                 , Vector3d(0.1745, 0.01175, 0.01175)
                                 , Vector3d(0.61424, 0.04136, 0.04136)
                                 , Vector3d(0.727811, 0.626959, 0.626959)
                                 , 76.8)
     light = SpotLight(Vector3d(2,0,0))
     light1 = SpotLight(Vector3d(4,0,0))
     
     self.assertEqual(
         ruby_material.primitiveColor(), 
         Color(255,0,0) * Vector3d(0.1745, 0.01175, 0.01175))
     self.assertEqual(
         ruby_material.lightInfluence(Vector3d(0),Vector3d(1,0,0),light), 
         Color(255,0,0) * Vector3d(0.61424, 0.04136, 0.04136))
示例#16
0
    def test_merge(self):
        print("\nMerge of boxes", end="")
        bb1 = bbox(Vector3d(0), Vector3d(1))
        bb2 = bbox(Vector3d(0.5), Vector3d(1.5))

        bb1.merge(bb2)
        self.assertEqual(bb1.min, Vector3d(0))
        self.assertEqual(bb1.max, Vector3d(1.5))
示例#17
0
    def test_constructor_with_two_parameters(self):
        print("\nMinMax constructor", end="")
        bb = bbox(Vector3d(0), Vector3d(1))

        self.assertEqual(bb.min, Vector3d(0))
        self.assertEqual(bb.max, Vector3d(1))
        self.assertTrue(bb.isValid())

        bb = bbox(Vector3d(1), Vector3d(0))
        self.assertFalse(bb.isValid())
示例#18
0
 def test_serialization(self):
     print("\nCamera serialization", end = "")
     camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1)
     
     dict = json.loads(repr(camera))
     cam = dict["Camera"]
     self.assertEqual(cam["Location"], json.loads(repr(Vector3d(0,0,0))))
     self.assertEqual(cam["LookAt"], json.loads(repr(Vector3d(0,0,1))))
     self.assertEqual(cam["Up"], json.loads(repr(Vector3d(0,1,0))))
     self.assertEqual(cam["FoV"], 60)
     self.assertEqual(cam["Aspect"], round(4/3,6))
     self.assertEqual(cam["FocusDistance"], 1)
示例#19
0
def create_scene_sample(camera_cnt=1, obj_cnt=1, light_cnt=1):
    scene = Scene("example")

    for i in range(camera_cnt):
        scene.addCamera(
            Camera(Vector3d(2 * i + 1, 3 * i + 1, 4 * i + 1),
                   Vector3d(0, 0, 0), Vector3d(0, 1, 0), 60, 4 / 3, 1), True)

    ruby_material = ColorMaterial(Color(255, 0, 0),
                                  Vector3d(0.1745, 0.01175, 0.01175),
                                  Vector3d(0.61424, 0.04136, 0.04136),
                                  Vector3d(0.727811, 0.626959, 0.626959), 76.8)
    for i in range(obj_cnt):
        scene.addObject(
            RenderableObject(Sphere(Vector3d(i * 10), i * 5), ruby_material))

    for i in range(light_cnt):
        scene.addLight(SpotLight(Vector3d(-i * 2, i * 4, i * 5)))

    return scene
示例#20
0
 def test_full_constructor(self):
     print("\nFull constructor", end = "")
     ruby_material = ColorMaterial(Color(255, 0, 0)
                                 , Vector3d(0.1745, 0.01175, 0.01175)
                                 , Vector3d(0.61424, 0.04136, 0.04136)
                                 , Vector3d(0.727811, 0.626959, 0.626959)
                                 , 76.8)
     
     self.assertEqual(ruby_material.color, Color(0xff0000))
     self.assertEqual(ruby_material.ambient, Vector3d(0.1745, 0.01175, 0.01175))
     self.assertEqual(ruby_material.diffuse, Vector3d(0.61424, 0.04136, 0.04136))
     self.assertEqual(ruby_material.specular, Vector3d(0.727811, 0.626959, 0.626959))
     self.assertEqual(ruby_material.shinines, 76.8)
     self.assertEqual(ruby_material.reflection, 0)
     self.assertEqual(ruby_material.refraction, 0)
示例#21
0
    def test_simple_1000_spheres(self):
        scene = Scene("example")

        ruby_material = ColorMaterial(Color(255, 0, 0),
                                      Vector3d(0.1745, 0.01175, 0.01175),
                                      Vector3d(0.61424, 0.04136, 0.04136),
                                      Vector3d(0.727811, 0.626959, 0.626959),
                                      76.8)

        x0 = -15
        y0 = -15
        for i in range(1000):
            x = x0 + i % 30
            y = y0 + i // 30
            z = 0
            r = 0.5
            scene.addObject(
                RenderableObject(Sphere(Vector3d(x, y, z), r), ruby_material))

        scene.addLight(SpotLight(Vector3d(10, 10, -10)))

        scene.addCamera(
            Camera(Vector3d(0, 0, -25), Vector3d(0, 0, 0), Vector3d(0, 1, 0),
                   60, 4 / 3, 1))

        image = Image(scene.frameWidth, scene.frameHeight)

        frames_cnt = 30
        start = time.time()
        for i in range(frames_cnt):
            scene.getFrame(image)
        elapsed = time.time() - start
        print(
            "\n1000 spheres frames per second : Time = {}s, Frames = {}, FPS = {}"
            .format(round(elapsed, 4), frames_cnt,
                    round(frames_cnt / elapsed, 4)),
            end="")
示例#22
0
 def test_serialization(self):
     print("\nColorMaterial serialization", end = "")
     ruby_material = ColorMaterial(Color(255, 0, 0)
                                 , Vector3d(0.1745, 0.01175, 0.01175)
                                 , Vector3d(0.61424, 0.04136, 0.04136)
                                 , Vector3d(0.727811, 0.626959, 0.626959)
                                 , 76.8)
     
     dict = json.loads(repr(ruby_material))
     mat = dict["ColorMaterial"]
     self.assertEqual(mat["Color"], json.loads(repr(Color(255,0,0))))
     self.assertEqual(mat["Ambient"], json.loads(repr(Vector3d(0.1745, 0.01175, 0.01175))))
     self.assertEqual(mat["Diffuse"], json.loads(repr(Vector3d(0.61424, 0.04136, 0.04136))))
     self.assertEqual(mat["Specular"], json.loads(repr(Vector3d(0.727811, 0.626959, 0.626959))))
     self.assertEqual(mat["Shinines"], 76.8)
     self.assertEqual(mat["Reflection"], 0)
     self.assertEqual(mat["Refraction"], 0)
示例#23
0
 def test_deserialization(self):
     print("\nColorMaterial deserialization", end = "")
     ruby_material = ColorMaterial(Color(255, 0, 0)
                                 , Vector3d(0.1745, 0.01175, 0.01175)
                                 , Vector3d(0.61424, 0.04136, 0.04136)
                                 , Vector3d(0.727811, 0.626959, 0.626959)
                                 , 76.8)
     
     dict = json.loads(repr(ruby_material))
     material = ColorMaterial.fromDict(dict)
     self.assertEqual(material.color, Color(255,0,0))
     self.assertEqual(material.ambient, Vector3d(0.1745, 0.01175, 0.01175))
     self.assertEqual(material.diffuse, Vector3d(0.61424, 0.04136, 0.04136))
     self.assertEqual(material.specular, Vector3d(0.727811, 0.626959, 0.626959))
     self.assertEqual(material.shinines, 76.8)
     self.assertEqual(material.reflection, 0)
     self.assertEqual(material.refraction, 0)
示例#24
0
    def test_ray_intersect_box(self):
        print("\nRay Intersect Box", end="")
        min_corner = Vector3d(-1)
        max_corner = Vector3d(1)
        box = BoundingBox(min_corner, max_corner)
        ray = Ray(Vector3d(0, 0, -3), Vector3d(0, 0, 1))

        self.assertTrue(rayIntersectBox(ray, box))

        ray.direction = (max_corner - ray.origin).normalized()
        self.assertTrue(rayIntersectBox(ray, box))

        ray.direction = (min_corner - ray.origin).normalized()
        self.assertTrue(rayIntersectBox(ray, box))

        near_front_right_top_corner = Vector3d(1 + 1e-10, 1, -1)
        near_front_bottom_corner = Vector3d(-1 - 1e-10, -1, -1)
        ray.direction = (near_front_right_top_corner - ray.origin).normalized()
        self.assertFalse(rayIntersectBox(ray, box))
        ray.direction = (near_front_bottom_corner - ray.origin).normalized()
        self.assertFalse(rayIntersectBox(ray, box))
示例#25
0
 def test_constructor(self):
     print("\nConstructor", end = "")
     camera = Camera(Vector3d(0,0,0), Vector3d(0,0,1), Vector3d(0,1,0), 60, 4/3, 1)
     
     self.assertEqual(camera.location, Vector3d(0,0,0))
示例#26
0
 def test_properties(self):
     print("\nProperties", end = "")
     ruby_material = ColorMaterial(Color(255, 0, 0)
                                 , Vector3d(0.1745, 0.01175, 0.01175)
                                 , Vector3d(0.61424, 0.04136, 0.04136)
                                 , Vector3d(0.727811, 0.626959, 0.626959)
                                 , 76.8)
     
     self.assertEqual(ruby_material.color, Color(0xff0000))
     self.assertEqual(ruby_material.ambient, Vector3d(0.1745, 0.01175, 0.01175))
     self.assertEqual(ruby_material.diffuse, Vector3d(0.61424, 0.04136, 0.04136))
     self.assertEqual(ruby_material.specular, Vector3d(0.727811, 0.626959, 0.626959))
     self.assertEqual(ruby_material.shinines, 76.8)
     self.assertEqual(ruby_material.reflection, 0)
     self.assertEqual(ruby_material.refraction, 0)
     
     ruby_material.color = Color(0x00ff00)
     self.assertEqual(ruby_material.color, Color(0x00ff00))
     
     ruby_material.ambient = Vector3d(0,0,0)
     self.assertEqual(ruby_material.ambient, Vector3d(0,0,0))
     self.assertEqual(ruby_material.acolor(), Color(0))
     
     ruby_material.diffuse = Vector3d(0,0,0)
     self.assertEqual(ruby_material.diffuse, Vector3d(0,0,0))
     self.assertEqual(ruby_material.dcolor(), Color(0))
     
     ruby_material.specular = Vector3d(0,0,0)
     self.assertEqual(ruby_material.specular, Vector3d(0,0,0))
     self.assertEqual(ruby_material.scolor(), Color(0))
     
     ruby_material.shinines = 0
     self.assertEqual(ruby_material.shinines, 0)
     
     ruby_material.reflection= 1
     self.assertEqual(ruby_material.reflection, 1)
     
     ruby_material.refraction = 1
     self.assertEqual(ruby_material.refraction, 1)
示例#27
0
 def test_with_default(self):
     print("\nDefault constructor", end = "")
     sphere = Sphere(Vector3d(0,0,0), 10)
     
     self.assertEqual(sphere.center, Vector3d(0,0,0))
     self.assertEqual(sphere.radius, 10)
示例#28
0
    def test_constructor(self):
        print("\nDefault constructor", end="")
        ray = Ray(Vector3d(0, 0, 0), Vector3d(0, 0, 1))

        self.assertEqual(ray.origin, Vector3d(0, 0, 0))
        self.assertEqual(ray.direction, Vector3d(0, 0, 1))
示例#29
0
 def test_full_constructor(self):
     print("\nFull constructor", end = "")
     sphere = Sphere(Vector3d(0,0,0), 10)
     
     self.assertEqual(sphere.center, Vector3d(0,0,0))
     self.assertEqual(sphere.radius, 10)
示例#30
0
def test(name="example"):
    width = 640
    height = 480
    scene = Scene(name, width, height)

    ruby_material = ColorMaterial(Color(255, 0, 0),
                                  Vector3d(0.1745, 0.01175, 0.01175),
                                  Vector3d(0.61424, 0.04136, 0.04136),
                                  Vector3d(0.727811, 0.626959, 0.626959), 76.8)

    scene.addObject(RenderableObject(Sphere(Vector3d(0), 2), ruby_material))
    #scene.addObject(RenderableObject(Sphere(Vector3d(4,4,-4), 1), ruby_material))

    #scene.addLight(SpotLight(Vector3d(10,10,10)))
    scene.addLight(SpotLight(Vector3d(5, 6, -6)))

    scene.addCamera(
        Camera(Vector3d(0, 7, 7), Vector3d(0, 0, 0),
               Vector3d(0, -1, 1).normalized(), 75, width * 1.0 / height, 2),
        True)

    scene.addCamera(
        Camera(Vector3d(0, 10, 0), Vector3d(0, 0, 0), Vector3d(0, 0, 1), 75,
               width * 1.0 / height, 2), False)

    scene.addCamera(
        Camera(Vector3d(10, 0, 0), Vector3d(0, 0, 0), Vector3d(0, -1, 0), 75,
               width * 1.0 / height, 2), False)

    scene.addCamera(
        Camera(Vector3d(0, 0, 10), Vector3d(0, 0, 0), Vector3d(0, -1, 0), 75,
               width * 1.0 / height, 2), False)

    with open(name + '.json', 'w') as f:
        json.dump(json.loads(repr(scene)), f)

    dump_scene_image(scene)