Performs a ray - primitive intersection test.
Returns an Intersection object with the associated information.
If the ray did not hit the primitive, the distance will be negative.
Source
Intersection intersect(Ray r, num prevBestDistance) {
Intersection intersect = new Intersection();
/*
vec3 distance = r.origin-this.center;
double B = distance.dot(r.direction);
double C = B*B - distance.length2 + (this.radius*this.radius);
double l1 = C >= 0.0 ? -B - sqrt(C) : -1.0;
if (l1 < 0) {
return intersect;
} else {
intersect.distance = l1;
intersect.hitPoint = r.getPoint3(l1);
intersect.prim = this;
return intersect;
}
*/
num A = r.direction.dot(r.direction);
num B = (r.origin - this.center).dot(r.direction) * 2;
num C = (r.origin - this.center).dot(r.origin - this.center) - (this.radius * this.radius);
num det = B * B - 4 * A * C;
if (det >= 0) {
num sol1 = (-B + Math.sqrt(det)) / (2 * A);
num sol2 = (-B - Math.sqrt(det)) / (2 * A);
num minDist,maxDist;
if (sol1 >= sol2) {
maxDist = sol1;
minDist = sol2;
}else{
maxDist = sol2;
minDist = sol1;
}
num dist = minDist > EPS ? minDist : maxDist;
intersect.distance = dist;
intersect.prim = this;
intersect.hitPoint = r.getPoint3(dist);
}
return intersect;
}