osg 瞄准镜 车窗镜 透视镜片 做法

来源:互联网 发布:java面试问题及答案 编辑:程序博客网 时间:2024/05/15 23:39
/*HUD 和 RTT 的结合*/#include <osg/Group>#include <osg/Camera>#include <osgDB/ReadFile>#include <osg/Geometry>#include <osg/Image>#include <osg/ShapeDrawable>#include <osg/Texture2D>#include <osgViewer/Viewer>#include <osgViewer/ViewerEventHandlers>#include <iostream>using namespace std;osg::Node *createCircle(osg::Texture2D*t2d){  osg::ref_ptr<osg::Geode>geode=new osg::Geode;  osg::StateSet *ss=geode->getOrCreateStateSet();/*  osg::ref_ptr<osg::Image>image=osgDB::readImageFile("Images/clockface.JPG");  if(!image.valid()){    cout<<"image is NULL"<<endl;    return geode.release();  }  osg::Texture2D *t2d=new osg::Texture2D;  t2d->setImage(0, image);*/  ss->setTextureAttributeAndModes(0,t2d, osg::StateAttribute::ON);  ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);  osg::TessellationHints *hints=new osg::TessellationHints;  hints->setDetailRatio(1.5f);  geode->addDrawable(new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(400,300,0),150,0.1),hints));  return geode.release();}//创建固定圆盘osg::Camera*createHUD(osg::Texture2D*t2d){  osg::ref_ptr<osg::Camera>camera=new osg::Camera;  camera->setViewMatrix(osg::Matrix::identity());  camera->setAllowEventFocus(false);  camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);  camera->setViewport(0, 0, 800, 600);  camera->setProjectionMatrixAsOrtho2D(0, 800, 0, 600);  camera->setClearMask(GL_DEPTH_BUFFER_BIT);  camera->setRenderOrder(osg::Camera::POST_RENDER);  camera->addChild(createCircle(t2d));//设置HUD的内容  return camera.release();}//烘培纹理void createRtt(osgViewer::Viewer*viewer){  osg::ref_ptr<osg::Group>gp = new osg::Group;  osg::ref_ptr<osg::Node>ceep=osgDB::readNodeFile("ceep.ive");  gp->addChild(ceep);  if(!viewer){    return ;  }  osg::GraphicsContext::WindowingSystemInterface* wsi=osg::GraphicsContext::getWindowingSystemInterface();  if(!wsi){    return;  }  unsigned int width,height;  wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height);  osg::ref_ptr<osg::GraphicsContext::Traits>traits=new osg::GraphicsContext::Traits;  traits->x=0;  traits->y=0;  traits->width=width;  traits->height=height;  traits->windowDecoration=false;  traits->doubleBuffer=true;  traits->sharedContext=0;  osg::ref_ptr<osg::GraphicsContext>gc=osg::GraphicsContext::createGraphicsContext(traits);  if(!gc.valid()){    return;  }//创建主相机  osg::ref_ptr<osg::Camera>master=new osg::Camera;  master->setGraphicsContext(gc);  master->setViewport(0, 0, width,height);  viewer->addSlave(master);//创建RTT相机  osg::ref_ptr<osg::Camera>rttCamera=new osg::Camera;  rttCamera->setRenderOrder(osg::Camera::PRE_RENDER);  rttCamera->setGraphicsContext(gc);  rttCamera->setViewport(0,0,width,height);  rttCamera->addChild(ceep);//做其他效果,基本上都是对addSlave 的参数作手脚  viewer->addSlave(rttCamera,osg::Matrix::scale(8,8,8),osg::Matrix::identity(),false);  osg::Texture2D*t2d=new osg::Texture2D;  t2d->setInternalFormat(GL_RGBA);  rttCamera->attach(osg::Camera::COLOR_BUFFER, t2d);  gp->addChild(createHUD(t2d));  viewer->setSceneData(gp);  return;}int main(int argc, char *argv[]){  osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;  createRtt(viewer);  viewer->addEventHandler(new osgViewer::ScreenCaptureHandler);  return viewer->run();}


原创粉丝点击