Ray-box intersection algorithm

本文介绍了一种用于判断射线与三维空间中的包围盒是否相交的算法,并详细解释了如何计算射线与包围盒相交的光学参数tMin和tMax。该算法适用于光线追踪等计算机图形学应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(说明:以下的相交程序代码是参考了其他的资料的,此处只是自己做的一个整理,笔记注释,以便于以后的学习。贴上代码,大家相互学习)


/* 

*  判断射线与包围盒是否相交,若相交,保存其相交的光学参数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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值