平民程序 - linghuye's blog

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

随笔 - 221, 文章 - 0, 评论 - 680, 引用 - 0

导航

公告

愿绵泊的悲哀浸透我颓废的一生

围在城里的人想逃出来,城外的人想冲进去,对婚姻也罢,职业也罢,人生的愿望大多如此.

常用链接

留言簿(149)

随笔分类

随笔档案

收藏夹

友情链接

目前常用链接

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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 阅读(602) 评论(0)  编辑 收藏 引用 所属分类: 3D图形学研究

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