|
本帖最后由 rubby 于 2014-8-28 08:46 编辑
各位大哥,小弟有一个问题,困扰很久,恳请各位给些建议:
我看各位帖子和书本知道:
DatabasePager +pageLOD 解决精细模型,粗糙模型问题
我的问题和 精细模型,粗糙模型问题 不完全相同,但感觉可以转化,问题具体如下:
=========================================================================
构造一个三维井柱,井柱并非规则的圆柱,其表面是由很多个Quad 拼接起来的。
每个Quad顶点的位置各不相同,顶点的颜色由位置计算得到。
用户通常只需要看到某一个深度段的井柱,可以拖动一个slider(或者按键)改变深度段位置。
【我以前的方法】
一次性生成几百米三维井柱面,然后增加上下两个裁剪面,将用户不感兴趣的裁剪,如果用户需要看其他深度段位置,将整个三维井柱进行平移即可。
【现在的问题】 1.当井柱更长(几千米或其它情况),发现一次性将这些四边形生成非常占用内存和消耗时间,根据统计信息,将有几百万个顶点和四边形。
=========================================================================
一、所以,我想
1.首先我的问题和LOD问题不一样,LOD 是根据远近距离设置细节层次,越近越精细。
我这里总是给用户展示细节,只是展示不同深度段的圆柱面。
2. 是否可以用DatabasePager +PageLod 解决?
我的想法是:
2.1 将几千米井柱分段,比如分成1000份, 将每一份存到本地文件,文件名为 0.osg, 2.osg, 3.osg......999.osg。
2.2 然后
plod->setFileName(0, "0.osg" );
plod->setFileName( 1, "1.osg" );
plod->setFileName( 2, "2.osg" );
。。。。
plod->setFileName( 999, "999.osg" );
plod->setRange( 0, ..., ... );
plod->setRange( 1, ..., ... );
plod->setRange( 2, ..., ... );
。。。
plod->setRange(999, ..., ... );
当用户拖动一个slider(或者按键)改变深度段位置,改变当前视野范围,动态加载对应的深度段的osg文件。
困难是:
3.1 setRange 中的minRange,maxRange值如何设定。当用户拖动一个slider(或者按键),
用哪个函数可以改变当前视野范围(并不真的拉近拉远)
3.2 需要使用四叉树分块之类处理技术吗?
3.3 一定需要将井柱分段存储成本地文件吗?
因为用户可能需要更新四边形位置(因为其它因素改变,如采样率,一米画多少个四边形),顶点颜色。
那么这个时候,我有需要重新更新1000个本地osg文件
二、
另外一个想法是:
自己控制节点 addChild removechild.
比如:用户拖动slider改变深度段位置,将某些osg 文件加载,同时移除某些已载入场景图中osg。
主要担心自己处理效率问题。
多谢各位赐教。小弟拜谢~。
效果图见附件。
|
|