有关View Frustum检测的困惑

xiaolizi 2003-07-31 10:01:23
如果我们的场景中有N个(n>1000)object,如果不考虑场景管理,就简单的做一下基于object的view frustum的检测,怎么做比较快捷? (就是object的bound box和view frustum做检测)

前面有帖子讨论到类似两个长方体的检测,这是一种方法,因为每条边都要做一次检测,这样是不是很慢?
大家有好的建议吗?或者有好的paper,resource可以借鉴?大家讨论讨论。。。
...全文
108 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaolizi 2003-08-20
  • 打赏
  • 举报
回复
最近很忙,先把帖子结了,以后有问题再贴出来。
^_^
xiaolizi 2003-08-04
  • 打赏
  • 举报
回复
To ttmmdd(老孩子) , happy__888([顾问团]寻开心)

多谢两位!!!
我去看看看源代码,如果有问题再来请教大家^_^
寻开心 2003-08-04
  • 打赏
  • 举报
回复
上面的两个例子都是做了精确的判断,如果你希望简单,完全可以简化到,只检测盒子的所有顶点是否都在某一个视锥面的一侧。这样做虽然有的时候在视锥外的物体也被包含进来,认为是可见物体了,但是这也没有大碍,毕竟这不是经常发生的。
寻开心 2003-08-04
  • 打赏
  • 举报
回复
http://www.markmorley.com/opengl/frustumculling.html
这里面是OPENGL的例子而且有说明和代码
寻开心 2003-08-04
  • 打赏
  • 举报
回复
Source: DXSDK\Samples\Multimedia\D3D\Cull
DXSDK 8.1当中有样板,就是上面这个工程
看CULL.CPP当中CullObject哪个函数
实际上是多一个面做的切割。
ttmmdd 2003-08-04
  • 打赏
  • 举报
回复
代码在此!
不过没注释,
将就着看把,
会少裁减,能看出来么?
不过问题不大,概率很小.

E_GEOM_RELATION Frustum::Intersect (const Box & AABB )
{

bool isect = false;
Vector3 neg,pos;

Vector3 bMin (AABB.min_p);
Vector3 bMax (AABB.max_p);

for (int i = 0; i < 6; i++)
{
if (planes[i].a > 0.0f)
{
if (planes[i].b > 0.0f)
{
if (planes[i].c> 0.0f)
{
pos.x = bMax.x; pos.y = bMax.y; pos.z = bMax.z;
neg.x = bMin.x; neg.y = bMin.y; neg.z = bMin.z;
}
else
{
pos.x = bMax.x; pos.y = bMax.y; pos.z = bMin.z;
neg.x = bMin.x; neg.y = bMin.y; neg.z = bMax.z;
}
}
else
{
if (planes[i].c > 0.0f)
{
pos.x = bMax.x; pos.y = bMin.y; pos.z = bMax.z;
neg.x = bMin.x; neg.y = bMax.y; neg.z = bMin.z;
}
else
{
pos.x = bMax.x; pos.y = bMin.y; pos.z = bMin.z;
neg.x = bMin.x; neg.y = bMax.y; neg.z = bMax.z;
}
}
}
else
{
if (planes[i].b > 0.0f)
{
if (planes[i].c > 0.0f)
{
pos.x = bMin.x; pos.y = bMax.y; pos.z = bMax.z;
neg.x = bMax.x; neg.y = bMin.y; neg.z = bMin.z;
}
else
{
pos.x = bMin.x; pos.y = bMax.y; pos.z = bMin.z;
neg.x = bMax.x; neg.y = bMin.y; neg.z = bMax.z;
}
}
else
{
if (planes[i].c > 0.0f)
{
pos.x = bMin.x; pos.y = bMin.y; pos.z = bMax.z;
neg.x = bMax.x; neg.y = bMax.y; neg.z = bMin.z;
}
else
{
pos.x = bMin.x; pos.y = bMin.y; pos.z = bMin.z;
neg.x = bMax.x; neg.y = bMax.y; neg.z = bMax.z;
}
}
}
Vector3 normal(this->planes[i].a , this->planes[i].b,this->planes[i].c);
if
(
normal.Dot(pos)+planes[i].d<0.0f
)
return E_GR_SEPERATE ;

else if (normal.Dot(neg)+planes[i].d<0) isect = true;
}
if (isect) return E_GR_INTERSECT;
return E_GR_INCLUDE;
}
xiaolizi 2003-08-01
  • 打赏
  • 举报
回复
To happy__888([顾问团]寻开心)
恭喜升“*“拉。

可以讲的详细些吗?我需要的是具体可以操作的思路,就是说可以直接编码实现的拉。

”使用视锥的六个裁剪面进行检测“ ---> 这个可以详细些吗? 怎么进行检测?是用object的bound box的8个顶点做检测还是bound box的边线做检测?以及检测的方法。。。

不好意思,我的要求比较多。^_^
寻开心 2003-08-01
  • 打赏
  • 举报
回复
视锥裁剪没有什么特殊的地方啊。
都是变换到视空间后,使用视锥的六个裁剪面进行检测,由于在视空间当中视锥的四个侧面都经过原点,前后裁剪面是固定数值,所以检测比较方便。
检测结果有三种情况,物体完全在视锥外部,不显示;完全在视锥内部不用使用D3D的裁剪; 一半在内一半在外才打开D3D的裁剪状态。
xiaolizi 2003-07-31
  • 打赏
  • 举报
回复
也~~~我的帖子怎么看不到,给自己up一下
^_^

8,325

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