Пример #1
0
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 ;
}
Пример #2
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");
  }