示例#1
0
 def setUp(self):
     self.raytracer = Raytracer()
     self.v1 = Vector3f(0.0,0.0,0.0)
     self.v2 = Vector3f(1.0,1.0,1.0)
     self.v3 = Vector3f(2.0,2.0,2.0)
     self.rv1 = Vector3f(1, 0, 0)
     self.rv2 = Vector3f(0, 1, 0)
     self.rv3 = Vector3f(0, 0, 1)
示例#2
0
class TestRaytracer(unittest.TestCase):

    def setUp(self):
        self.raytracer = Raytracer()
        self.v1 = Vector3f(0.0,0.0,0.0)
        self.v2 = Vector3f(1.0,1.0,1.0)
        self.v3 = Vector3f(2.0,2.0,2.0)
        self.rv1 = Vector3f(1, 0, 0)
        self.rv2 = Vector3f(0, 1, 0)
        self.rv3 = Vector3f(0, 0, 1)

    def test_interface(self):
        for func in ('addPrimitive', 'addPointLight', 'setAmbient', 'setCamera', 'setOutput', 'render', 'findClosestCollision', 'calculateColor'):
            self.assertTrue(hasattr(self.raytracer, func) and callable(getattr(self.raytracer, func)), "Interface requires function: " + func)

    def test_addPrimitive(self):
        sph1 = Sphere(self.v1, 2)
        sph2 = Sphere(self.v2, 4)
        self.raytracer.addPrimitive(sph1)
        self.raytracer.addPrimitive(sph2)
        self.assertEqual(sph1, self.raytracer.primitives[0])
        self.assertEqual(sph2, self.raytracer.primitives[1])

    def test_addPointLight(self):
        self.raytracer.addPointLight(self.v1, [.4, .4, .4], 2)
        self.raytracer.addPointLight(self.v2, [.8, .8, .8], 6)
        l1 = self.raytracer.point_lights[0]
        l2 = self.raytracer.point_lights[1]
        self.assertEqual((l1[0].toList(), l1[1], l1[2]), (self.v1.toList(), [.4, .4, .4], 2.0))
        self.assertEqual((l2[0].toList(), l2[1], l2[2]), (self.v2.toList(), [.8, .8, .8], 6.0))

    def test_setAmbient(self):
        self.assertEqual(self.raytracer.ambient, [0.0, 0.0, 0.0])
        self.raytracer.setAmbient([.2, .2, .2])
        self.assertEqual(self.raytracer.ambient, [.2, .2, .2])

    def test_setOutput(self):
        self.raytracer.setOutput('test.png', 700, 800)
        self.assertEqual(self.raytracer.output_file, 'test.png')
        self.assertEqual(self.raytracer.output_width, 700)
        self.assertEqual(self.raytracer.output_height, 800)
        self.assertEqual(self.raytracer.renderer.buffer_x, 700)
        self.assertEqual(self.raytracer.renderer.buffer_y, 800)

    def test_setCamera(self):
        self.raytracer.setCamera(self.v1, self.rv1 * 3, self.rv2 * 5, 90)
        self.assertEqual(self.raytracer.camera_origin.toList(), self.v1.toList())
        self.assertEqual(self.raytracer.camera_forward.toList(), self.rv1.toList())
        self.assertEqual(self.raytracer.camera_up.toList(), self.rv2.toList())
        self.assertEqual(self.raytracer.camera_right.toList(), self.rv3.toList())
        self.assertAlmostEqual(self.raytracer.screen_halfwidth, 1)
        self.assertAlmostEqual(self.raytracer.screen_halfheight, 1)

    def test_render(self):
        self.raytracer.setOutput('test_render_output.png', 100, 100)
        self.raytracer.setAmbient([0.2, 0.2, 0.2])
        self.raytracer.addPrimitive(Sphere(Vector3f(0, 1, 0), 0.25))
        self.raytracer.addPointLight(Vector3f(1.0,-1.0,1.0), [1.0, 1.0, 1.0], 1)
        self.raytracer.setCamera(Vector3f(0.0, 0.0, 0.0), Vector3f(0.0, 1.0, 0.0), Vector3f(0.0, 0.0, 1.0), 70)
        start = time()
        self.raytracer.render()
        end = time()
        self.assertTrue(os.path.exists('./test_render_output.png'), "The file wasn't created upon rendering")
        print "Rendered a 100 * 100 image with 1 sphere and 1 light in {} seconds".format(end - start)

    def test_findClosestCollision(self):
        fake_camera = Vector3f(0, 0, 0)
        sphere1 = Sphere(Vector3f(2.0, 0.0, 0.0))
        sphere2 = Sphere(Vector3f(6.0, 0.0, 0.0))
        self.raytracer.addPrimitive(sphere1)
        self.raytracer.addPrimitive(sphere2)

        col1 = self.raytracer.findClosestCollision(fake_camera, Vector3f(1.0, 0.0, 0.0))
        col2 = self.raytracer.findClosestCollision(fake_camera, Vector3f(0.0, 1.0, 0.0))
        self.assertEqual((col1[0], col1[1]), (1.0, sphere1))
        self.assertEqual(col2, ["NONE", "NONE"])

    def test_integration_renderComplexScene(self):
        self.raytracer.setOutput('test_integration_renderComplexScene.png', 300, 300)
        self.raytracer.setAmbient([0.2, 0.2, 0.2])
        sph1 = Sphere(Vector3f(0.0, 1.0, 0.0), 0.5)
        sph2 = Sphere(Vector3f(-1.0, 1.0, 0.0), 0.4)
        sph3 = Sphere(Vector3f(0.2, -1.0, 1.2), 0.5)
        sph4 = Sphere(Vector3f(1.0, -1.0, -1.0), 0.3)
        sph5 = Sphere(Vector3f(-1.0, -1.0, -1.0), 0.3)
        sph1.setDiffuseColor([0.8, 0.0, 0.0])
        sph2.setDiffuseColor([1.0, 1.0, 1.0])
        sph2.setDiffuseConstant(0.5)
        sph3.setDiffuseColor([0.0, 0.0, 0.8])
        sph3.setShininess(20)
        sph4.setSpecularColor([0.0, 1.0, 0.0])
        sph5.setDiffuseColor([1.0, 0.0, 1.0])
        sph5.setShininess(200)
        self.raytracer.addPrimitive(sph1)
        self.raytracer.addPrimitive(sph2)
        self.raytracer.addPrimitive(sph3)
        self.raytracer.addPrimitive(sph4)
        self.raytracer.addPrimitive(sph5)
        self.raytracer.addPointLight(Vector3f(1.0,-4.0,1.0), [1.0, 1.0, 1.0], 2)
        self.raytracer.setCamera(Vector3f(0.0, -6.0, 0.0), Vector3f(0.0, 1.0, 0.0), Vector3f(0.0, 0.0, 1.0), 70)
        start = time()
        self.raytracer.render()
        end = time()
        self.assertTrue(os.path.exists('./test_integration_renderComplexScene.png'), "The file wasn't created upon rendering")
        print "Rendered a 300 * 300 image with 4 spheres and 1 light in {} seconds".format(end - start)