查看: 1228|回复: 6

各位高手,急需帮忙!!!

[复制链接]

该用户从未签到

发表于 2011-4-7 08:02:32 | 显示全部楼层 |阅读模式
我编的程序在普通环境中能实现其功能,但是在3d-arry的框架下就不能实现其功能,还有就是节点显示不出来〉比如说雨雪天气的实现,但是把程序放入3d模型框架,就不能实现这个效果,不知道什么原因,急需帮忙,十分感谢!!!

该用户从未签到

发表于 2011-4-7 08:57:36 | 显示全部楼层
我不知道您要做什么,也不知道什么是3d-arry

该用户从未签到

 楼主| 发表于 2011-4-12 20:46:04 | 显示全部楼层
老师您好,我上次问题估计是没有说清楚,我现在遇到的问题是显示问题
就是这个显示雾雪天气的程序在下面这个框架里显示不出来(这是程序的一部分,调试过程也没有问题)
int CMy3App::gfx_start() //
{
       
    osgViewer::Viewer viewer;
       

        //建立scene graph 的根节点
        osg::ref_ptr<osg::Group> root = new osg::Group;

        //为了能够加载来自文件的模型,必须首先声明一个句柄指向osg::Node 型的实例
        osg::ref_ptr<osg::Node> groundNode = new osg::Node;
        //osg::ref_ptr<osg::Node> jeepNode = new osg::Node;
   
        //读取模型
      groundNode = osgDB::readNodeFile("Model/TERRAIN.flt");
    //groundNode =osgDB::readNodeFile("lz.osg");

   // jeepNode = osgDB::readNodeFile("Model/jeep.flt");
   // jeepNode = osgDB::readNodeFile("Model/t72m1.flt");
               
        //将groundNode节点首先变换位置之后,然后再导入场景中
        osg:ositionAttitudeTransform* groundXform = new osg::PositionAttitudeTransform();
        osg::Vec3f groundPosition( 0.0, 0.0,-0.5);
        groundXform->setPosition(groundPosition);
        groundXform->addChild(groundNode.get());
        root->addChild(groundXform);

/*
        //将jeep节点首先变换位置之后,然后再导入场景中
        osg::PositionAttitudeTransform* jeepXform = new osg::PositionAttitudeTransform();
        osg::Vec3f jeepPosition( 62.5, 317.5, 0.0 );
   


        //车的姿态
        jeepXform->setAttitude(osg:uat(osg:egreesToRadians(0.0), osg::Vec3(0,0,1) ) );

        jeepXform->setPosition( jeepPosition );
        jeepXform->addChild(jeepNode.get());
         root->addChild(jeepXform);

*/
    //添加HUD文字
        root->addChild(createHUDText());
        root->addChild(SkyBox());
    root->addChild(jeep());

        DiXing_Pat=dixing();

        rootNode->addChild(DiXing_Pat);
       

        //cbw  雨
          osg::ref_ptr<osgParticle::PrecipitationEffect> pe = new osgParticle::PrecipitationEffect();
          pe->rain(0.3);
      //设置雪花颜色
          pe->setParticleColor(osg::Vec4(1, 1, 1, 1));
          //设置风向
      pe->setWind(osg::Vec3(1, 0, 0));
      pe->setUseFarLineSegments(true);
       

   //设置背景色
   viewer.getCamera()->setClearColor( pe->getFog()->getColor());
   

   //使用雾效
    //node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());
/*
        rootNode->addChild(SkyBox());
    rootNode->addChild(GrassTree()); */
    rootNode->addChild(groundNode.get());
  // rootNode->addChild(rootNode.get());
    rootNode->addChild(pe.get());

        Explode=createSequence();
        Explode->setUpdateCallback(new SpaceJeepCallback());

           

        osgUtil::Optimizer optimizer ;
        optimizer.optimize(root.get()) ;

        viewer.setSceneData( root.get() );
        viewer.realize();

        Tar1_Pat=Target1();
        Tar1_Pat->setUpdateCallback(new BulletCallback1());
        rootNode->addChild(Tar1_Pat);

        rootNode->addChild(createLit());

        viewer.addEventHandler(new UserEventHandler(viewer.getCamera()));

        //viewer->realize();
  //  viewer->addEventHandler(new TechniqueEventHandler(viewer->getCamera()));//渲染方法赋值,并可以用键盘更改
        while (!viewer.done())
        {

                viewer.getCamera()->setViewMatrixAsLookAt(osg::Vec3(cx,cy,cz),osg::Vec3(lx,ly,lz),osg::Vec3(0,0,1));
                jeepXform->setPosition(osg::Vec3(jeep_x,jeep_y,0));
                jeepPositioned->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f,0.0f,0.0f))*
                        osg::Matrix::scale(1.0f,1.0f,1.0f)*
                        osg::Matrix::rotate(osg::inDegrees(Angle),0.0f,0.0f,1.0f));

                if (Explode_States_D==true)
   {
           osg::Vec3 pos=pat->getPosition();
           float x=pos.x();
           float y=pos.y();
           float z=pos.z();
          
          
           float        Dis1=sqrt((x-Position[12])*(x-Position[12]) + (y-Position[13])*(y-Position[13]) + (z-Position[14])*(z-Position[14]));
           if (Dis1<10)
           {
                  Add_Explode(Position[12],Position[13],0);
          Explode_States_D=false;
          pat->setNodeMask(0);
          
           }
          
               
   }

                viewer.frame();

        }

        return 0 ;


}
如果放在这个框架下就能完全显示,出现雾雪效果
int main()
{
        osgViewer::Viewer* viewer = new osgViewer::Viewer();

/*
        //cbw  雪
          osg::ref_ptr<osgParticle::PrecipitationEffect> pe = new osgParticle::PrecipitationEffect();
          pe->snow(0.5);
      //设置雪花颜色
          pe->setParticleColor(osg::Vec4(1, 1, 1, 1));
          //设置风向
      pe->setWind(osg::Vec3(0.2, 0, 0));
      pe->setUseFarLineSegments(false);
          //pe->m_fRotateDe(0.4);

   //设置背景色
   viewer->getCamera()->setClearColor( pe->getFog()->getColor());

   //使用雾效
  /* node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());
   

        rootNode->addChild(SkyBox());
        rootNode->addChild(GrassTree());  
   // rootNode->addChild(rootNode.get());
//   rootNode->addChild(pe.get());
  */

       

        //cbw  雨
          osg::ref_ptr<osgParticle::PrecipitationEffect> pe = new osgParticle::PrecipitationEffect();
          pe->rain(0.3);
      //设置雪花颜色
          pe->setParticleColor(osg::Vec4(1, 1, 1, 1));
          //设置风向
      pe->setWind(osg::Vec3(1, 0, 0));
      pe->setUseFarLineSegments(true);
       

   //设置背景色
   viewer->getCamera()->setClearColor( pe->getFog()->getColor());
   

   //使用雾效
    //node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());

        rootNode->addChild(SkyBox());
        rootNode->addChild(GrassTree());  
   // rootNode->addChild(rootNode.get());
    rootNode->addChild(pe.get());
       





        Explode=createSequence();
        Explode->setUpdateCallback(new SpaceJeepCallback());



       
        Seq_Pat->addChild(Explode);
       
        //Tar1_Seq_Pat->addChild(Explode);

   // Tar1_Seq_Pat->setPosition(osg::Vec3(0.0,0.0,-50));

        //rootNode->addChild(Tar1_Seq_Pat);

        rootNode->addChild(Seq_Pat);


       
        DiXing_Pat=dixing();

        rootNode->addChild(DiXing_Pat);
       
       
        Tar1_Pat=Target1();
        Tar1_Pat->setUpdateCallback(new BulletCallback1());
        rootNode->addChild(Tar1_Pat);
       
        Tar2_Pat=Target2();
        Tar2_Pat->setUpdateCallback(new BulletCallback2());
        rootNode->addChild(Tar2_Pat);
       
        Tar3_Pat=Target3();
        Tar3_Pat->setUpdateCallback(new BulletCallback3());
        rootNode->addChild(Tar3_Pat);



        rootNode->addChild(createLit());
        rootNode->addChild(jeep());

       

       
       
        //优化场景数据
        osgUtil::Optimizer optimizer ;
        optimizer.optimize(rootNode) ;

        viewer->setSceneData(rootNode);

        viewer->realize();
    viewer->addEventHandler(new TechniqueEventHandler(viewer->getCamera()));//渲染方法赋值,并可以用键盘更改
        while (!viewer->done())
        {

                viewer->getCamera()->setViewMatrixAsLookAt(osg::Vec3(cx,cy,cz),osg::Vec3(lx,ly,lz),osg::Vec3(0,0,1));
                jeep_hangmu_position->setPosition(osg::Vec3(jeep_x,jeep_y,0));
                jeep_positioned->setMatrix(osg::Matrix::translate(osg::Vec3(0.0f,0.0f,0.0f))*osg::Matrix::scale(1.0f,1.0f,1.0f)*osg::Matrix::rotate(osg::inDegrees(jiaodu),0.0f,0.0f,1.0f));
                Seq_Pat->setPosition(osg::Vec3(shoot_x,shoot_y,1.25f));
      
                //Check_Miss();
               
                 Add_POS_Data(shoot_x,shoot_y,1.25f,lx,ly,1.25f); //定义路径数组     
                //Add_Explode(lx,ly,lz);

   if (Explode_States_D==true)
   {
           osg::Vec3 pos=pat->getPosition();
           float x=pos.x();
           float y=pos.y();
           float z=pos.z();
          
          
           float        Dis1=sqrt((x-Position[12])*(x-Position[12]) + (y-Position[13])*(y-Position[13]) + (z-Position[14])*(z-Position[14]));
           if (Dis1<10)
           {
                  Add_Explode(Position[12],Position[13],0);
          Explode_States_D=false;
          pat->setNodeMask(0);
          
           }
          
               
   }

                 
                 viewer->frame();
      
        }


        return 0 ;
}


