broli86
04-15-2008, 12:28 AM
I have written some code based on a pseudocode I saw on internet but I just couldn't understand the algorithm well. Can anyone please explain it to me ? I specifically do not understadn the purpose of tnear and tfar. Here's my code btw :
bool ray_aabb_intersection(ray r , vector maxB, vector minB, double *tnear, double *tfar)
{
double t1, t2;
*tnear = -DBL_MAX;
*tfar = DBL_MAX;
if(r.origin.x == 0)
{
if(r.origin.x < minB.x || r.origin.x > maxB.x)
return FALSE;
}
else
{
t1 = (minB.x - r.origin.x)/ r.d.x;
t2 = (maxB.x - r.origin.x)/ r.d.x;
if(t1 > t2)
swap(&t1, &t2);
if(t1 >* tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
if(r.origin.y == 0)
{
if(r.origin.y < minB.y || r.origin.y > maxB.y)
return FALSE;
}
else
{
t1 = (minB.y - r.origin.y)/ r.d.y;
t2 = (maxB.y - r.origin.y)/ r.d.y;
if(t1 > t2)
swap(&t1, &t2);
if(t1 > *tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
if(r.origin.z == 0)
{
if(r.origin.z < minB.z || r.origin.z > maxB.z)
return FALSE;
}
else
{
t1 = (minB.z - r.origin.z)/ r.d.z;
t2 = (maxB.z - r.origin.z)/ r.d.z;
if(t1 > t2)
swap(&t1, &t2);
if(t1 > *tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
return TRUE;
}
bool ray_aabb_intersection(ray r , vector maxB, vector minB, double *tnear, double *tfar)
{
double t1, t2;
*tnear = -DBL_MAX;
*tfar = DBL_MAX;
if(r.origin.x == 0)
{
if(r.origin.x < minB.x || r.origin.x > maxB.x)
return FALSE;
}
else
{
t1 = (minB.x - r.origin.x)/ r.d.x;
t2 = (maxB.x - r.origin.x)/ r.d.x;
if(t1 > t2)
swap(&t1, &t2);
if(t1 >* tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
if(r.origin.y == 0)
{
if(r.origin.y < minB.y || r.origin.y > maxB.y)
return FALSE;
}
else
{
t1 = (minB.y - r.origin.y)/ r.d.y;
t2 = (maxB.y - r.origin.y)/ r.d.y;
if(t1 > t2)
swap(&t1, &t2);
if(t1 > *tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
if(r.origin.z == 0)
{
if(r.origin.z < minB.z || r.origin.z > maxB.z)
return FALSE;
}
else
{
t1 = (minB.z - r.origin.z)/ r.d.z;
t2 = (maxB.z - r.origin.z)/ r.d.z;
if(t1 > t2)
swap(&t1, &t2);
if(t1 > *tnear)
*tnear = t1;
if(t2 < *tfar)
*tfar = t2;
if(*tnear > *tfar)
return FALSE;
if(*tfar < 0)
return FALSE;
}
return TRUE;
}