|
楼主 |
发表于 2011-8-31 12:39:41
|
显示全部楼层
回复 2# mijue
- class PickHandler : public osgGA::GUIEventHandler
- {
- public:
- PickHandler() : _mX( 0. ),_mY( 0. ) {}
- bool handle( const osgGA::GUIEventAdapter& ea,
- osgGA::GUIActionAdapter& aa )
- {
- osgViewer::Viewer* viewer =
- dynamic_cast<osgViewer::Viewer*>( &aa );
- if (!viewer)
- return false;
- switch( ea.getEventType() )
- {
- case osgGA::GUIEventAdapter::PUSH:
- case osgGA::GUIEventAdapter::MOVE:
- {
- // 记录鼠标按下和移动时的位置信息。
- _mX = ea.getX();
- _mY = ea.getY();
- return false;
- }
- case osgGA::GUIEventAdapter::RELEASE:
- {
- // 如果鼠标在按下按键时没有移动,那么执行用户选择的处理,
- // 否则将由默认的鼠标控制器类进行处理。
- if (_mX == ea.getX() && _mY == ea.getY())
- {
- if (pick( ea.getXnormalized(), ea.getYnormalized(), viewer ))
- return true;
- }
- return false;
- }
- default:
- return false;
- }
- }
- protected:
- // 保存鼠标按下和移动时的XY 坐标。
- float _mX,_mY;
- // 执行用户选择的操作。
- bool pick( const double x, const double y, osgViewer::Viewer* viewer )
- {
- if (!viewer->getSceneData()) // 没有可以选择的。
- return false;
- double w( .05 ), h( .05 );
- osgUtil::PolytopeIntersector* picker =
- new osgUtil::PolytopeIntersector(
- osgUtil::Intersector::PROJECTION, x-w, y-h, x+w, y+h );
- osgUtil::IntersectionVisitor iv( picker );
- viewer->getCamera()->accept( iv );
- if (picker->containsIntersections())
- {
- osg::NodePath& nodePath =
- picker->getFirstIntersection().nodePath;
- unsigned int idx = nodePath.size();
- while (idx--)
- {
- // 查找交集节点路径中的最后一个MatrixTransform;
- // 它就是将要与回调相关联的选择结果。
- osg::MatrixTransform* mt =
- dynamic_cast<osg::MatrixTransform*>(
- nodePath[ idx ] );
- if (mt == NULL)
- continue;
- // 到了这里,
- // 说明已在节点路径中找到了所需的MatrixTransform。
- if (_selectedNode.valid())
- // 清除原来的选择节点回调,以保证它停止运行。
- _selectedNode->setUpdateCallback( NULL );
- _selectedNode = mt;
- _selectedNode->setUpdateCallback( new RotateCB );
- break;
- }
- if (!_selectedNode.valid())
- osg::notify() << "Pick failed." << std::endl;
- }
- else if (_selectedNode.valid())
- {
- _selectedNode->setUpdateCallback( NULL );
- _selectedNode = NULL;
- }
- return _selectedNode.valid();
- }
- };
- int main( int argc, char **argv )
- {
- // 创建场景的视口。
- osgViewer::Viewer viewer;
- viewer.setSceneData( createScene().get() );
- // 添加用户选择处理器。
- viewer.addEventHandler( new PickHandler );
- return viewer.run();
- }
复制代码 |
|