|
楼主 |
发表于 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 ;
}
希望您能帮帮我啊,谢谢! |
|