diff --git a/__pycache__/camera.cpython-33.pyc b/__pycache__/camera.cpython-33.pyc index 7ac9cd14ce80218af0287c5e0f604d59b9c1e5cf..9162902ab8f1d7ebd4d0c8cfd5ee667372bea14a 100644 Binary files a/__pycache__/camera.cpython-33.pyc and b/__pycache__/camera.cpython-33.pyc differ diff --git a/__pycache__/intersection.cpython-33.pyc b/__pycache__/intersection.cpython-33.pyc index fae1ae74b367b9008f501976711328e4472c8010..b1778d74fdf9ad5c715e15622e77de29694fd838 100644 Binary files a/__pycache__/intersection.cpython-33.pyc and b/__pycache__/intersection.cpython-33.pyc differ diff --git a/__pycache__/operation_vector.cpython-33.pyc b/__pycache__/operation_vector.cpython-33.pyc index 6985a18e0b64f2524fb9bd0aa6ba3ed8b3334944..e84bbd2848fce4b6cdc33127148be27cedf31906 100644 Binary files a/__pycache__/operation_vector.cpython-33.pyc and b/__pycache__/operation_vector.cpython-33.pyc differ diff --git a/__pycache__/raytracer.cpython-33.pyc b/__pycache__/raytracer.cpython-33.pyc index 89eb08a1605bcffef331f543624caa5026ea71a1..02d8c7a6d69ecbd0f4849f8bd080bbabd9c1a4f9 100644 Binary files a/__pycache__/raytracer.cpython-33.pyc and b/__pycache__/raytracer.cpython-33.pyc differ diff --git a/__pycache__/scene.cpython-33.pyc b/__pycache__/scene.cpython-33.pyc index ac3f713769654225108a1111d89b0afaa5f39b8a..89952a162f1aa67ab673f4253845d919d5613d25 100644 Binary files a/__pycache__/scene.cpython-33.pyc and b/__pycache__/scene.cpython-33.pyc differ diff --git a/intersection.py b/intersection.py index 9995590494ea9f734a3d3558c371500ea5bfa654..13b87b9e5aa80790b5d224de495ecc8e30656d05 100644 --- a/intersection.py +++ b/intersection.py @@ -1,5 +1,6 @@ from operation_vector import * from scene import * +from math import atan, pi class Intersection: def __init__(self, position, normal, object): @@ -35,7 +36,38 @@ def intersect(objet, ray): else: return Intersection(position, -(position - centre).normalized(), objet) + elif type(objet) is Triangle: + i = (objet.v1 - objet.v0).normalized() + j = (objet.v2 - objet.v0).normalized() + n = (i^j).normalized() + if l*n == 0: + return None + + px = ((objet.v0 - o)*n)/(l*n) + p = o + px*l + + if not(pointInTriangle(p, objet.v0, objet.v1, objet.v2)): + return None + + normal = -n*((l*n)/abs(l*n)) + return Intersection(p, normal, objet) + + else: + print('c',end = ' ') +def sameSide(p1, p2, a,b): + cp1 = (b-a)^(p1-a) + cp2 = (b-a)^(p2-a) + if cp1*cp2 >= 0: + return True + else: + return False + +def pointInTriangle(p, a, b, c): + if sameSide(p, a, b, c) and sameSide(p, b, a, c) and sameSide(p, c, a, b): + return True + else: + return False diff --git a/operation_vector.py b/operation_vector.py index fe5ffd241221cd40c19373327dc9434580349cdd..c0a4af0f0a03b8b71816cc76929beecad5c8b532 100644 --- a/operation_vector.py +++ b/operation_vector.py @@ -45,7 +45,7 @@ class Vector: return vector1 + (-1 * vector2) def __repr__(self): - return 'Vector' + str(self.coord()) + return 'Vector(' + str(list(self.coord())) + ')' def __str__(self): return '/ ' + str(self.x) + '\n| ' + str(self.y) + '\n\\ ' + str(self.z) + '\n' diff --git a/scene.py b/scene.py index c18a96bce3cfcdc353f36e09f7b6754cf9666f04..c252592547bab259ea1230ed7271718e0f263b03 100644 --- a/scene.py +++ b/scene.py @@ -6,6 +6,13 @@ class Sphere: self.radius = rayon self.material = material +class Triangle: + def __init__(self, v0, v1, v2, material): + self.v0 = v0 + self.v1 = v1 + self.v2 = v2 + self.material = material + class Material: def __init__(self, color, ambiant, diffuse, specular, shininess, reflection): self.color = color diff --git a/scripts/__pycache__/script_triangle_multi.cpython-33.pyc b/scripts/__pycache__/script_triangle_multi.cpython-33.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fb3a5a80b95934132e49a6ce92b5e23a35fa7d7 Binary files /dev/null and b/scripts/__pycache__/script_triangle_multi.cpython-33.pyc differ diff --git a/scripts/script_triangle.py b/scripts/script_triangle.py index 4dac2c860f2845db1b13184a2a6370b2df2c8b3a..b77c4cc0c23f36269625a8c67e39319275daca2c 100644 --- a/scripts/script_triangle.py +++ b/scripts/script_triangle.py @@ -14,21 +14,21 @@ materiau_sphere_rouge = Material(Vector((1,0,0)), .5, .3, .3, 100, .3) materiau_sphere_blanche = Material(Vector((1,1,1)), .5, .3, .3, 100, 0) materiau_sphere_verte= Material(Vector((0,1,0)), .5, .3, .3, 100, .3) c = (8+2*(3**.5))**.5 -l = 0+0*((c**2 - 4)**.5) -v0 = Vector([0,0,2+l]) -v1 = Vector([0,2,2+l]) -v2 = Vector([2,0,2+l]) +l = ((c**2 - 4)**.5) v3 = Vector([0,0,2]) -#triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) -#triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) -#triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) -triangle_blanc = Triangle(v0,v1,v2,materiau_sphere_blanche) +v1 = Vector([2,0,4]) +v2 = Vector([-1,l,4]) +v0 = Vector([-1,-l,4]) +triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) +triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) +triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) +#triangle_blanc = Triangle(v0,v1,v2,materiau_sphere_blanche) lumiere = Spotlight(Vector((1,1,0)), Vector((1,1,1))) scene = Scene() -#scene.add_object(sphere_blanche) -#scene.add_object(triangle_bleu) -#scene.add_object(triangle_rouge) -scene.add_object(triangle_blanc) +scene.add_object(triangle_vert) +scene.add_object(triangle_bleu) +scene.add_object(triangle_rouge) +#scene.add_object(triangle_blanc) scene.add_light(lumiere) affiche = raytracer_render(camera, scene) imsave('try.png',affiche) diff --git a/scripts/script_triangle_multi.py b/scripts/script_triangle_multi.py index f3fabc5cf6e728d109c3efa645b51a24eb949371..b51df60f2dea674c9793f599b3799110b1f30a53 100644 --- a/scripts/script_triangle_multi.py +++ b/scripts/script_triangle_multi.py @@ -25,18 +25,18 @@ c = (8+2*(3**.5))**.5 l = (c**2 - 4)**.5 v0 = Vector([0,2,2+l]) v1 = Vector([3**.5,-1,2+l]) -v2 = Vector([3**.5,-1,2+l]) +v2 = Vector([-3**.5,-1,2+l]) v3 = Vector([0,0,2]) -#triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) -#triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) -#triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) -triangle_blanc = Triangle(v0,v2,v3,materiau_sphere_blanche) +triangle_rouge = Triangle(v0,v1,v3,materiau_sphere_rouge) +triangle_vert = Triangle(v1,v2,v3,materiau_sphere_verte) +triangle_bleu = Triangle(v0,v2,v3,materiau_sphere_bleue) +#triangle_blanc = Triangle(v0,v2,v3,materiau_sphere_blanche) scene = Scene() lumiere = Spotlight(Vector([0,0,0]), Vector([1,1,1])) -#scene.add_object(sphere_blanche) -#scene.add_object(triangle_bleu) -#scene.add_object(triangle_rouge) -scene.add_object(triangle_blanc) +scene.add_object(triangle_vert) +scene.add_object(triangle_bleu) +scene.add_object(triangle_rouge) +#scene.add_object(triangle_blanc) scene.add_light(lumiere) affiche = np.zeros((nx, ny, 3)) rows = list(range(nx)) diff --git a/scripts/triangle.png b/scripts/triangle.png new file mode 100644 index 0000000000000000000000000000000000000000..4903dab3f31361c73814004329e1137c9c72c6d7 Binary files /dev/null and b/scripts/triangle.png differ diff --git a/scripts/try.png b/scripts/try.png index 09abf45b713453cc820b6eca100672c98914e8f3..95846b642e6cc8cc5fcc12b1a048252d89e8c8e0 100644 Binary files a/scripts/try.png and b/scripts/try.png differ