问个关于四叉树的问题~,求教

dc128 2004-12-31 11:38:12
用四叉树做地形渲染的时候,叶子节点应该为多大?是依据实际情况来处理,还是应该为不能再向下分的最小四边形?请各位指点下~
...全文
399 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
寻开心 2005-01-14
  • 打赏
  • 举报
回复
不是不做视距处理,而是视距比较大的时候
就好比在平原上, 你可以看得很远的.

关于山体遮挡后面的问题,不能简单的处理,比如在飞行的时候, 山体后面的物体也是可见的,至少是部分可见的
如果在平面,你可以简单的认为后面的都不可见

要完整的解决这个问题, 你可以参考遮挡物的算法, 这个算法也简单
就是和生成阴影的volumeshadow类似的
建立一个遮挡物和视点的VolumeShadow,它所包容的部分都是不可见的部分了
IO_X 2005-01-13
  • 打赏
  • 举报
回复
由于读取量小于硬盘缓存,所以没有延时,FPS曲线一直稳定的,而且在PII的机器上。
我是创建了两个线程做实验的,如果读取量大了,多线程就有优势了。
dc128 2005-01-13
  • 打赏
  • 举报
回复
如果不作可视距离的处理,那么视截体多大?我感觉好像变的无穷大了……
在空中也会有这个问题,飞的太高就看不到地面了……

还有个问题,如果在我的视截体里有一块地形,而在视截体面前有一座山,挡住了后面的场景,如何将后面的场景过滤掉呢?
寻开心 2005-01-13
  • 打赏
  • 举报
回复
单线程和多线程是有区别的
因为从磁盘加载内容的时候,线程几乎无法继续处理其他的消息
如果加载和显示都是同一个线程在做的话,显示在加载的时候会停滞的

使用两个以上的线程,一个加载一个显示就会避免这个问题
寻开心 2005-01-11
  • 打赏
  • 举报
回复
使用四叉树未必适合这个环境呢

同样是地形,也是分两种不同的东西
一个是视点在贴近地面的位置浏览
一个是在飞行方式高处看

但是只要是大地形,都涉及到可见范围的情况
如果不做可视距离的处理,那么远处的山脉都是可见的东西
这种情况下,就无法保证四叉树划分的时候,可见的只有四个叶子的情况了
在飞行时候,更是如此,在高空,你可以看到非常大的地面
对于这种情况lod是更有效的处理方案

解决这个问题就是应该lod和区域划分结合的办法
所谓的区域划分,就是把场景网格化, 网格之间有一定的关联关系
视点可以快速定位到某个具体的网格上
同时从一个网格可以直接找到邻接的另外的8个网格上
视点所在和临近的网格的模型使用精细,远处的粗略,更远的地方设置使用一个图片替代都可以,这个也就是lod的概念的本意了

对于大地形的处理难点在两个方面
1 采用动态lod时候的动态算法问题. 静态lod不好的地方是场景本来就很大,加lod后更大
2 采用动态加载时候的多线程实现的难度; 可以采用静态lod,根据情况动态加载它,以减少内存和显存的占据量
myling 2005-01-11
  • 打赏
  • 举报
回复
刚知道四叉树是什么东西

听课ing... ...

IO_X 2005-01-11
  • 打赏
  • 举报
回复
我的地形就是分片处理的,发现用单线程和多线程几乎没差别,因为每次读取高度数据量只有258k左右...
分片的另一个好处是容易生成Triangle Strip的Index,比Triangle List节省多了,速度也快。
再用Shader实现不同细节等级间的平滑过渡(加个浮点等级(0.0-1.0)做tweening),就完全没有地形起跳现象了。
dc128 2005-01-06
  • 打赏
  • 举报
回复
楼上的仁兄说的很很有些道理~,不过既然视锥内最多4个leafs,就好像没必要用LOD了~
dc128 2005-01-05
  • 打赏
  • 举报
回复
to bladeboy(刀锋):
为什么你认为应该以深度来定义树,而不是节点大小呢?我觉的给GPU的数据越少越好,尽量让CPU把那些不需要渲染的东西剔除掉~

另:
谢谢大家的指教,给分太少了,加到100,呵呵
dc128 2005-01-05
  • 打赏
  • 举报
回复
to noslopforever(末日纲领·永远的3D白痴加一个一知半解的2D程序员):
我现在在学3维地形的优化,你推荐给我的教程我还没看,单好像是讲八叉树的吧~,我觉得地形的处理用四叉树够了,不需要用八叉树,因为现在还没有考虑在地形上加其他的东西,仅仅只是想实现很好的速度优化而已。
to Nhsoft(我不是高手):
“看你的Mesh大小和Grid大小的比例”,我不太明白,请指教~,Loose QTree我没听说过,晚上回去查下先。

