OSG学习笔记(二)人机交互

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值