Ray casting with spheres.
This commit is contained in:
29
sphere.cpp
Normal file
29
sphere.cpp
Normal file
@@ -0,0 +1,29 @@
|
||||
#include <cmath>
|
||||
|
||||
#include "sphere.hpp"
|
||||
|
||||
bool Sphere::intersect(Ray & r, float & t) const {
|
||||
float d;
|
||||
|
||||
float a = (r.m_direction.x * r.m_direction.x) +
|
||||
(r.m_direction.y * r.m_direction.y) +
|
||||
(r.m_direction.z * r.m_direction.z);
|
||||
|
||||
float b = (2 * r.m_direction.x * (r.m_origin.x - m_center.x)) +
|
||||
(2 * r.m_direction.y * (r.m_origin.y - m_center.y)) +
|
||||
(2 * r.m_direction.z * (r.m_origin.z - m_center.z));
|
||||
|
||||
float c = (m_center.x * m_center.x) +
|
||||
(m_center.y * m_center.y) +
|
||||
(m_center.z * m_center.z) +
|
||||
(r.m_origin.x * r.m_origin.x) +
|
||||
(r.m_origin.y * r.m_origin.y) +
|
||||
(r.m_origin.z * r.m_origin.z) -
|
||||
2 * ((m_center.x * r.m_origin.x) + (m_center.y * r.m_origin.y) + (m_center.z * r.m_origin.z)) - (m_radius * m_radius);
|
||||
|
||||
d = (b * b) - (4 * a * c);
|
||||
|
||||
t = (-b - sqrt(d)) / (2 * a);
|
||||
|
||||
return d >= 0.0f;
|
||||
}
|
Reference in New Issue
Block a user