-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathesfera.cpp
More file actions
42 lines (34 loc) · 1.21 KB
/
Copy pathesfera.cpp
File metadata and controls
42 lines (34 loc) · 1.21 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
#include "esfera.h"
Esfera::Esfera(Ponto3 centro, double raio, Cor cor):centro(centro),raio(raio),cor(cor){}
//Construtor com mateiral
Esfera::Esfera(Ponto3 centro, double raio, shared_ptr<Material> m):centro(centro),raio(raio),mat_ptr(m){}
bool Esfera::hit( Raio &r, double t_min, double t_max, hit_record& registro)
{
Vetor3 d_o = r.origem - centro;
double a = r.direcao.modulo_quadrado();
double b = produto_escalar(d_o,r.direcao);
double c = d_o.modulo_quadrado() - (raio*raio);
double delta = b*b - a*c;
//Se o delta for negativo, a t quadrada não é real, não colide
if (delta < 0) return false;
//Busca a raiz mais proxima no range de visao.
double t = (-b - sqrt(delta)) / (a);
if (t < t_min || t_max < t)
{
t = (-b + sqrt(delta)/(a));
if (t < t_min || t_max < t)
{
return false;
}
}
registro.cor = cor;
//Adiciona o t necessario para a colisao no registro
registro.t = t;
//Calcula o ponto de colisao
registro.p = r.at(t);
//Calcula o vetor normal do ponto da esfera
Vetor3 fora = (registro.p - centro) / raio;
registro.normal_face(r,fora);
registro.material = mat_ptr;
return true;
}