光线与球的求交代码

it2022-05-05  45

光线与球的求交代码 // ------------------------------------------------------------------------- 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;} posted on 2005-07-28 22:16 Len3d 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/len3d/archive/2005/07/28/202305.html

相关资源:一份C 实现的光线追踪程序,利用GLFW框架

最新回复(0)