Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- glm::vec3 e = ray.origin;
- glm::vec3 d = ray.direction;
- glm::vec3 c = this->center;
- float R = this->radius;
- float discriminant = glm::dot(d, e-c)*glm::dot(d, e-c) - glm::dot(d, d)*(glm::dot(e-c, e-c) - R*R);
- if(discriminant < 1e-6)
- return false;
- // Calcula el temps/lambda d'intersecció si l'origen del raig està a l'exterior
- // de l'esfera i el raig s'hi apropa
- float t = glm::dot(-d, e-c) - sqrt(discriminant);
- if(t < 0 || glm::length(e - ray(t)) < 1e-3)
- // Calcula el temps/lambda d'intersecció si l'origen del raig està a l'exterior
- // de l'esfera i el raig s'hi allunya, o bé si l'origen està a l'interior de l'esfera
- t = glm::dot(-d, e-c) + sqrt(discriminant);
- info.hitPoint = ray(t);
- info.normal = (info.hitPoint - c) / R;
- info.time = t;
- info.material = &(this->material);
- info.is2D = false;
- return true;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement