查看: 1353|回复: 2

将Camera添加到Group中时 程序崩溃了.

[复制链接]

该用户从未签到

发表于 2009-9-6 00:54:31 | 显示全部楼层 |阅读模式
我写的一段代码 需要操作多个Camera.但是在我初始化Camera后 将其添加到一个Group节点的时候.程序崩溃了。下面贴出代码.

  1. bool ShapefileHandler::readNodeFile(const std::string& filename){
  2.     bool ret=false;
  3.     map<string,Camera*> aNodeMap;
  4.     Node* fileNode=osgDB::readNodeFile (filename);
  5.     if(fileNode){
  6.         Geode* gn=fileNode->asGeode ();
  7.         if(gn){
  8.            //将shp插件读取出来的节点按照每个Drawable一个节点的方式分解,便于控制.
  9.             for(unsigned int i=0;i<gn->getNumDrawables();i++){
  10.                 Geode* fn=new Geode();
  11.                 Drawable* draw=gn->getDrawable(i);
  12.                 fn->setUserData (draw->getUserData());
  13.                 fn->addDrawable (draw);
  14.                 string name="";
  15.                 ShapeAttributeList* attrList=dynamic_cast<ShapeAttributeList*>(fn->getUserData());
  16.                 ShapeAttributeList::iterator attrIt=attrList->begin ();
  17.                 while(attrIt!=attrList->end ()){
  18.                     ShapeAttribute attr=*attrIt;
  19.                     if(attr.getName()=="GRID_NO"){
  20.                         name=attr.getString();
  21.                         unsigned int start=name.find_first_not_of(' ');
  22.                         unsigned int end=name.find_last_not_of(' ');
  23.                         name.erase(0,start);
  24.                         name.erase(end+1);
  25.                     }
  26.                     attrIt++;
  27.                 }               
  28.                //找到该节点所属的Camera并加入其中.
  29.                 Camera* gp=NULL;
  30.                 map<string,Camera*>::iterator it=aNodeMap.find(fn->getName());
  31.                 if(it==aNodeMap.end()){
  32.                     gp=new Camera();
  33.                     gp->setName(name);
  34.                     aNodeMap[name]=gp;
  35.                 }else{
  36.                     gp=aNodeMap[name];
  37.                 }
  38.                 gp->addChild (fn);
  39.             }
  40.             //所有的Camera都在这里了.将他们统一初始化一下.然后添加到Group节点.
  41.             map<string,Camera*>::iterator it2=aNodeMap.begin ();
  42.             while(it2!=aNodeMap.end()){
  43.                 Camera* gp=(*it2).second;
  44.                 initCamera(gp);
  45.                [color=Black] mRootNode->addChild(gp);//此处崩溃.[/color]
  46.                 it2++;
  47.             }
  48.         }        
  49.     }
  50.     return ret;
  51. }
复制代码
大家帮忙看看 是什么问题?
这个代码是为了管理多个Camera和下属的节点而写的. 我原来写过一段代码是将一个Geode添加到Camera然后添加到Group的.完全没有问题。所以我觉得是不是Camera的使用有某个限制 这次被我用到了.

该用户从未签到

 楼主| 发表于 2009-9-6 00:55:27 | 显示全部楼层
其中initCamera的代码如下:

  1. void ShapefileHandler::initCamera(Camera* camera){
  2.   ComputeBoundsVisitor v;
  3.   camera->accept (v);
  4.   BoundingBox box=v.getBoundingBox ();

  5.   int w=(box.xMax ()-box.xMin());
  6.   int h=(box.yMax ()-box.yMin());
  7.   int txt_width=800,txt_height=450;


  8.   camera->setClearColor(osg::Vec4(1.f,1.f,1.f,1.0f));
  9.   camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  10.   camera->setProjectionMatrix(osg::Matrix::ortho2D(-w/2,w/2,-h/2,h/2));
  11.   camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);

  12.   camera->setViewport(0,0,txt_width,txt_height);
  13.   camera->setRenderOrder(osg::Camera::POST_RENDER);
  14.   camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
  15.   
  16.   HowtoManipulator mani(NULL);
  17.   mani.setNode(camera);
  18.   mani.home(0);
  19.   camera->setViewMatrix (mani.getInverseMatrix());

  20.   Texture2D* txt=new Texture2D();
  21.   
  22.   txt->setWrap (Texture2D::WRAP_S ,Texture2D::REPEAT );
  23.   txt->setWrap (Texture2D::WRAP_T ,Texture2D::REPEAT );

  24.   txt->setFilter(Texture::MIN_FILTER,Texture::LINEAR);
  25.   txt->setFilter(Texture::MAG_FILTER,Texture::NEAREST);  
  26.   camera->attach(osg::Camera::COLOR_BUFFER,txt);
  27.   mTextMap[camera->getName()]=txt;
  28. }
复制代码

该用户从未签到

发表于 2009-9-6 09:45:38 | 显示全部楼层
Camera的使用没有限制。您可以检查有没有其它的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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