查看: 827|回复: 2

数据调度问题

[复制链接]

该用户从未签到

发表于 2014-10-22 15:57:33 | 显示全部楼层 |阅读模式
本帖最后由 abc-osg 于 2014-10-23 08:45 编辑

一共有5个区域 每个区域分别有80个模型(2级)经过合并后 给plod调度:
1 该显示的模型不显示
2 近距离显示的模型应带有贴图,而没有
下面是模型合并代码:
void cOSG::combineModel(CString strFilepath,CString strNodeName)
{
osg::ref_ptr<osg::Group> result=new osg::Group;
CString szDir = strFilepath;
    double x,y,z;
    if(szDir.Right(1) != "\\")
        
    szDir += "\\";
   
    szDir += "*.osg";
CFileFind Finder;   
BOOL res = Finder.FindFile(szDir);
    try
        {
                while(res)      
                {                 
                         res = Finder.FindNextFile();
                         CString strPath = Finder.GetFilePath();         //得到全路径名     
                         CString strTitle = Finder.GetFileTitle(); //得到不带后缀文件名  
                         CString str3dsName=strPath.Left(strPath.GetLength()-4);
                     str3dsName+=".3ds";
                         osg::ref_ptr<osg::Group> group=new osg::Group;
             osg::ref_ptr<osg::Node>  mModel= osgDB::readNodeFile(strPath.GetBuffer(0));
                         osg::ref_ptr<osg::Node>  mModel3dx= osgDB::readNodeFile(str3dsName.GetBuffer(0));
                         osg::ref_ptr<osg::  PagedLOD> page = new osg::  PagedLOD();
                         page->setCenterMode( osg:: PagedLOD::USER_DEFINED_CENTER );
                         if(mModel&&mModel3dx)
                         {
                                osg::BoundingSphere bs=mModel->computeBound();                 
                                osg::Vec3 newCenter=bs.center();
                                double radius=bs.radius();
                                x=newCenter.x();
                                y=newCenter.y();
                                page->setCenter(osg::Vec3(x,y,0));                         
                                page->setName(strTitle.GetBuffer(0));
                                page->setRadius(radius);                                 
                                page->addChild(mModel,0,500);
                                page->addChild(mModel3dx,500,1000);
                                        
                 
                         }
                         if(mModel&&!mModel3dx)   
                         {
                                osg::BoundingSphere bs=mModel->computeBound();                 
                                osg::Vec3 newCenter=bs.center();
                                double radius=bs.radius();
                                x=newCenter.x();
                                y=newCenter.y();
                                page->setCenter(osg::Vec3(x,y,0));                         
                                page->setName(strTitle.GetBuffer(0));
                                page->setRadius(radius);       
                                page->addChild(mModel,0,500);
                                
                 
                         }
                          if(!mModel&&mModel3dx)   
                         {
                                osg::BoundingSphere bs=mModel3dx->computeBound();                 
                                osg::Vec3 newCenter=bs.center();
                                double radius=bs.radius();
                                x=newCenter.x();
                                y=newCenter.y();
                                page->setCenter(osg::Vec3(x,y,0));                         
                                page->setName(strTitle.GetBuffer(0));
                                page->setRadius(radius);
                                //page->addChild(mModel,0,500);
                                page->addChild(mModel3dx,500,1000);
                                        
                 
                         }
                         
                         if(page->getNumChildren()>0)
                         {
                 group->addChild(page);
                                 result->addChild(group);
                         }
                }
        }
        catch(...)
        {
                return;
        }
        if(result->getNumChildren()>0)
        {
                CString strosgfile,strdbfile;
                strosgfile=strFilepath;
                strosgfile+=strNodeName;
                strosgfile+=".osg";       
                strdbfile=strFilepath;
                strdbfile+=strNodeName;
                strdbfile+=".db";
            osgDB::writeNodeFile(*(result.get()),strosgfile.GetBuffer(0));
                x=result->getBound().center().x();
                y=result->getBound().center().y();
                z=result->getBound().center().z();
                double radius=result->getBound().radius();
                CFile file(strdbfile,  CFile::modeCreate|CFile::modeWrite);
                file.Write(&x,sizeof(double));
                file.Write(&y,sizeof(double));
                file.Write(&z,sizeof(double));
                file.Write(&radius,sizeof(double));
                file.Close();       
        }
         }
外面调度的代码:
x y radius从文件里面读取过,正确
osg::ref_ptr<osg:: PagedLOD> page = new osg:: PagedLOD();
page->setName(strTitle.GetBuffer(0));
page->setCenterMode(osg:: PagedLOD::USER_DEFINED_CENTER );
                                //设置中心位置
page->setCenter(osg::Vec3(x,y,0));

                                //添加节点,设置0级的内容为cow.osg
page->setFileName(0,strPath.GetBuffer(0));//cow.osg");
                                //设置可视setCenter变化范围为0.0f-50.0f
                                 
page->setRange(0,0.0f,4000.0f);
page->setRadius(distance);
other->addChild(page);  

测试环境:cpu i3 显卡 geoforce GTX 750显存2g  内存 4g
这样就出现描述的问题
是文件合并有问题 还是外面调度有问题?
高手 请指示

该用户从未签到

发表于 2014-10-23 15:40:32 | 显示全部楼层
可以根据模型位置构建一个四叉树的金字塔结构
                                   plod
                                                    /     \
                                              plod  plod plod plod
                                             /    \                 /      \
                                          model null           model null

该用户从未签到

 楼主| 发表于 2014-10-23 16:13:50 | 显示全部楼层
你的区域层的plod该如何写代码?如果是setFileName,哪儿找文件?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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