游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2499|回复: 0

我的视锥剔除算法,希望大家帮忙优化。

[复制链接]

96

主题

529

帖子

539

积分

高级会员

Rank: 4

积分
539
发表于 2004-12-29 11:57:00 | 显示全部楼层 |阅读模式
看了一篇视锥剔除的算法的教程,但我认为应该不是最优的方案,我自己也琢磨了一个方法。
该教程的地址是:http://www.chinagamedev.net/cgd/develop/3D/200202/SimpleFrustum.htm

它主要分三个步骤,第一个步骤要用到向量夹角公式和cos函数,剔除背面的点,第二个步骤只是简单判断z值,进行最近可视点和最远可视点的剔除,第三部再用到atan函数在剔除正面但看不到的点。

我的方法是:
视点定义为{eye.x, eye.y, eye.z},中心点定义为{center.x, center.y, center.z},
要检查的目标点定义为{pos.x,pos.y,pos.z}
我把视点到中心点的向量分为两个2D向量——水平向量hView,垂直向量vView,而不是一个3D向量。
{hView.x, hView.z} = {center.x, center.z} - {eye.x, eye.z}
{vView.y, vView.z} = {center.y, center.z} - {eye.y, eye.z}
视点到目标点的向量也分为俩2D向量:
{hPos.x,hPos.z} = {pos.x, pos.z} - {eye.x, eye.z}
{vPos.y,vPos.z} = {pos.y, pos.z} - {eye.y, eye.z}

最近和最远可视点最先检查,而不是像教程那样放在第二步。因为这一步被剔除计算最快:
if z>far or z < near
then return 0;

//用2D向量检查,就不需要再考虑剔除视点背面的点了,因为我们可以分别计算出垂直和水平方向的夹角。
if cos (vView ^ vPos) > yfovy/2 //求垂直方向夹角
    then return FALSE;
if cos (hView ^ hPos) > xfovy/2 //求水平方向夹角
    then return FALSE;

xfovy/2和yfovy/2都是静态的,因为它们在设置投影矩阵时就可以计算出,而不需要每个Frame都计算,我的方法需两个步骤,教程需三步。我的方法比该教程的方法多用一次cos函数和求向量多出的几次减法运算,但少用两次ctan函数。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 21:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表