• 光线与球的求交代码


    //-------------------------------------------------------------------------
    eiBool eiSphere::intersect(eiRay *ray, eiObject *po, eiFloat & oldt,
                                eiPrimitive
    * & ret_pri, eiFloat *cust_data,
                                HitParam 
    *hparam)
    {
        
    if( oldt == 0.0f || ray_box( ray->src, hparam->hitPoint )
        
    {
            
    //compute intersecting point

            eiVector    oc 
    = add( ray->src, - center );
            eiFloat        oc_len 
    = dist( oc );
                
            
    if( oc_len > radius || po->material->doubleSide )
            
    {
                eiFloat    a 
    = dot( ray->dir, ray->dir );
                eiFloat    b 
    = 2.0f * dot( oc, ray->dir);
                eiFloat    c 
    = dot( oc, oc ) - RR;
                eiFloat    dt 
    = b * b - 4.0f * a * c;

                eiFloat    t;

                
    if(a == 0.0f || dt < 0.0f)
                    
    return false;
                
    else if(dt == 0.0f)
                
    {
                    t 
    = - b / a * 0.5f;

                    
    if(t < 0.0f)
                        
    return false;
                }

                
    else
                
    {
                    a 
    = 0.5f / a;
                    eiFloat t1 
    = (- b + sqrtf( dt )) * a;
                    eiFloat t2 
    = (- b - sqrtf( dt )) * a;

                    
    if(t1 > 0.0f && t2 < 0.0f)
                        t 
    = t1;
                    
    else if(t1 < 0.0f && t2 > 0.0f)
                        t 
    = t2;
                    
    else if(t1 > 0.0f && t2 > 0.0f)
                        t 
    = (t1 < t2) ? t1 : t2;
                    
    else
                        
    return false;
                }


                eiVector tmpIntersection 
    = add(ray->src, mulvf(ray->dir,t));

                
    //affect shadow factor

                
    if(ray->type == RAY_SHADOW)
                    hparam
    ->shadow_factor *= 1.0f - po->material->opacity;

                
    //find nearest hit point

                
    if(oldt == 0.0f || t < oldt)
                
    {
                    hparam
    ->hitPoint = tmpIntersection;
                    hparam
    ->hitObj = po;
                    ret_pri 
    = this;
                    oldt 
    = t;

                    
    //fill custom data

                    
    return true;
                }

            }

        }


        
    return false;
    }
  • 相关阅读:
    JAVA-初步认识-第十三章-验证静态同步函数的锁
    JAVA-初步认识-第十三章-多线程(验证同步函数的锁)
    JAVA-初步认识-第十二章-面向对象(包与包之间的访问)
    JAVA-初步认识-第十二章-面向对象(包的概述)
    JAVA-初步认识-第十三章-同步函数
    Fatal error: Call to undefined function imagettftext()解决办法
    ecstore菜鸟电子面单对接摘要
    linux crontab 实现每秒执行(转)
    ios9 URL Schemes列为白名单,才可正常检查其他应用是否安装
    主机宝等主机面板不能跨站访问文件,不能访问父路径文件问题
  • 原文地址:https://www.cnblogs.com/len3d/p/202305.html
Copyright © 2020-2023  润新知