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