OSG下鼠标点击实现对模型的移动,旋转(拖拽器)

osg下如何用拖拽器实现鼠标对模型的控制?
首先介绍一下拖拽器:
(1):TabPlaneDragger平面拖拽器:其边、顶点上都有拖拽点,可以进行某个2D平面上的缩放;
(2):TabPlaneTrackballDragger平面轨迹球拖拽器:除了平面拖拽器的功能外,还多了个轨迹球拖拽功能;
(3):TrackballDragger轨迹球拖拽器:即旋转操纵器,没有缩放功能
(4):Translate1DDragger一维平移拖拽器:沿一个直线进行拖拽;
(5):Translate2DDragger二维平移拖拽器:在某个平面上对模型进行拖拽;
(6):TranslateAxisDragger三维平移拖拽器:可在三个方向上对模型进行拖拽;
(7):TabBoxDragger盒式拖拽器:由六个平面拖拽器构成,可在各个面上进行缩放、平移;
(8):还有其他的拖拽器:
Scale2DDragger:二维缩放拖拽器;
Scale1DDragger一维缩放拖拽器;
RotateSphereDragger:旋转球拖拽器;
RotateCylinderDragger旋转圆柱拖拽器;
对拖拽器操作需要加入头文件osgManipulator下的内容
如:

#include<osgManipulator/TabBoxDragger>
#include<osgManipulator/Selection>
#include<osgManipulator/TrackballDragger>
#include<osgManipulator/CommandManager>

具体实现程序如下:

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

#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgManipulatord.lib")


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

	//旋转拖拽器
	osgManipulator::TrackballDragger* dragger = new osgManipulator::TrackballDragger();
	dragger->setupDefaultGeometry();
	dragger->setMatrix(osg::Matrix::scale(scale*0.5, scale*0.5, scale*0.5)*osg::Matrix::translate(loadedModel->getBound().center()));
	dragger->addTransformUpdating(selection);
	dragger->setHandleEvents(true);

	//三维平移拖拽器
	osgManipulator::TranslateAxisDragger * Move3d = new osgManipulator::TranslateAxisDragger();
	Move3d->setupDefaultGeometry();
	Move3d->setMatrix(osg::Matrix::scale(scale, scale, scale)*osg::Matrix::translate(loadedModel->getBound().center()));
	Move3d->addTransformUpdating(selection);
	Move3d->setHandleEvents(true);

	osgManipulator::RotateCylinderDragger *rote = new osgManipulator::RotateCylinderDragger();
	rote->setupDefaultGeometry();
	rote->setMatrix(osg::Matrix::scale(scale, scale, scale)*osg::Matrix::translate(loadedModel->getBound().center()));
	rote->addTransformUpdating(selection);
	rote->setHandleEvents(true);

	osg::ref_ptr<osg::Group> root = new osg::Group;
	root->addChild(selection);
	root->addChild(dragger);
	root->addChild(tad);
	root->addChild(Move3d);
	/*root->addChild(rote);*/

	viewer.setSceneData(root.get());
	return viewer.run();

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值