OSG拾取模型

 通过键盘事件来控制拖拽器的隐藏和显示,来拾取三维模型

#ifdef _WIN32
#include <windows.h>
#endif

#include <osgViewer/Viewer>
#include <osgViewer/GraphicsWindow>
#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Camera>
#include <osg/Image>
#include <osg/BufferObject>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgUtil/Optimizer>
#include <osgGA/GUIEventHandler>
#include <osgGA/TrackballManipulator>
#include <osg/Geometry>
#include <osg/AutoTransform>
#include <osg/ProxyNode>
#include <osgText/Text>
#include <osgUtil/Optimizer>
#include <osgManipulator/Dragger>
#include <osgManipulator/Selection>
#include <osgManipulator/Constraint>
#include <osgManipulator/TranslateAxisDragger>
#include <osgManipulator/CommandManager>
#include<osgFX/Scribe>

#include <iostream>
#include <thread>
#include <future>
#include <string>

#include<osgManipulator/TabBoxDragger>
#include<osgManipulator/Selection>
#include<osg/MatrixTransform>
#include<osgGA/GUIEventAdapter>
#include<osgManipulator/TrackballDragger>


//键盘事件
class UseEventHandler :public::osgGA::GUIEventHandler
{
public:
	UseEventHandler(osgManipulator::TabBoxDragger* tad)
	{
		this->_tad = tad;
	}

	virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa)
	{
		//将aa强制转换为viewer对象
		osgViewer::Viewer *viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
		if (!viewer)//如果转换失败则直接退出
		{
			return false;
		}
		switch (ea.getEventType())//获取事件的类型,是键盘上的事件,还是鼠标上的事件
		{
		case osgGA::GUIEventAdapter::KEYDOWN://键盘响应事件
			if (ea.getKey() == 0xFF51)	//键盘左键
			{
				_tad->setNodeMask(0X1);
			}
			if (ea.getKey() == 0xFF53)	//键盘右键
			{
				_tad->setNodeMask(0X0);
			}
			break;
		default:
			break;
		}
		return false;
	}

private:
	osgManipulator::TabBoxDragger* _tad;
};



int main()
{
	float scale = 1.0;
	osgViewer::Viewer viewer;
	osg::ref_ptr<osg::Node> loadedModel = osgDB::readNodeFile("glider.osg");
	osg::ref_ptr<osgManipulator::Selection> selection = new osgManipulator::Selection;
	selection->addChild(loadedModel);

	//盒式拖拽器
	osgManipulator::TabBoxDragger* tad = new osgManipulator::TabBoxDragger();
	tad->setupDefaultGeometry();//使用默认的图形,即一个立方体
	tad->setMatrix(osg::Matrix::scale(scale, scale, scale)*osg::Matrix::translate(loadedModel->getBound().center()));
	tad->addTransformUpdating(selection);//Dragger要改变的对象。
	tad->setHandleEvents(true);

	osg::ref_ptr<osg::Group> root = new osg::Group;
	root->addChild(selection);
	root->addChild(tad);
	tad->setNodeMask(0X0);
	/*root->addChild(rote);*/

	viewer.setSceneData(root.get());
	viewer.addEventHandler(new UseEventHandler(tad));
	return viewer.run();
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值