查看: 922|回复: 2

如何用DatabasePager 解决非精细模型,粗糙模型问题

[复制链接]

该用户从未签到

发表于 2014-8-27 14:36:29 | 显示全部楼层 |阅读模式
本帖最后由 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。
主要担心自己处理效率问题。

多谢各位赐教。小弟拜谢~。

效果图见附件。

1.png
2.png

该用户从未签到

 楼主| 发表于 2014-8-28 08:47:15 | 显示全部楼层
小弟跪求各位大哥不吝赐教~~

该用户从未签到

 楼主| 发表于 2014-8-29 10:57:27 | 显示全部楼层
看来我的帖子太长啦。。。。

简单问一个问题,求大哥给点提示:

自己在callback中 addchild removechild ,会使绘制效率降低很多吗?》
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表