int main() { osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer(); unsigned tex_width = 1024; unsigned tex_height = 512; osg::Camera::RenderTargetImplementation renderImplementation = osg::Camera::FRAME_BUFFER_OBJECT; bool useImage = true; //读取模型 osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("../OSGData/cessna.osg"); //创建一个transform节点,用来选装该子场景 osg::ref_ptr<osg::MatrixTransform> loadedModelTransform = new osg::MatrixTransform; loadedModelTransform->addChild(loadedModel.get()); //设置更新回调 osg::ref_ptr<osg::NodeCallback> nc = new osg::AnimationPathCallback(loadedModelTransform->getBound().center(),osg::Vec3(0.0f,0.0f,1.0f),osg::inDegrees(45.0f)); loadedModelTransform->setUpdateCallback(nc); osg::ref_ptr<osg::Group> rootNode = new osg::Group(); rootNode->addChild(createPreRenderSubGraph(loadedModelTransform.get(),tex_width,tex_height, renderImplementation, useImage)); //优化场景数据 osgUtil::Optimizer optimizer ; optimizer.optimize(rootNode.get()); viewer->setSceneData(rootNode.get()); viewer->realize(); viewer->run(); return 0 ; }
// constructor MyFsoiObj(const char* filename, double scale, const char *skybox_basename, double im_xang, double im_yang, double nearclip, double farclip, unsigned tex_width=64, unsigned tex_height=64, //osg::Camera::RenderTargetImplementation renderImplementation = osg::Camera::FRAME_BUFFER_OBJECT, osg::Camera::RenderTargetImplementation renderImplementation = osg::Camera::FRAME_BUFFER, bool useTextureRectangle = false, bool useHDR = false ) { DPRINTF("constructor called\n"); bool useImage = true; osg::Node* loadedModel = NULL; osg::MatrixTransform* loadedModelTransform = new osg::MatrixTransform; std::vector<std::string> filenames = std::vector<std::string>(); if (filename==NULL) { fprintf(stderr,"no filename specified in MyFsoiObj constructor (%s,%d)\n",__FILE__,__LINE__); loadedModel = new osg::Node(); } else { filenames.push_back( std::string(filename) ); loadedModel = osgDB::readNodeFiles(filenames); if (!loadedModel) { DPRINTF("Aborting: could not load files\n"); exit(2); } loadedModelTransform->addChild(loadedModel); } #define SEIZE_CAMERA #ifdef SEIZE_CAMERA DPRINTF("setting scale to %f.\n",scale); loadedModelTransform->setMatrix( osg::Matrix::scale(scale,scale,scale) ); #else // spin the model. osg::NodeCallback* nc = new osg::AnimationPathCallback(loadedModelTransform->getBound().center(),osg::Vec3(0.0f,0.0f,1.0f),osg::inDegrees(45.0f)); loadedModelTransform->setUpdateCallback(nc); #endif prerender_image = new osg::Image; DPRINTF("allocating image...\n"); prerender_image->allocateImage(tex_width, tex_height, 1, GL_RGBA, GL_UNSIGNED_BYTE); //prerender_image->allocateImage(tex_width, tex_height, 1, GL_RGB, GL_UNSIGNED_BYTE); DPRINTF("allocated (%dx%d) OK.\n",tex_width,tex_height); //image->allocateImage(tex_width, tex_height, 1, GL_RGBA, GL_FLOAT); prerender_camera = new osg::Camera; model_and_sky = new osg::Group(); #ifdef USE_SKYBOX if (skybox_basename) { osg::ref_ptr<osg::ClearNode> skybox_node = new osg::ClearNode(); std::string basedir = std::string(skybox_basename); // weird step to prevent strlen symbol lookup problem on Ubuntu Feisty std::string px = std::string(basedir+"posx.png"); std::string nx = std::string(basedir+"negx.png"); std::string ny = std::string(basedir+"negy.png"); std::string py = std::string(basedir+"posy.png"); std::string pz = std::string(basedir+"posz.png"); std::string nz = std::string(basedir+"negz.png"); add_skybox_to_node( skybox_node, px, nx, ny,py, pz,nz); model_and_sky->addChild( skybox_node.get() ); } #else if (skybox_basename) { fprintf(stderr,"error: requested skybox, but support not compiled in %s:%d\n",__FILE__,__LINE__); } #endif model_and_sky->addChild( loadedModelTransform ); rootNode = new osg::Group(); rootNode->addChild(createPreRenderSubGraph(model_and_sky,tex_width,tex_height, renderImplementation, useImage, useTextureRectangle, useHDR, prerender_image.get(), prerender_camera.get())); #ifdef SEIZE_CAMERA // set camera properties (re-setting what was done in createPreRenderSubGraph) prerender_camera->setProjectionMatrixAsPerspective( im_yang, (im_xang/im_yang), nearclip, farclip); #endif // add model to the viewer. viewer.setSceneData( rootNode.get() ); #if 1 // render to window (not fullscreen) osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits; traits->x = 0; traits->y = 0; traits->width = 640; traits->height = 480; traits->red = 8; traits->green = 8; traits->blue = 8; traits->alpha = 8; traits->depth = 32; traits->windowDecoration = true; traits->doubleBuffer = true; //traits->doubleBuffer = false; osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get()); osg::ref_ptr<osg::Camera> camera = viewer.getCamera(); camera->setGraphicsContext(gc.get()); camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height)); GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT; camera->setDrawBuffer(buffer); camera->setReadBuffer(buffer); // set background color camera->setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); #endif viewer.setKeyEventSetsDone(0); // disable keypress from quitting viewer.setQuitEventSetsDone(false); // disable quit event from quitting (XXX seems broken as of 2007-06-27) if (!viewer.getCameraManipulator() && viewer.getCamera()->getAllowEventFocus()) { viewer.setCameraManipulator(new osgGA::TrackballManipulator()); // viewer.setCameraManipulator(new osgGA::MatrixManipulator()); } if (!viewer.isRealized()) { viewer.realize(); } addEyeMap(0); addEyeMap(1); DPRINTF("constructor finished\n"); }