平民程序 - linghuye's blog

天下风云出我辈,一入江湖岁月催。皇图霸业谈笑中,不胜人生一场醉。提剑跨骑挥鬼雨,白骨如山鸟惊飞。尘事如潮人如水,只笑江湖几人回。

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0
数据加载中……

Clip segment with OpenGL near plane

 

// Clip with near Z plane
// a,b is the vertex after opengl projection, that is M * v
static bool ClipLine(vec4_type& a, vec4_type& b)
{    
    
// -w <= z <= w
    bool aClip = (a.z < -a.w);
    
bool bClip = (b.z < -b.w);
    
if(!(aClip  ||  bClip))      return true;
    
else if(aClip  &&  bClip) return false;

    
// near plane
    if(aClip)
    
{    
        
const float dx = b.x - a.x;
        
const float dy = b.y - a.y;
        
const float dz = b.z - a.z;
        
const float dw = b.w - a.w;
        
        
const float t = -(a.z + a.w) / (dw + dz);
        a.x 
+= dx * t;
        a.y 
+= dy * t;
        a.z 
+= dz * t;
        a.w 
+= dw * t;
    }
    
    
else if(bClip)
    
{    
        
const float dx = a.x - b.x;
        
const float dy = a.y - b.y;
        
const float dz = a.z - b.z;
        
const float dw = a.w - b.w;
        
        
const float t = -(b.z + b.w) / (dw + dz);
        b.x 
+= dx * t;
        b.y 
+= dy * t;
        b.z 
+= dz * t;
        b.w 
+= dw * t;
    }

    
    
return true;
}

怪不得DX要把z映射到[0,1],计算简洁多了.

posted on 2005-12-22 14:55 linghuye 阅读(573) 评论(0)  编辑 收藏 引用 所属分类: 3D图形学研究

只有注册用户登录后才能发表评论。