Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.92 KB | None | 0 0
  1. glm::vec3 e = ray.origin;
  2. glm::vec3 d = ray.direction;
  3. glm::vec3 c = this->center;
  4. float R = this->radius;
  5.  
  6. float discriminant = glm::dot(d, e-c)*glm::dot(d, e-c) - glm::dot(d, d)*(glm::dot(e-c, e-c) - R*R);
  7.  
  8. if(discriminant < 1e-6)
  9. return false;
  10.  
  11. // Calcula el temps/lambda d'intersecció si l'origen del raig està a l'exterior
  12. // de l'esfera i el raig s'hi apropa
  13. float t = glm::dot(-d, e-c) - sqrt(discriminant);
  14.  
  15. if(t < 0 || glm::length(e - ray(t)) < 1e-3)
  16. // Calcula el temps/lambda d'intersecció si l'origen del raig està a l'exterior
  17. // de l'esfera i el raig s'hi allunya, o bé si l'origen està a l'interior de l'esfera
  18. t = glm::dot(-d, e-c) + sqrt(discriminant);
  19.  
  20. info.hitPoint = ray(t);
  21. info.normal = (info.hitPoint - c) / R;
  22. info.time = t;
  23. info.material = &(this->material);
  24. info.is2D = false;
  25.  
  26. return true;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement