背面剔除的数学原理

来源:互联网 发布:2016淘宝前十名店铺 编辑:程序博客网 时间:2024/05/02 00:55

按我自己的理解,对于左手坐标系,顺时针排列的顶点v0,v1,v2

Vector3 V01 = V1.position-V0.position;

Vector3 V02 = V2.position-V0.position;

V02.x * V01.y - V01.x * V02.y < 0 背面

V02.x * V01.y - V01.x * V02.y > 0 正面

V02.x * V01.y - V01.x * V02.y = 0 投影成一条线了,画还是不画这样的情况就看你喜好了

 

以下文章转自 http://bbs.9ria.com/thread-9211-1-1.html 关于背面剔除的原理讨论。

 

以下进行完整数学演算

在透视坐标系中

设   v1为点A->C的向量,即(cax,cay);
     v2为点C->B的向量,即(bcx,bcy);

将其转为相机坐标系,齐次化v1,v2

v1(cax,cay,1)
v2(bcx,bcy,1)

这里 看这里 问题来 是v1Xv2 还是v2Xv1,这就是楼上产生时针疑问的源头
v1Xv2=(cay-bcy,bcx-cax,cax*bcy-bcx*cay)
v2Xv1=(bcy-cay,-bcx+cax,bcx*cay-cax*bcy)

根据楼主最后返回值的定义
我暂时选择v2Xv1


经过叉积计算得到面法线n
n(bcy-cay,-bcx+cax,bcx*cay-cax*bcy)

计算v1v2所在面法线与屏幕法线(即光线)的点积是否小于0

假设有两条屏幕法线 n1(x,y,z) n2(0,0,1)
其中n1是观察者向量


由于屏幕法线为无数条与z轴平行的向量,根据平行向量的性质,任一组平行向量都可移到同一直线上,
那么,计算n1与n的夹角时
n1等价于(0,0,1);

那么n.n1=(bcy-cay,-bcx+cax,bcx*cay-cax*bcy)(0,0,1)=bcx*cay-cax*bcy

如果n.n1>0 则为显示面 如果n.n1<0则为消隐面

bcx*cay>cax*bcy 为显示面
bcx*cay<cax*bcy 为消隐面

综上 消隐面判断与顺时针 逆时针并无关系

造成此问题的原因是ABC的顺序未定 需要进行预先假设才可得出楼主的结论

 

原创粉丝点击