希望您能帮帮我啊,谢谢!

该用户从未签到

发表于 2011-4-13 13:26:28 | 显示全部楼层
能否把您的代码简化到100行以内?我不可能顺利地看完这么长的代码并且立即找出您的问题来

该用户从未签到

 楼主| 发表于 2011-4-16 07:09:15 | 显示全部楼层
//cbw  雨
          osg::ref_ptr<osgParticle:recipitationEffect> pe = new osgParticle:recipitationEffect();
          pe->rain(0.3);
      //设置雪花颜色
          pe->setParticleColor(osg::Vec4(1, 1, 1, 1));
          //设置风向
      pe->setWind(osg::Vec3(1, 0, 0));
      pe->setUseFarLineSegments(true);
        

   //设置背景色
   viewer->getCamera()->setClearColor( pe->getFog()->getColor());
   

   //使用雾效
    //node->getOrCreateStateSet()->setAttributeAndModes(pe->getFog());

        rootNode->addChild(SkyBox());
        rootNode->addChild(GrassTree());  
   // rootNode->addChild(rootNode.get());
    rootNode->addChild(pe.get());

这是一段雨雪效果的程序,如果在int main()这个框架下运行,能正常显示其功效,而如果放在int CMy3App::gfx_start()框架下,就不能显示它效果,不知道是什么问题。
希望您百忙之中抽空看看,静待您的回复,谢谢!

该用户从未签到

发表于 2011-4-18 08:39:28 | 显示全部楼层
我不知道CMy3App::gfx_start()是一个什么框架

该用户从未签到

 楼主| 发表于 2011-4-18 17:10:33 | 显示全部楼层
谢谢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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