查看: 2886|回复: 12

大家来探讨一下pagelod的问题

[复制链接]

该用户从未签到

发表于 2011-5-13 17:13:44 | 显示全部楼层 |阅读模式
本帖最后由 andy1uo 于 2011-5-16 13:07 编辑

我学习OSG不久,所以有问题请教大家!
pagelod里面setRange是设置可视范围的是吧?这个应该是毫无疑问的。问题来了,我做了一个简单的实验,就是这个范围是当前摄像机相对于坐标原点的距离。
那么,在大场景中,用pageload的方法来提高运行效率是对的,但是由于这个距离不是摄像机和物体之间的距离,所以是不是意味着程序在运行时,所显示的节点并不是我们所想要的呢?
我想问一下大家,在pagelod的时候能不能设置某个节点的初始位置,摄像机是不是可以通过和这个平移后的位置进行比较?
代码如下

  1. filename = strFilPath + "Terrain.ive";
  2. float rang = 5000.0;
  3. int num = 0;
  4. int rangBase = 1;
  5. page->setFileName(num,filename);
  6. page->setRange(num, rang, 2 * rang*100);
  7. num++;

  8. // 级数范围
  9. for (int level = 0; level < 5; level++)
  10. {
  11.   for(int X = 0; X < rangBase; X++)
  12.   {
  13.    for(int Y = rangBase-1; Y >=0; Y--)
  14.    {
  15.     filename = strFilPath + "Terrain_L";
  16.     //filename.append(atoi(level));
  17.     std::stringstream streamm;
  18.     streamm<<filename<<level<<"_X"<<X<<"_Y"<<Y<<"_XXX.ive";
  19.      streamm>>filename;
  20.     page->setFileName(num, filename);
  21.     if (level == 4)
  22.     {
  23.      page->setRange(num, 0, rang / rangBase);
  24.    
  25.     }else
  26.     {
  27.      page->setRange(num, rang / (rangBase * 2), rang / rangBase);
  28.     }
  29.    
  30.     num++;
  31.    }
  32.   }
  33.   rangBase *= 2;
  34. }
复制代码

上面是我设置pagelod的代码,这样的设置是否能够起到pagelod真正的功能。还是说还需要别的设置?

该用户从未签到

发表于 2011-5-13 20:44:12 | 显示全部楼层
“pagelod里面setRange是设置可视范围的是吧?这个应该是毫无疑问的”
当然不是毫无疑问啦

该用户从未签到

发表于 2011-5-16 09:18:25 | 显示全部楼层
我做了一个简单的实验,就是这个范围是当前摄像机相对于坐标原点的距离。
我没有明白您在做什么试验,因此也就无从讨论您的结果。能否把您的试验代码列举出来?然后提出您认为什么情况下会出现问题

该用户从未签到

 楼主| 发表于 2011-5-16 13:23:04 | 显示全部楼层
我想问一下二楼的heye,setRange的作用到底是什么呢?
在我的理解,pagelod是摄像机在有效范围内,导入我们设定好的节点。那么他的有效范围是针对什么而言的呢?是不是当前摄像机到模型节点的“物体坐标原点”在世界坐标系中坐标的距离,如果是这样的话,那么,当N个处于同一级别的模型,他们的“物体坐标原点”在世界坐标系中的坐标多是一样的情况下(假设坐标为(0,0,0),这一级别的模型有64个,当前状态刚好是处于显示这一级别的模型),pagelod的这个机制是怎么样来正确显示这64个模型中需要显示的模型呢?

该用户从未签到

发表于 2011-5-17 09:09:56 | 显示全部楼层
对于PagedLOD而言,这样设置是正确的:
setFileName( lv, filename );
setRange( lv, min, max );

此外OSG中默认以0为最粗糙级别,各级别的最大最小可视范围要按照从大到小的顺序排列,即:
setRange( 0, l2, FLT_MAX );
setRange( 1, l1, l2 );
setRange( 2, 0, l1 );  // l2 > l1 > 0

当N个处于同一级别的模型,他们的“物体坐标原点”在世界坐标系中的坐标多是一样的情况下
我没明白您这句话的意思,这些模型被重叠着放置?这些模型各自都有自己的LOD节点来管理,因此不需要特定的机制来避免他们互相的耦合

该用户从未签到

 楼主| 发表于 2011-5-17 10:30:15 | 显示全部楼层
回复 5# array


    我以前用过别的引擎,所以在我认为物体有自身的物体坐标,比如说一个球体,如果是系统生成的他的自身坐标应该是他的球心,如果是自己在3DMAX之类的软件中生成的,它的自身坐标就是它在3Dmax中的原点。所以,当一组模型他们的自身坐标多是原点的时候,比如说一张地形的模型,生成N个模型,在导入到osg中时,不需要调整他们在osg中的位置就可以拼贴在一起,所以在这个情况下,pagelod是怎么样来工作呢?它所指的range是指哪里到哪里呢?

该用户从未签到

发表于 2011-5-18 14:27:13 | 显示全部楼层
这个range指得是对象中心与人眼位置的距离,这似乎与对象局部坐标系没什么关系?

该用户从未签到

 楼主| 发表于 2011-5-18 17:11:20 | 显示全部楼层
回复 7# array
我是看到了这样的一个现象,我的pagelod节点有300多个,然后当摄像机一靠近坐标(0,0,0)点的时候,所有的pagelod的节点全都导入到程序里了,所以我才有这样的疑问。

该用户从未签到

 楼主| 发表于 2011-5-19 13:01:05 | 显示全部楼层
其实我还想问一下,pagelod的每个子节点可以设置它的位置吗?
或者说对每个字节点设置中心点

该用户从未签到

 楼主| 发表于 2011-5-20 10:18:41 | 显示全部楼层
现在我有点明白了,pagelod 是将到达同一级的所有节点导入到程序中,但是这样的做法好像还是达不到优化程序的作用啊,一旦进入到最精细层,所有这一层的模型将被导入,而最精细的这一层往往是最复杂最大的。能否将最精细的这一层可以根据摄像机的位置状态来实时加载呢,这样可以不必一次性导入到场景中去

该用户从未签到

发表于 2011-5-21 23:48:59 | 显示全部楼层
结合一些空间索引的方法才能充分发挥pagedlod的作用,例如经典的四叉树

该用户从未签到

 楼主| 发表于 2011-5-24 08:43:22 | 显示全部楼层
我想你说的意思是不是,将最精细的那一层根据每一块模型在空间中的实际位置再次设置range,是这样吗

该用户从未签到

发表于 2011-5-24 08:51:51 | 显示全部楼层
我不太明白您的表述,也许您用代码来试验和反馈会更恰当
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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