zoukankan      html  css  js  c++  java
  • 光线与三角的求交代码

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

            eiFloat vnd 
    = dot(normal , ray->dir);

            
    if(ray->type == RAY_SHADOW)
                vnd 
    = - vnd;
                
            
    if( vnd < 0.0f || po->material->doubleSide )
            
    {
                eiFloat        t,td1,td2,td3;
                eiVector    tmpIntersection;

                
    if(ray->type == RAY_SHADOW)
                    t 
    = ( dot( normal , ray->src) + d ) / vnd;
                
    else
                    t 
    = -( dot( normal , ray->src) + d ) / vnd;

                
    if(t < 0.0f)
                    
    return false;

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

                
    //make sure intersection in bound box 

                
    if(!is_pos_in_box(tmpIntersection, box))
                    
    return false;

                
    //near and far clipping

                
    if(ray->type == RAY_EYE && !near_far_clip(tmpIntersection))
                    
    return false;

                
    //is in triangular area

                td1 
    = dot(tmpIntersection , la) + d1;

                
    if(td1 < 0.0f || td1 > 1.0f)
                    
    return false;

                td2 
    = dot(tmpIntersection , lb) + d2;

                
    if(td2 < 0.0f || td2 > 1.0f)
                    
    return false;

                td3 
    = dot(tmpIntersection , lc) + d3;

                
    if(td3 < 0.0f || td3 > 1.0f)
                    
    return false;

                
    //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

                    cust_data[
    0= td1;
                    cust_data[
    1= td2;
                    cust_data[
    2= td3;

                    
    return true;
                }

            }

        }


        
    return false;
    }
  • 相关阅读:
    回发或回调参数无效。 问题的解决和思考
    母板页中的引用的图片,JS,css等路径问题
    Solution: 题解 CF1196E Connected Component on a Chessboard
    01/05/2020 我注册了博客园 I enrolled in Cnblogs.
    Basic Thought / Data Structure: 前缀和 Prefix Sum
    Basic Thought / Data Structure: 差分 Difference
    DotNet中异步编程(APM)的研究1异步编程介绍
    关于atl server 的感受(3) 一个我自以为豪的应用
    自己的博客,竟然要自己搜出来,太久没来了。
    关于atl server 的感受(2)
  • 原文地址:https://www.cnblogs.com/len3d/p/229157.html
Copyright © 2011-2022 走看看