def test_lighting_eye_offset(): # eye between light and surface, 45 offset s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, math.sqrt(2) / 2, -math.sqrt(2) / 2) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) res = m.lighting(s, light, p, eyev, normalv) assert res == Color(1.0, 1.0, 1.0)
def test_lighting_eye_opposite(): # eye opposite surface, 45 offset s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 10, -10), Color(1, 1, 1)) res = m.lighting(s, light, p, eyev, normalv) assert res == Color(0.7364, 0.7364, 0.7364)
def test_lighting_eye_in_path(): # eye in reflection path s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, -math.sqrt(2) / 2, -math.sqrt(2) / 2) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 10, -10), Color(1, 1, 1)) res = m.lighting(s, light, p, eyev, normalv) assert res == Color(1.6364, 1.6364, 1.6364)
def test_lighting_eye_between(): # eye between light and surface s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) res = m.lighting(s, light, p, eyev, normalv) assert res == Color(1.9, 1.9, 1.9)
def test_lighting_behind_surface(): # eye behind surface s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, 10), Color(1, 1, 1)) res = m.lighting(s, light, p, eyev, normalv) assert res == Color(0.1, 0.1, 0.1)
def test_surface_shadow(): s = Sphere() m = Material() p = Point(0, 0, 0) eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) in_shadow = True result = m.lighting(s, light, p, eyev, normalv, in_shadow) assert result == Color(0.1, 0.1, 0.1)
def default(cls): world = cls() world.light = PointLight(Point(-10, 10, -10), Color(1, 1, 1)) m = Material() m.color = Color(0.8, 1.0, 0.6) m.diffuse = 0.7 m.specular = 0.2 s1 = Sphere() s1.set_material(m) s2 = Sphere() s2.set_transform(Scaling(0.5, 0.5, 0.5)) world.objects.extend([s1, s2]) return world
def test_default_world(): light = PointLight(Point(-10, 10, -10), Color(1, 1, 1)) s1 = Sphere() m = Material() m.color = Color(0.8, 1.0, 0.6) m.diffuse = 0.7 m.specular = 0.2 s1.set_material(m) s2 = Sphere() t = Scaling(0.5, 0.5, 0.5) s2.set_transform(t) w = World.default() assert w.light == light assert s1 in w.objects assert s2 in w.objects
def test_default_material(self): m = Material() assert m.color == Color(1, 1, 1) assert m.ambient == 0.1 assert m.diffuse == 0.9 assert m.specular == 0.9 assert m.shininess == 200.0
def test_lighting_with_pattern_applied(self): m = Material() m.pattern = StripePattern(Color.white(), Color.black()) m.ambient = 1 m.diffuse = 0 m.specular = 0 eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color.white()) c1 = m.lighting(Sphere(), light, Point(0.9, 0, 0), eyev, normalv, False) c2 = m.lighting(Sphere(), light, Point(1.1, 0, 0), eyev, normalv, False) assert c1 == Color.white() assert c2 == Color.black()
def test_lighting_pattern(): s = Sphere() m = Material() m.pattern = StripePattern(Color(1, 1, 1), Color(0, 0, 0)) m.ambient = 1 m.diffuse = 0 m.specular = 0 eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) c1 = m.lighting(s, light, Point(0.9, 0, 0), eyev, normalv, False) c2 = m.lighting(s, light, Point(1.1, 0, 0), eyev, normalv, False) assert c1 == Color(1, 1, 1) assert c2 == Color(0, 0, 0)
class TestMaterials(unittest.TestCase): def setUp(self): self.m = Material() self.pos = Point(0, 0, 0) def test_default_material(self): self.assertEqual(self.m.color, Color(1, 1, 1)) self.assertEqual(self.m.ambient, 0.1) self.assertEqual(self.m.diffuse, 0.9) self.assertEqual(self.m.specular, 0.9) self.assertEqual(self.m.shininess, 200) def test_light_with_eye_between_light_and_surface(self): eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) result = self.m.lighting(eyev, normalv, self.pos, light) self.assertEqual(result, Color(1.9, 1.9, 1.9)) def test_light_with_eye_between_light_and_surface_offest_45d(self): eyev = Vector(0, math.sqrt(2) / 2, math.sqrt(2) / 2) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) result = self.m.lighting(eyev, normalv, self.pos, light) self.assertEqual(result, Color(1.0, 1.0, 1.0)) def test_light_with_eye_opposite_surface_light_offset_45(self): eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 10, -10), Color(1, 1, 1)) result = self.m.lighting(eyev, normalv, self.pos, light) self.assertEqual(result, Color(0.7364, 0.7364, 0.7364)) def test_light_with_eye_in_reflection_vector(self): eyev = Vector(0, -math.sqrt(2) / 2, -math.sqrt(2) / 2) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 10, -10), Color(1, 1, 1)) result = self.m.lighting(eyev, normalv, self.pos, light) self.assertEqual(result, Color(1.6364, 1.6364, 1.6364)) def test_light_with_light_behind_surface(self): eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, 10), Color(1, 1, 1)) result = self.m.lighting(eyev, normalv, self.pos, light) self.assertEqual(result, Color(0.1, 0.1, 0.1)) def test_lighting_with_surface_in_shadow(self): eyev = Vector(0, 0, -1) normalv = Vector(0, 0, -1) light = PointLight(Point(0, 0, -10), Color(1, 1, 1)) inShadow = True result = self.m.lighting(eyev, normalv, self.pos, light, inShadow) self.assertEqual(result, Color(0.1, 0.1, 0.1))
def test_default_material(): s = _TestShape() assert s.material == Material()
from math import pi from os import sep from raytracer.camera import Camera from raytracer.canvas import write_ppm_to_file from raytracer.lights import PointLight from raytracer.materials import Material from raytracer.matrices import scaling, rotation_y, rotation_x, translation, view_transform from raytracer.scene import World from raytracer.shapes import Sphere, Plane from raytracer.tuples import Color, Point, Vector if __name__ == '__main__': floor = Plane() floor.material = Material() floor.material.color = Color(1, 0.9, 0.9) floor.material.specular = 0 middle = Sphere() middle.transformation = translation(-0.5, 1, 0.5) middle.material = Material() middle.material.color = Color(0.5, 0, 0) middle.material.diffuse = 0.7 middle.material.specular = 0.3 middle.material.reflective = 1 right = Sphere() right.transformation = translation(1.5, 0.5, -0.5) * scaling(0.5, 0.5, 0.5) right.material = Material() right.material.color = Color(0.2, 0.2, 0.8) right.material.diffuse = 0.7
from raytracer.base import * from raytracer.rays import * from raytracer.shapes import * from raytracer.materials import Material from raytracer.lights import PointLight WALL_SIZE = 7 CANVAS_SIZE = 100 PIXEL_SIZE = WALL_SIZE / CANVAS_SIZE HALF = WALL_SIZE / 2 canvas = Canvas(CANVAS_SIZE, CANVAS_SIZE) s = Sphere() m = Material(color=Color(1, 0.2, 1)) s.material = m light_postion = Point(-10, 5, -10) light_color = Color(1, 1, 1) light = PointLight(light_postion, light_color) ray_origin = Point(0, 0, -5) wall_z = 10 for y in range(0, CANVAS_SIZE): world_y = HALF - PIXEL_SIZE * y for x in range(0, CANVAS_SIZE): world_x = -HALF + PIXEL_SIZE * x position = Point(world_x, world_y, wall_z) v = position - ray_origin r = Ray(ray_origin, v.normalize()) xs = s.intersects(r)
def test_assign_material(): s = _TestShape() m = Material() m.ambient = 1 s.set_material(m) assert s.material == m
def test_transparency_and_refractive_index_of_default_material(self): m = Material() assert m.transparency == 0.0 assert m.refractive_index == 1.0
def __init__(self): self.transform = Identity() self.material = Material() self.parent = None
light = PointLight(Point(50, 100, -50), Color(1, 1, 1)) # - add: light # at: [ -400, 50, -10 ] # intensity: [ 0.2, 0.2, 0.2 ] # # ====================================================== # # define some constants to avoid duplication # # ====================================================== # - define: white-material # value: # color: [ 1, 1, 1 ] # diffuse: 0.7 # ambient: 0.1 # specular: 0.0 # reflective: 0.1 white = Material() white.color = Color(1, 1, 1) white.diffuse = 0.7 white.ambient = 0.1 white.specular = 0.0 white.reflective = 0.1 # - define: blue-material # extend: white-material # value: # color: [ 0.537, 0.831, 0.914 ] blue = copy.deepcopy(white) blue.color = Color(0.537, 0.831, 0.914) # - define: red-material # extend: white-material
def test_reflectivity_of_default_material(self): m = Material() assert m.reflective == 0.0
from raytracer.rays import Ray from raytracer.shapes import Sphere from raytracer.tuples import Point, Color if __name__ == '__main__': ray_origin = Point(0, 0, -5) wall_z = 10 wall_size = 7.0 canvas_pixels = 100 pixel_size = wall_size / canvas_pixels half = wall_size / 2 canvas = Canvas(canvas_pixels, canvas_pixels) red = Color(1, 0, 0) sphere = Sphere() m = Material() m.color = Color(1, 0.2, 1) sphere.material = m light = PointLight(Point(-10, 10, -10), Color(1, 1, 1)) for y in range(canvas_pixels): world_y = half - pixel_size * y for x in range(canvas_pixels): world_x = -half + pixel_size * x position = Point(world_x, world_y, wall_z) ray = Ray(ray_origin, (position - ray_origin).normalize()) hit = sphere.intersect(ray).hit() if hit: point = ray.position(hit.t)
def background(self): return {'m': Material(), 'position': Point(0, 0, 0)}
def test_reflective_attribute(): m = Material() assert m.reflective == 0.0
def test_transparency_and_index(): m = Material() assert m.transparency == 0.0 assert m.refractive_index == 1.0
def setUp(self): self.m = Material() self.pos = Point(0, 0, 0)