查看: 1425|回复: 6

求教《OSG快速入门指导》中的一个问题

[复制链接]

该用户从未签到

发表于 2011-8-31 09:30:27 | 显示全部楼层 |阅读模式
本帖最后由 Hadse 于 2011-8-31 09:48 编辑

在3.2.4用户选择->捕获鼠标事件中使用到了一个变量“_selectedNode”,这个变量之前没有定义,是公共属性吗?初学见谅。
  1. if (_selectedNode.valid())
  2. // 清除原来的选择节点回调,以保证它停止运行。
  3. _selectedNode->setUpdateCallback( NULL );
  4. _selectedNode = mt;
  5. _selectedNode->setUpdateCallback( new RotateCB );
  6. break;
  7. }
复制代码

该用户从未签到

发表于 2011-8-31 11:02:15 | 显示全部楼层
只看到目前的这些代码,无法做出正确的回答。

该用户从未签到

 楼主| 发表于 2011-8-31 12:39:41 | 显示全部楼层
回复 2# mijue


  
  1. class PickHandler : public osgGA::GUIEventHandler
  2. {
  3. public:
  4. PickHandler() : _mX( 0. ),_mY( 0. ) {}
  5. bool handle( const osgGA::GUIEventAdapter& ea,
  6. osgGA::GUIActionAdapter& aa )
  7. {
  8. osgViewer::Viewer* viewer =
  9. dynamic_cast<osgViewer::Viewer*>( &aa );
  10. if (!viewer)
  11. return false;
  12. switch( ea.getEventType() )
  13. {
  14. case osgGA::GUIEventAdapter::PUSH:
  15. case osgGA::GUIEventAdapter::MOVE:
  16. {
  17. // 记录鼠标按下和移动时的位置信息。
  18. _mX = ea.getX();
  19. _mY = ea.getY();
  20. return false;
  21. }
  22. case osgGA::GUIEventAdapter::RELEASE:
  23. {
  24. // 如果鼠标在按下按键时没有移动,那么执行用户选择的处理,
  25. // 否则将由默认的鼠标控制器类进行处理。
  26. if (_mX == ea.getX() && _mY == ea.getY())
  27. {
  28. if (pick( ea.getXnormalized(), ea.getYnormalized(), viewer ))
  29. return true;
  30. }
  31. return false;
  32. }
  33. default:
  34. return false;
  35. }
  36. }
  37. protected:
  38. // 保存鼠标按下和移动时的XY 坐标。
  39. float _mX,_mY;
  40. // 执行用户选择的操作。
  41. bool pick( const double x, const double y, osgViewer::Viewer* viewer )
  42. {
  43. if (!viewer->getSceneData()) // 没有可以选择的。
  44. return false;
  45. double w( .05 ), h( .05 );
  46. osgUtil::PolytopeIntersector* picker =
  47. new osgUtil::PolytopeIntersector(
  48. osgUtil::Intersector::PROJECTION, x-w, y-h, x+w, y+h );
  49. osgUtil::IntersectionVisitor iv( picker );
  50. viewer->getCamera()->accept( iv );
  51. if (picker->containsIntersections())
  52. {
  53. osg::NodePath& nodePath =
  54. picker->getFirstIntersection().nodePath;
  55. unsigned int idx = nodePath.size();
  56. while (idx--)
  57. {
  58. // 查找交集节点路径中的最后一个MatrixTransform;
  59. // 它就是将要与回调相关联的选择结果。
  60. osg::MatrixTransform* mt =
  61. dynamic_cast<osg::MatrixTransform*>(
  62. nodePath[ idx ] );
  63. if (mt == NULL)
  64. continue;
  65. // 到了这里,
  66. // 说明已在节点路径中找到了所需的MatrixTransform。
  67. if (_selectedNode.valid())
  68. // 清除原来的选择节点回调,以保证它停止运行。
  69. _selectedNode->setUpdateCallback( NULL );
  70. _selectedNode = mt;
  71. _selectedNode->setUpdateCallback( new RotateCB );
  72. break;
  73. }
  74. if (!_selectedNode.valid())
  75. osg::notify() << "Pick failed." << std::endl;
  76. }
  77. else if (_selectedNode.valid())
  78. {
  79. _selectedNode->setUpdateCallback( NULL );
  80. _selectedNode = NULL;
  81. }
  82. return _selectedNode.valid();
  83. }
  84. };
  85. int main( int argc, char **argv )
  86. {
  87. // 创建场景的视口。
  88. osgViewer::Viewer viewer;
  89. viewer.setSceneData( createScene().get() );
  90. // 添加用户选择处理器。
  91. viewer.addEventHandler( new PickHandler );
  92. return viewer.run();
  93. }
复制代码

该用户从未签到

 楼主| 发表于 2011-8-31 12:40:54 | 显示全部楼层
回复 2# mijue


   第67行处出现的"_selectedNode".

该用户从未签到

发表于 2011-8-31 19:59:30 | 显示全部楼层
可以肯定_selectedNode不是内置的,这个是在程序中自己定义的,建议楼主好好看看程序,最起码每一步是干什么用的,应该要知道,程序应该是中间少了几步。

该用户从未签到

发表于 2011-9-1 15:23:58 | 显示全部楼层
这个明显是定义的类成员变量,咋可能没定义~~

该用户从未签到

 楼主| 发表于 2011-9-1 16:09:01 | 显示全部楼层
回复 6# tianxiao888


   在程序就是不承认啊~是哪个类的成员变量?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表