还有一个问题想问一下,如果我要用到LOD的话,Leaf节点好像就不能设置到最小四边形了,一般的LOD会设置在多少以内呢?(好像是个很蠢的问题)
天堂里的死神 2005-01-05
  • 打赏
  • 举报
回复
恩,其实在我的概念中,四叉树是Z方向上不进行切分的八叉树^_^,呵呵,开个玩笑不要介意哈

是这样的,就按照平衡四叉树来说吧,假设我们的摄像机已经筛选出来了,这个场景里会有哪些叶子可见,那么下面要做的就是对这些叶子里面的每一个物体进行遍历以检测视锥可见性(当然有很多加速算法,但是我先举这个比较简单的例子)。那么,现在的问题就是,每个叶子里面会放多少物体呢?

如果你叶子的面积太大了,那么,每个叶子里面的物体数量肯定就会很多,你想,如果我一个场景内有10000个物体,那么场景划分为10块,和划分为100块当然是有不同的。划分为10块,可能摄像机大部分情况下一次就只能看到一块里面的小部分内容,怎么能显出四叉树的优势呢?
那么我就可以划多些了?也不是的,比如我划分了10000块,这样的话,摄像机与叶子的碰撞检测就会耗去大量的时间,四叉树的优势也没有了/

那么,叶子到底应该多大呢?我所作过的是整个摄像机最大视域的时候,能覆盖到最小1个,最大4个叶子,你可以按照这个比例来进行四叉树的划分。怎么算呢?摄像机看到的场景是一个棱锥吧,您可以把这个棱锥扩大为一个长方体,对于四叉树来说,就是一个长方形。看这个长方形可以框住多大的区域,然后把这个区域边长 X 2再减小一点,那么,毫无疑问最小一个是肯定可以的。那么4个叶子是怎么来的呢?摄像机在边线的时候,大约就是2个,在角的时候大约就是3~4个。

其实这就是一个矛盾的平衡问题:
一个平衡参量是叶子数量,一个平衡参量是叶子大小,这两者互为矛盾。
潘李亮 2005-01-05
  • 打赏
  • 举报
回复
我觉得深度也是必要的。不然遍历这个树的代价比较高。
最好是先分块。每块里面做Lod
bladeboy 2005-01-03
  • 打赏
  • 举报
回复
我觉得不是叶子节点多大,而是应该从总共多少节点,多少层来考虑

我做的GIS中,一般一个城市,6-7层合适...希望对你有参考
潘李亮 2005-01-02
  • 打赏
  • 举报
回复
看你的需求了。
有时候,地形的一个格子上可能可以放好多个的Mesh.看你的Mesh大小和Grid大小的比例.正确的社顶你的Leaf Node的大小.
如果对一个不规则的场景.还是用Loose QTree比较好。
天堂里的死神 2005-01-01
  • 打赏
  • 举报
回复
算法是这样没错,但是一个叶子由两个三角形组成似乎是没必要这么细,不知道你是用来作什么。

其实四叉树应该是精确到物体一级的,也就是模型这个级别的,而不是三角形。
您可以看看下面这篇文章。
http://www.gameres.com/Articles/Program/Visual/3D/OCTREETutorial.htm
dc128 2004-12-31
  • 打赏
  • 举报
回复
应该是平衡四叉树,我也觉得叶子分的太细会导致判断过多影响效率,我是这样想的,不知道对不对,请指点,对四叉树的节点从上到下用视锥裁剪,不在视锥内节点的剔除,完全在视锥内的不用说了,部分在视锥内的继续对其的子节点进行视锥裁剪。这样的话,一个叶子可能就是由2个三角形组成的最小四边形,如果是这样的话,四叉树有没有必要要分的这么细?
天堂里的死神 2004-12-31
  • 打赏
  • 举报
回复
如果是非平衡四叉树,可以根据场景物体的包围盒(?),没做过不清楚。但不可能精确到三角形一级的,没必要。

如果是平衡四叉树,那就看自己场景是怎么组织的,有什么需求了。

视锥先看能看到哪些叶子,再通过叶子去筛选物体,叶子分得多了,可能导致视锥与叶子的判断太多,还不如直接视锥裁减,叶子分得少了,四叉树本身的意义又没了。

8,305

社区成员

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

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