(说明:以下的相交程序代码是参考了其他的资料的,此处只是自己做的一个整理,笔记注释,以便于以后的学习。贴上代码,大家相互学习)
/*
* 判断射线与包围盒是否相交,若相交,保存其相交的光学参数tMin 和 tMax
* maxEnterDist: 表示进入包围盒的最大光学参数值tMax
* minExitDist: 表示出射包围盒的最小光学参数值tMin
* (maxEnterDist,minExitDist)表示的是能与包围盒相交的 t 值范围
*/
bool Intersection( const Vector3D &startPos, int signDirX, int signDirY, int signDirZ, const Vector3D&dirInv, double&maxEnterDist, double&minExitDist )
{
double mx, mn;
if(signDirX!=0){ // 如果入射射线不与包围盒的X两平面平行,即有交
if(signDirX==1){
mx=BoxMax.x;
mn=BoxMin.x;
}
else{
mx=BoxMin.x;
mn=BoxMax.x;
}
maxEnterDist=(mn-startPos.x)*dirInv.x;
minExitDist=(mx-startPos.x)*dirInv.x;
}
else{
if(startPos.x<BoxMin.x||startPos.x>BoxMax.x){
return false;
}
maxEnterDist=-DBL_MAX;
minExitDist=DBL_MAX;
}
if(signDirY!=0){
if(signDirY==1){
mx=BoxMax.y;
mn=BoxMin.y;
}
else{
mx=BoxMin.y;
mn=BoxMax.y;
}
double newEnterDist=(mn-startPos.y)*dirInv.y;
double newExitDist=(mx-startPos.y)*dirInv.y;
if(maxEnterDist<newEnterDist){
maxEnterDist=newEnterDist;
}
if(minExitDist>newExitDist){
minExitDist=newExitDist;
}
}
else{
if(startPos.y<BoxMin.y||startPos.y>BoxMax.y){
return false;
}
}
if(signDirZ!=0){
if(signDirZ==1){
mx=BoxMax.z;
mn=BoxMin.z;
}
else{
mx=BoxMin.z;
mn=BoxMax.z;
}
double newEnterDist=(mn-startPos.z)*dirInv.z;
double newExitDist=(mx-startPos.z)*dirInv.z;
if(maxEnterDist<newEnterDist){
maxEnterDist=newEnterDist;
}
if(minExitDist>newExitDist){
minExitDist=newExitDist;
}
}
else{
if(startPos.z<BoxMin.z||startPos.z>BoxMax.z){
return false;
}
}
if(minExitDist<maxEnterDist){
return false;
}
return true;
}