Hi,
I set up multiple views in a sence.I need to use keyboarding to remove one of
them.
Please,how to achieve it in Visual Studio 2008 .
Thank you!
Cheers,
Andy
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=53498#53498
/**********************************************************
*Write by FlySky
*zz...@163.com http://www.OsgChina.org
**********************************************************/
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/CompositeViewer>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Geometry>
#include <osg/Camera>
#include <osg/MatrixTransform>
#include <osg/PositionAttitudeTransform>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgGA/TrackballManipulator>
#include <osgUtil/Optimizer>
#include <iostream>
//¶¯Ì¬É¾³ýÊÓͼ´°¿Ú
class DeletSlaveView:public osgGA::GUIEventHandler
{
public:
bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter&aa
)
{
osg::ref_ptr<osgViewer::View> view =
dynamic_cast<osgViewer::View*>(&aa);
osg::ref_ptr<osgViewer::CompositeViewer> viewer =
dynamic_cast<osgViewer::CompositeViewer*>(view->getViewerBase());
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
if (ea.getKey()=='q')
{
//viewer->stopThreading();
viewer->removeView(view);
//viewer->startThreading();
}
}
break;
default:
break;
}
return false;
}
};
int main()
{
//´´½¨CompositeViewer¶ÔÏó
osg::ref_ptr<osgViewer::CompositeViewer> viewer = new
osgViewer::CompositeViewer() ;
//¶ÁÈ¡Å£µÄÄ£ÐÍ
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osg") ;
//¶ÁÈ¡·É»úÄ£ÐÍ
osg::ref_ptr<osg::Node> cessna = osgDB::readNodeFile("cessna.osg");
//ÓÅ»¯³¡¾°Êý¾Ý
osgUtil::Optimizer optimizer ;
optimizer.optimize(cow.get());
optimizer.optimize(cessna.get());
//ÉèÖÃͼÐλ·¾³ÌØÐÔ
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new
osg::GraphicsContext::Traits();
traits->x = 100;
traits->y = 100;
traits->width = 900;
traits->height = 700;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
//´´½¨Í¼Ðλ·¾³ÌØÐÔ
osg::ref_ptr<osg::GraphicsContext> gc =
osg::GraphicsContext::createGraphicsContext(traits.get());
if (gc->valid())
{
osg::notify(osg::INFO)<<" GraphicsWindow has been created
successfully."<<std::endl;
//Çå³ý´°¿ÚÑÕÉ«¼°Çå³ýÑÕÉ«ºÍÉî¶È»º³å
gc->setClearColor(osg::Vec4f(0.2f,0.2f,0.6f,1.0f));
gc->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
else
{
osg::notify(osg::NOTICE)<<" GraphicsWindow has not been
created successfully."<<std::endl;
}
//ÊÓͼһ
{
//´´½¨ÊÓͼһ
osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
viewer->addView(view.get());
//ÉèÖÃÊÓͼ³¡¾°Êý¾Ý
view->setSceneData(cow.get());
//ÉèÖÃÏà»úÊÓ¿Ú¼°Í¼Ðλ·¾³
view->getCamera()->setViewport(new osg::Viewport(0,0,
traits->width/2, traits->height/2));
view->getCamera()->setGraphicsContext(gc.get());
//ÉèÖòÙ×÷Æ÷
view->setCameraManipulator(new osgGA::TrackballManipulator);
//Ìí¼Óʼþ´¦Àí
view->addEventHandler( new osgViewer::StatsHandler );
view->addEventHandler( new osgViewer::WindowSizeHandler );
view->addEventHandler( new osgViewer::ThreadingHandler );
view->addEventHandler( new osgViewer::RecordCameraPathHandler );
}
//ÊÓͼ¶þ
{
osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
viewer->addView(view.get());
view->setSceneData(cessna.get());
view->getCamera()->setViewport(new
osg::Viewport(traits->width/2,0, traits->width/2, traits->height/2));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
}
//ÊÓͼÈý
{
osg::ref_ptr<osgViewer::View> view = new osgViewer::View;
viewer->addView(view.get());
view->setSceneData(cessna.get());
//¸ù¾Ý·Ö±æÂÊÀ´È·¶¨ºÏÊʵÄͶӰÀ´±£Ö¤ÏÔʾµÄͼÐβ»±äÐÎ
double fovy, aspectRatio, zNear, zFar;
view->getCamera()->getProjectionMatrixAsPerspective(fovy,
aspectRatio, zNear, zFar);
double newAspectRatio = double(traits->width) /
double(traits->height/2);
double aspectRatioChange = newAspectRatio / aspectRatio;
if (aspectRatioChange != 1.0)
{
view->getCamera()->getProjectionMatrix() *=
osg::Matrix::scale(1.0/aspectRatioChange,1.0,1.0);
}
view->getCamera()->setViewport(new
osg::Viewport(0,traits->height/2, traits->width, traits->height/2));
view->getCamera()->setGraphicsContext(gc.get());
view->setCameraManipulator(new osgGA::TrackballManipulator);
view->addEventHandler(new DeletSlaveView);
}
viewer->realize() ;
viewer->run() ;
return 0 ;
}
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org