|
创建一个窗体,通过拖拽器实现鼠标左键随意移动物体,但是在单击鼠标左键后,物体消失,并显示:osgManipulator::computerNodePathToRoot(,) taking first parents path, ignoring others.这是什么意思,如何更改程序,还请大神指点。
原程序如下:
#include <windows.h>
#include <osg/ShapeDrawable>
#include <osg/Geode>
#include <osgManipulator/CommandManager>
#include <osgManipulator/TabBoxDragger>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgViewer/CompositeViewer>
class MouseHandler:public osgGA::GUIEventHandler
{
public :
MouseHandler() : _activeDragger(0) {}
bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa,osg::Object* ,osg::NodeVisitor*)
{
osgViewer::View* view=dynamic_cast<osgViewer::View*>(&aa);
if(!view)
return false;
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter:USH:
{
_pointer.reset();
osgUtil:ineSegmentIntersector::Intersections intersections;
if ( view->computeIntersections(ea.getX(), ea.getY(), intersections) )
{
_pointer.setCamera( view->getCamera() );
_pointer.setMousePosition( ea.getX(), ea.getY() );
for ( osgUtil::LineSegmentIntersector::Intersections::iterator hitr=intersections.begin();hitr != intersections.end(); ++hitr)
{
_pointer.addIntersection( hitr->nodePath, hitr->getLocalIntersectPoint() );
}
for ( osg::NodePath::iterator itr=_pointer._hitList.front().first.begin();itr != _pointer._hitList.front().first.end(); ++itr )
{
osgManipulator:ragger* dragger = dynamic_cast<osgManipulator::Dragger*>( *itr );
if ( dragger )
{
dragger->handle( _pointer, ea, aa );
_activeDragger = dragger;
break;
}
}
}
break;
}
case osgGA::GUIEventAdapter::DRAG:
case osgGA::GUIEventAdapter::RELEASE:
{
if ( _activeDragger )
{
_pointer._hitIter = _pointer._hitList.begin();
_pointer.setCamera( view->getCamera() );
_pointer.setMousePosition( ea.getX(), ea.getY() );
_activeDragger->handle( _pointer, ea, aa );
}
if ( ea.getEventType()==osgGA::GUIEventAdapter::RELEASE )
{
_activeDragger = NULL;
_pointer.reset();
}
break;
}
default: break;
}
return true;
}
protected:
osgManipulator::Dragger* _activeDragger;
osgManipulator::PointerInfo _pointer;
};
int main(int argc,char** argv)
{
auto box1=new osg::ShapeDrawable(new osg::Box(osg::Vec3(1.0,0.0,0.0),0.5));
osg::ref_ptr<osg::Geode> Box1=new osg::Geode;
Box1->addDrawable(box1);
osg::ref_ptr<osgManipulator::Selection> selection1 = new osgManipulator::Selection;
selection1->addChild(Box1);
float scale1 =box1->getBound().radius() * 1.2;
osg::ref_ptr<osgManipulator::TabBoxDragger> dragger1 = new osgManipulator::TabBoxDragger;
dragger1->setupDefaultGeometry();
dragger1->setMatrix( osg::Matrix::scale(scale1, scale1, scale1)* osg::Matrix::translate(Box1->getBound().center()) );
osg::ref_ptr<osg::Group> root = new osg::Group;//创建根节点
root->addChild( dragger1.get() );
root->addChild( selection1.get() );
osg::ref_ptr<osgManipulator::CommandManager> manager1 = new osgManipulator::CommandManager;
manager1->connect( *dragger1, *selection1 );
osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;//设置图形上下文的特征
traits->x = 350;
traits->y = 200;
traits->width = 1000;
traits->height = 700;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->sharedContext = 0;
osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());//创建图形上下文
osg::ref_ptr<osg::Camera> camera = new osg::Camera;//创建相机
camera->setGraphicsContext(gc.get());
camera->setViewport(new osg::Viewport(0,0, traits->width, traits->height));
GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
camera->setDrawBuffer(buffer);
camera->setReadBuffer(buffer);
osgViewer::Viewer viewer;
viewer.addSlave(camera.get());
viewer.addEventHandler(new MouseHandler);//加入鼠标事件
viewer.setSceneData(root.get());
return viewer.run();
}
|
|