Ray-box intersection algorithm

(說明:以下的相交程序代碼是參考了其他的資料的,此處只是自己做的一個整理,筆記註釋,以便於以後的學習。貼上代碼,大家相互學習)


/* 

*  判斷射線與包圍盒是否相交,若相交,保存其相交的光學參數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;

}

發佈了8 篇原創文章 · 獲贊 11 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章