基于矢量点积的高效可视剔除算法

基于矢量点积的高效可视剔除算法
最近在一大堆矢量运算中突然受到启发,密制出了一种高效的可视剔除算法,这里抛砖引玉。
我们知道在适量运算中的点积可以计算出2矢量夹角的余弦值,在D3DX函数库这个计算变得很简单
float fRadius = D3DXVec3Dot( &vec1, &vec2);
一般我们在设投射矩阵时,视角是90度也就是D3DX_PI / 4。先通过矢量运算得到摄像机矢量
D3DXVECTOR3 vCamera = vLookAt - vEyePt;
同样的方法,每一个物体的位置和摄像机的连线矢量也算出来
D3DXVECTOR3 vObj2Eye =vObjPt - vEyePt;
注意,一定注意适量的方向,翻翻线形代数书吧

本算法的核心是:当物体摄像机的连线(vObj2Eye)和摄像机矢量(vCamera)的夹角大于视角/2时,
示在视野外,这时不绘制物体,反之亦然。

这里将45度的cos值保存下来,这个量会在编译期确定,不用担心效率问题
const float radian = cos(D3DXToRadian(45));

这里必须要对前面的矢量单位化
D3DXVec3Normalize(&vObj2Eye,&vObj2Eye);
D3DXVec3Normalize(&vCamera,&vCamera);

float v=D3DXVec3Dot(&vObj2Eye,&vEyeVec);
if  (v>deg)
return true;//不剔除
else
return false;//剔除

发现这个算法很简单,很高效了吧!嘿嘿
然后可以将Mesh的BoundingBox的8个点,外加自己中心点来做以上的计算。可以让剔除更准确

本算法优点(针对运行期而言):
1.没有使用任何的三角函数
2.没有使用任何视锥数据
3.场景无关,通用剔除算法

预测和已知本算法的缺点
1.对于大物体会剔出失效,增加可能观察点的数据来弥补该缺点
Davy.xu

All rights reserved Sunic Entertainment 2005
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值