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();}