1.键盘事件响应
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/api/Win32/GraphicsWindowWin32>
#include <osgDB/ReadFile>
#include <osgDB/ReaderWriter>
#include <osg/Switch>
#include <osg/MatrixTransform>
#include <iostream>
class RotateGlider :public osgGA::GUIEventHandler
{
private:
bool left_down;
public:
RotateGlider():left_down(false){}
bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
osgViewer::Viewer* vw = dynamic_cast<osgViewer::Viewer*>(&aa);
if (vw)
{
osg::MatrixTransform* mt = dynamic_cast<osg::MatrixTransform*>(vw->getSceneData());
if (mt)
{
static double i = 0;
switch (ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
{
if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Left)
{
left_down = true;
}
//else if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Right)
//{
// mt->setMatrix(osg::Matrix::rotate(i, osg::Vec3(0, 0, 1)));
// i -=0.5;
//}
else{}
}break;
case osgGA::GUIEventAdapter::KEYUP:
{
if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Left)
left_down = false;
}break;
case osgGA::GUIEventAdapter::FRAME:
{
if (left_down)
{
mt->setMatrix(osg::Matrix::rotate(i, osg::Vec3(0, 0, 1)));
i -=0.1;
}
}break;
default:
break;
}
}
}
return false;
}
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
osg::ref_ptr<osg::Node> osgcool = osgDB::readNodeFile("D://3rdparty//OSG3.6.3//OpenSceneGraph-Data//glider.osg");//osgDB::readNodeFile("D://3rdparty//OSG3.6.3//OpenSceneGraph-Data//osgcool.osgt");
mt->addChild(osgcool);
viewer->setSceneData(mt);
viewer->addEventHandler(new RotateGlider);
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->run();
return 0;
}
2.pick点选物体
使选中边框隐藏
#include <osgViewer/Viewer>
#include <osgViewer/ViewerEventHandlers>
#include <osgViewer/api/Win32/GraphicsWindowWin32>
#include <osgDB/ReadFile>
#include <osgDB/ReaderWriter>
#include <osgFX/Scribe>
#include <osg/Switch>
#include <osg/MatrixTransform>
#include <iostream>
class CPlickHandler :public osgGA::GUIEventHandler
{
public:
CPlickHandler(osgViewer::Viewer* viewer):mViewer(viewer){}
virtual bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa)
{
switch(ea.getEventType())
{
case(osgGA::GUIEventAdapter::PUSH):
if (ea.getButton() == 1)
{
Pick(ea.getX(), ea.getY());
}
return true;
}
return false;
}
protected:
osgViewer::Viewer* mViewer;
void Pick(float x, float y)
{
osgUtil::LineSegmentIntersector::Intersections intersections;
if (mViewer->computeIntersections(x, y, intersections))
{
for (osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();hitr != intersections.end(); ++hitr)
{
if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))
{
const osg::NodePath& np = hitr->nodePath;
for (int i = np.size() - 1; i >= 0; --i)
{
osgFX::Scribe* sc = dynamic_cast<osgFX::Scribe*>(np[i]);
if (sc != NULL)
{
if (sc->getNodeMask() != 0)
sc->setNodeMask(0);
}
}
}
}
}
}
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
osg::ref_ptr<osg::Group> root = new osg::Group();
root->addChild(osgDB::readNodeFile("D://3rdparty//OSG3.6.3//OpenSceneGraph-Data//cessna.osg"));
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("D://3rdparty//OSG3.6.3//OpenSceneGraph-Data//cow.osg");
osg::ref_ptr<osgFX::Scribe> sc = new osgFX::Scribe();
sc->addChild(cow.get());
root->addChild(cow.get());
root->addChild(sc.get());
viewer->setSceneData(root.get());
viewer->addEventHandler(new CPlickHandler(viewer));
viewer->realize();
viewer->addEventHandler(new osgViewer::WindowSizeHandler);
viewer->run();
return 0;
}