forked from ricardobizerra/if680-ray-tracing
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
124 lines (104 loc) · 6.92 KB
/
main.py
File metadata and controls
124 lines (104 loc) · 6.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import math
import numpy as np
import beziersurface
from camera import Camera
from objects import Esfera, Malha, Plano
from toro import Toro, Toro2
from transform import affine_transform
from vectors import Ponto, Vector
def main():
# Definição dos valores para a câmera, alvo, up, centro da esfera, ponto do plano e normal ao plano
# Criação dos objetos Ponto e Vector com base nos valores fornecidos
camera_ponto1 = np.array([-2,2,1])
camera_ponto2 = np.array([0,0,0])
camera_ponto3 = np.array([0,-1,0])
alvo_ponto = np.array([1, 0, 0])
up_vector = np.array([0,0,1])
# Transformações afins realizadas nos objetos Ponto e Vector
# camera_ponto = affine_transform(camera_ponto, 'translate', 2, 0, 8, 0)
# up_vector = affine_transform(up_vector, 'rotate_x', angle=math.pi/2)
# Inicialização dos objetos Camera, Esfera e Plano com base nos dados inseridos
cam = Camera(camera_ponto1, alvo_ponto, up_vector)
esfera1 = Esfera(np.array([2,0,-1]), 1/2, np.array([255,255,0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0.5, k_refracao=0.2, ind_refracao=1.52, n=500) # Raio da esfera definido como 1
esfera2 = Esfera(np.array([2,0,1]), 1/2, np.array([200,50,200]), k_ambiente=0.3, k_difuso=0.5, k_especular=0.5, k_reflexao=0.8, k_refracao=0.8, ind_refracao=1.52, n=500)
esfera5 = Esfera(np.array([2,0,1]), 1/2, np.array([200,50,200]), k_ambiente=0.3, k_difuso=0.5, k_especular=0.5, k_reflexao=0, k_refracao=0, ind_refracao=1.52, n=500)
esfera3 = Esfera(np.array([2, 0 ,0]), 1/2, np.array([0, 255, 255]), k_ambiente=0.3, k_difuso=0.8, k_especular=0.8, k_reflexao=0.5, k_refracao=0, ind_refracao=1.52, n=500)
esfera4 = Esfera(np.array([2, 0 ,0]), 1/2, np.array([0, 0, 0]), k_ambiente=0.3, k_difuso=0.3, k_especular=0.3, k_reflexao=0.1, k_refracao=1, ind_refracao=1.52, n=500)
plano = Plano(np.array([-1, 0, 0]), np.array([4, 2, 0]), np.array([0, 255, 0]), k_ambiente=0.3, k_difuso=0.5, k_especular=0.5, k_reflexao=0.5, ind_refracao=1.52, k_refracao=0, n=500) # Ponto e vetor normal ao plano definidos como 0
plano2 = Plano(np.array([0, 1, 0]), np.array([4, 2, 0]), np.array([0, 255, 0]), k_ambiente=0.3, k_difuso=0.5, k_especular=0.5, k_reflexao=0, ind_refracao=1.52, k_refracao=0, n=500) # Ponto e vetor normal ao plano definidos como 0
p0 = np.array([1, 0, 0])
p1 = np.array([0, 1, 0])
p2 = np.array([-1, 0, 0])
p3 = np.array([0, -1, 0])
p4 = np.array([0, 0, 1])
p5 = np.array([0.5, 0.5, 0]) # Entre p0 e p1
p6 = np.array([0, 0.5, 0.5]) # Entre p0 e p1, adicionando uma variação na z para curvatura
p7 = np.array([-0.5, 0.5, 0]) # Entre p1 e p2
p8 = np.array([-0.5, 0, 0.5]) # Entre p1 e p2, adicionando uma variação na z para curvatura
p9 = np.array([-0.5, -0.5, 0]) # Entre p2 e p3
p10 = np.array([0, -0.5, 0.5]) # Entre p2 e p3, adicionando uma variação na z para curvatura
p11 = np.array([0.5, -0.5, 0]) # Entre p3 e p4
p12 = np.array([0.5, 0, 0.5])
p13 = np.array([1, 1, 0.5])
p14 = np.array([-1, 1, 0.5])
p15 = np.array([-1, -1, 0.5])
p16 = np.array([1, -1, 0.5])
n1 = np.cross(p1 - p0, p4 - p0)
norma1 = np.linalg.norm(n1)
n1 = n1 / norma1
n2 = np.cross(p2 - p1, p4 - p1)
norma2 = np.linalg.norm(n2)
n2 = n2 / norma2
n3 = np.cross(p3 - p2, p4 - p2)
norma3 = np.linalg.norm(n3)
n3 = n3 / norma3
n4 = np.cross(p0 - p3, p4 - p3)
norma4 = np.linalg.norm(n4)
n4 = n4 / norma4
malha = Malha(4,
5,
[p0, p1, p2, p3, p4],
[(0,1,4),(1,2,4),(2,3,4),(0,3,4)],
[n1,n2,n3,n4],
[],
[[255,255,255], [255,0,0], [0,255,0], [0,0,255]],
np.array([0,255,255]),
k_ambiente=0.3, k_difuso=0.5, k_especular=0.5, n=500, k_reflexao=0.8,ind_refracao=1.52, k_refracao=0.5)
bezier1 = [p0, p1, p5,p6]
bezier3 = [p1, p2, p7,p8]
bezier4 = [p2, p3, p9,p10]
bezier2 = [p3, p4, p11,p12]
bezier5 = [p0, p13, p14, p2]
bezier6 = [p2, p15, p16, p0]
bezier_surface = beziersurface.Bezier(np.array([bezier1, bezier2, bezier3, bezier4, bezier5, bezier6]), cor=np.array([0,0,255]))
bezier_malha = bezier_surface.triangularizar(0.1)
# Simulando relevo
curve1 = [np.array([-1,1/2,-1]), np.array([0,0,-1]), np.array([1,0.5,-1]), np.array([2,-0.5,-1]), np.array([3,1/3,-1.5]), np.array([4,-1/3,-2])]
curve2 = [np.array([-1,1/2,0]), np.array([0,0,0]), np.array([1.5,1/3,0]), np.array([2.5, -0.25, 0]), np.array([3.2, 0, 0]), np.array([4, -1/2, 0])]
curve3 = [np.array([-1,1/2,1]), np.array([0,0, 1]), np.array([0.7,-0.25,1]), np.array([2,1/2,1]), np.array([3,-2/3,1.5]), np.array([4,-1/2,2])]
# Simulando um tronco
tronco1 = [np.array([1.2,1/2,-1/3]), np.array([1,1/4,-1/4]), np.array([1,0,-1/6]), np.array([1,-1/8,1/4])]
tronco2 = [np.array([3/4,1/2,0]), np.array([3/4,1/4,-1/8]), np.array([3/4,0,1/8]), np.array([3/4,-1/8,1/10])]
tronco3 = [np.array([1.2,1/2,1/3]), np.array([1,1/4,1/5]), np.array([1,0,1/6]), np.array([1,-1/8,1/8])]
relevo = beziersurface.Bezier(np.array([curve1, curve2, curve3]), cor=np.array([0,255,0]))
malha_relevo = relevo.triangularizar(0.1)
tronco = beziersurface.Bezier(np.array([tronco1, tronco2, tronco3]), cor = np.array([0,51,102]))
malha_tronco = tronco.triangularizar(0.1)
# Simulando a copa da árvore
copa1 = Esfera(np.array([1,-1/8,0]), 1/6, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
copa2 = Esfera(np.array([1,-1/4,0]), 1/8, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
copa3 = Esfera(np.array([1,-1/8,-1/6]), 1/8, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
copa4 = Esfera(np.array([1,-1/8,1/6]), 1/8, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
copa5 = Esfera(np.array([1,-1/4,-1/8]), 1/12, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
copa6 = Esfera(np.array([1,-1/4,1/8]), 1/12, np.array([0, 102, 0]), k_ambiente=0.3, k_difuso=0.7, k_especular=0.3, k_reflexao= 0, k_refracao=0, ind_refracao=1.52, n=500)
#objects = [copa2,copa1, copa3, copa4, copa5, copa6, malha_relevo, malha_tronco]
#objects = [malha_tronco]
# toro = Toro(centro_y=0, centro_z=0, R=5, theta=math.pi/4, alfa=math.pi/4, cor=np.array([255,0,0]))
# toro1 = toro.triangularizar(0.1)
toro2 = Toro2(centro_y = 0, centro_z = 0, R=0.5, r=0.2, cor = np.array([255,0,0]))
malha_toro2 = toro2.triangularizar(math.pi/8)
objects = [malha_toro2]
# Realização do raycasting com os parâmetros fornecidos
cam.raycasting(1, 500, 500, objects)
if __name__ == "__main__":
main()