public double intersect(Ray r)
{
double t;
Vector L = r.origin.sub(pos);
double a = r.direction.dot(r.direction);
double b = 2*(r.direction.dot(L));
double c = (L.dot(L)) - (radius*radius);
double disc = b*b - 4*a*c;
if (disc < 0)
return -1;
double distSqrt = Math.sqrt(disc);
double q;
if (b < 0)
q = (-b - distSqrt)/2;
else
q = (-b + distSqrt)/2;
double t0 = q/a;
double t1 = c/q;
if (t0 > t1)
{
double temp = t0;
t0 = t1;
t1 = temp;
}
if (t1 < 0)
return -1;
if (t0 < 0)
t = t1;
else
t = t0;
return t;
}
교차로가없는 경우 -1을 반환해야합니다.광선 구 교차 방법이 작동하지 않습니다.
반지름이 2 인 (5,0,0)에 구가 있습니다. 원점 (0,0,0)과 방향 (5,0,0) .unit이있는 광선을 통과하면 3을 반환합니다. 원점 (0,0,0)과 방향 (5,2,0) .unit이있는 광선을 통과 시키면 3.9를 반환합니다. 광선이 원점 (0,0,0)과 방향 (5,0,1) .unit을 통과 할 때 광선이 교차하더라도 -1을 반환합니다. 방향이 (5,0, -1) .unit 인 경우 t가 3보다 작을 수는 없지만 (5,0,1)과 같은 것을 반환해야하지만 방향은 2.73을 반환합니다. 보고.