Skip to content
Snippets Groups Projects
Commit 5eb629bd authored by Benjamin Koltes's avatar Benjamin Koltes
Browse files

docstring + réorganisation

parent a724db3b
Branches
No related tags found
No related merge requests found
Showing
with 141 additions and 20 deletions
No preview for this file type
No preview for this file type
......@@ -3,11 +3,25 @@ from raytracer import Ray
class Camera:
def __init__(self, image_nrows, image_ncols, distance_focale):
"""__init__(self, image_nrows:entier, image_ncols:entier, distance_focale:entier):Camera
Définit un objet Caméra qui correspondra à l'image que l'on génère à la fin.
@image_nrows: nombre entier : correspond à la résolution verticale de l'image
@image_ncols: nombre entier : correspond à la résolution horizontale de l'image
@distance_focale: nombre entier : correspond au zoom de l'image"""
self.image_nrows = image_nrows
self.image_ncols = image_ncols
self.focal_length = distance_focale
def ray_at(self, row, col):
"""ray_at(self, row:entier, col:entier):Ray
Calcul le rayon qui part de la caméra vers le point de coordonnée (row, col) de la grille de la caméra
@row: entier
@col: entier
@return Ray"""
n = self.image_nrows//2
x = (n-row)/n
n = self.image_ncols//2
......
from operation_vector import *
from scene import *
from math import atan, pi
class Intersection:
def __init__(self, position, normal, object):
""""__init__(self, position: Vector, normal: Vector, object: Triangle or Sphere):Intersection
Définit l'objet Intersection composé d'un vecteur position, d'un vecteur normal et d'un objet
@position: Vector : position dans l'espace du point d'intersection
@normal: Vector : vecteur normal à la surface de l'objet au point de contact
@object: object : objet de contact
"""
self.position = position
self.normal = normal
self.object = object
def intersect(objet, ray):
"""intersect(objet:objet, ray:Ray):Intersection/None
Calcul le point d'intersection entre un rayon (ray) et un objet (objet) et renvoie ce point d'intersection s'il existe et renvoie None sinon
@objet: objet
@ray: Ray
@return None ou Intersection"""
o = ray.starting_point
l = ray.direction
if type(objet) is Sphere:
if type(objet) is Sphere: # teste l'intesection quand l'objet est une sphère
centre = objet.centre
r = objet.radius
a = l*l
......@@ -19,54 +34,74 @@ def intersect(objet, ray):
b = 2*(l*diff)
c = diff*diff - r**2
delta = b**2 - 4*a*c
if delta > 0:
if delta > 0: # il y a deux intersections avec la droite dont le vecteur directeur est le ray et la sphère
intersection = [(-b - delta**0.5)/(2*a), (-b + delta**0.5)/(2*a)]
elif delta == 0:
elif delta == 0: # il n'y a qu'une intersection (tangente)
intersection = [-b/(2*a)]
else:
else: # il n'y a pas d'intersection
intersection = []
if len(intersection) == 0 or max(intersection) < 0:
if len(intersection) == 0 or max(intersection) < 0: # s'il n'y a pas d'intersection ou que les points d'intersection sont du mauvais côté de la demi-droite
return None
elif min(intersection) < 0:
elif min(intersection) < 0: # s'il y a une intersection du bon côté et l'autre du mauvais côté
position = o + l*max(intersection)
else:
else: # si les deux intersections sont sur la bonne demi-droite
position = o + l*min(intersection)
if diff.norm() >= r:
return Intersection(position, (position - centre).normalized(), objet)
return Intersection(position, (position - centre).normalized(), objet) # le point de départ est à l'extérieure de la sphère
else:
return Intersection(position, -(position - centre).normalized(), objet)
return Intersection(position, -(position - centre).normalized(), objet) # s'il est à l'intérieur
elif type(objet) is Triangle:
elif type(objet) is Triangle: # teste l'intesection quand l'objet est un triangle
i = (objet.v1 - objet.v0).normalized()
j = (objet.v2 - objet.v0).normalized()
n = (i^j).normalized()
if l*n == 0:
if l*n == 0: # si le vecteur directeur du rayon est orthogonal à la normale au plan du triangle
return None
px = ((objet.v0 - o)*n)/(l*n)
p = o + px*l
p = o + px*l # intersection du rayon et du plan contenant le triangle
if not(pointInTriangle(p, objet.v0, objet.v1, objet.v2)):
if not(pointInTriangle(p, objet.v0, objet.v1, objet.v2)): # si p est en dehors du triangle
return None
normal = -n*((l*n)/abs(l*n))
return Intersection(p, normal, objet)
else:
print('c',end = ' ')
print('c',end = ' ') # si l'objet est inconnu
def sameSide(p1, p2, a, b):
"""sameSide(p1: Vector, p2: Vector, a: Vector, b: Vector): bool
Teste si p1 et p2 sont du même côté de la droite [a, b]
@p1: Vector
@p2: Vector
@a: Vector
@b: Vector
@return bool"""
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):
"""pointInTriangle(p: Vector, a: Vector, b: Vector, c: Vector): bool
Teste si p est dans le triangle abc
@p: Vector
@a: Vector
@b: Vector
@return boo"""
if sameSide(p, a, b, c) and sameSide(p, b, a, c) and sameSide(p, c, a, b):
return True
else:
......
class Spotlight:
def __init__(self, position, color):
"""__init__(self, position: Vector, color: Vector)
Définit une source de lumière
@position: Vector : position de la source de lumière
@color: Vector : couleur de la source de lumière"""
self.position = position
self.color = color
def phong_illuminate(light, position, normal, object, viewer):
"""phong_illuminate(light: Spotlight, position: Vector, normal: Vector, object, viewer: Vector): Vector
Calcule la lumière vu par l'observateur "viewer" au point de coordonnées "position" produite par la source "light" sur l'objet "objet" de normal "normal"
@light: Spotlight : source de lumière
@position: Vector : position de l'objet à laquelle on cherche la couleur
@normal: Vector : normal à l
@objet
@viewer: Vector : coordonnées de l'observateur
@return: Vector : couleur perçue par le "viewer" """
ks = object.material.specular
kd = object.material.diffuse
alpha = object.material.shininess
......@@ -16,13 +32,17 @@ def phong_illuminate(light, position, normal, object, viewer):
i = ((kd*(max(L*N, 0)) + ks*(max(0, R*V))**alpha))
if i < 0:
i = 0
# print(-1)
# elif i > 1:
# i = 1
# print(1)
return i*(light.color ** object.material.color)
def ambiant_illuminate(position, object):
"""ambiant_illuminate(position: Vector, object: objet): Vector
Calcule la lumière ambiante créée par l'objet
@position : ne serd à rien ici
@objet
@return: Vector : couleur ambiante"""
return object.material.ambiant*object.material.color
File added
# Show to python where to find the modules
import sys
sys.path.append('..')
from camera import Camera
from scene import *
from light import *
from raytracer import *
import numpy as np
from matplotlib.image import imsave
import itertools
import multiprocessing
def trace_ray_mutliprocess(t):
(i, j, camera, scene, nb_reflexion) = t
return np.array(trace_ray(camera.ray_at(i, j), scene, camera, nb_reflexion).coord())
(nx, ny, nb_reflexion) = (200, 200, 20)
camera = Camera(nx, ny, 1)
materiau_sphere_bleue = Material(Vector([0,0,1]), .5, .5, .5, 1000,0)
materiau_sphere_verte = Material(Vector([0,1,0]), .5, .5, .5, 1000, 0)
materiau_sphere_rouge = Material(Vector([1,0,0]), .5, .5, .5, 1000, 0)
materiau_sphere_blanche = Material(Vector([1,1,1]), 1, 1, 1, 20, 0)
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])
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)
scene = Scene()
lumiere = Spotlight(Vector([0,0,0]), Vector([1,1,1]))
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))
columns = list(range(ny))
carte = list(itertools.product(rows, columns, [camera], [scene], [nb_reflexion]))
if __name__ == '__main__':
pool = multiprocessing.Pool(4)
affiche_map = pool.map(trace_ray_mutliprocess, carte)
pool.close()
pool.join()
affiche = np.array(affiche_map).reshape(nx, ny, 3)
imsave('triangle.png', affiche)
File added
scripts/One_sphere blue/one_sphere_0.png

6.91 KiB

scripts/One_sphere blue/one_sphere_1.png

7.03 KiB

scripts/One_sphere blue/one_sphere_10.png

10.8 KiB

scripts/One_sphere blue/one_sphere_11.png

11 KiB

scripts/One_sphere blue/one_sphere_12.png

10.7 KiB

scripts/One_sphere blue/one_sphere_13.png

10.1 KiB

scripts/One_sphere blue/one_sphere_14.png

9.28 KiB

scripts/One_sphere blue/one_sphere_15.png

8.34 KiB

scripts/One_sphere blue/one_sphere_16.png

7.44 KiB

scripts/One_sphere blue/one_sphere_17.png

7.03 KiB

scripts/One_sphere blue/one_sphere_18.png

6.91 KiB

scripts/One_sphere blue/one_sphere_19.png

7.03 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment