查看: 4386|回复: 5

如何获得LOD或者PagedLOD中当前可见的那个节点

[复制链接]

该用户从未签到

发表于 2012-9-27 12:04:55 | 显示全部楼层 |阅读模式
例如:
PagedLOD *plod = new PagedLOD;
plod.setFileName(0, "0.osg");
plod.setRange(0, 0, 10);
plod.setFileName(1, "1.osg");
plod.setRange(1, 10, FLT_MAX);


如何判断获取当前场景中显示的是0.osg还是1.osg?

该用户从未签到

 楼主| 发表于 2012-10-9 09:07:34 | 显示全部楼层
liuzhiyu123 发表于 2012-10-8 08:39
是通过视点的位置和center来进行比较的
databasepager 不控制显示的问题,它只是负责加载和预编译,就是动 ...

谢谢!查阅了LOD源代码等资料,才明白控制哪些节点显示是由LOD(PagedLOD)节点的traverse(NodeVisitor& nv)函数控制的,以下是LOD的traverse函数主要内容:
void LOD::traverse(NodeVisitor& nv)
{
   float required_range = 0;
   if (_rangeMode==DISTANCE_FROM_EYE_POINT)
   {
    required_range = nv.getDistanceToViewPoint(getCenter(),true);//获取视点到LOD节点中心的距离
  }
   unsigned int numChildren = _children.size();
   if (_rangeList.size()<numChildren) numChildren=_rangeList.size();

   for(unsigned int i=0;i<numChildren;++i)
   {   
    if (_rangeList.first<=required_range && required_range<_rangeList.second)
    {
     _children->accept(nv);//使用访问者渲染节点
  }
   }
}

该用户从未签到

发表于 2012-9-27 14:19:17 | 显示全部楼层
自己判断一下距离然后去查找对应子节点就可以了。此外如果您不是采用像素方式的LOD的话,您的粗糙->精细的层次设置顺序反了

该用户从未签到

 楼主| 发表于 2012-9-27 14:30:09 | 显示全部楼层
多谢提醒层次设置顺序。
你说的判断距离指的是视点的位置和plod节点的center之间的距离吗?然后再遍历plod的range列表,判断当前再场景中看到的是哪一个节点?

另外我想问一下,databasepager是怎么控制plod各级节点的显示状态(可见与否)的?是通过类似于switch节点控制各个孩子on/off,还是直接设置plod各个孩子的nodemask来达到显示还是不显示某一层LOD节点的?

该用户从未签到

发表于 2012-10-8 08:39:26 | 显示全部楼层
是通过视点的位置和center来进行比较的
databasepager 不控制显示的问题,它只是负责加载和预编译,就是动态的addchild和removechild
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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