查看: 2119|回复: 14

关于鼠标单击事件的问题

[复制链接]

该用户从未签到

发表于 2009-8-21 19:58:15 | 显示全部楼层 |阅读模式
今天看了FreeSouth写的教程《OpenSceneGraph程序设计》。就是单击事件获取模块时,会连接多个模块,如何之获取最近的一个模块。在代码中
for(osgUtil:ineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
hitr != intersections.end();
++hitr)
{
if (!hitr->nodePath.empty() && !(hitr->nodePath.back()->getName().empty()))
{
osg::NodePath& np = hitr ->nodePath ;
for (int i=np.size()-1; i>=0; --i)
{
osgFX::Scribe* sc= dynamic_cast<osgFX::Scribe *>(np[i]);
if (sc!= NULL)
{
if(sc ->getNodeMask() != 0)
sc ->setNodeMask(0) ;
}
}
}
}

这段代码是书中的源代码,我想知道上面出现的intersections,hitr ->nodePath 都具体是什么含义?

对上面的代码做如何更改才能只获取当前的一个模块。

该用户从未签到

发表于 2009-8-21 21:00:01 | 显示全部楼层
若是root->accept(iv).
nodepath表示的是从root根节点到当前节点的一条节点路径.

该用户从未签到

 楼主| 发表于 2009-8-22 11:01:48 | 显示全部楼层
恩,那如何获取一个鼠标点击的Node节点呢?

该用户从未签到

发表于 2009-8-22 11:17:57 | 显示全部楼层
IntersectionVisitor就是作这个用的,您的代码就是应用了这个访问器的结果

该用户从未签到

 楼主| 发表于 2009-8-22 11:37:12 | 显示全部楼层


可能我问的不是太明白,
是这样。
intersections对象是通过
osgViewer::Viewer.computeIntersections(x, y, osgUtil:ineSegmentIntersector::Intersections)
这个函数获取的。
具体语句是:
mViewer->computeIntersections(x, y, intersections)
它应该就是包含在鼠标点击时产生的射线所涉及到的节点的集合(我猜)。

然后我现在的问题就是,如何从intersection中获得这些节点中的Node节点。

intersection这个对象应该怎么用啊?

该用户从未签到

 楼主| 发表于 2009-8-22 11:38:44 | 显示全部楼层
自动表情错了

那个类应该是
osgUtil:: LineSegmentIntersector::Intersections

该用户从未签到

发表于 2009-8-22 12:26:16 | 显示全部楼层
您可以看一下computeIntersections函数的源代码实现,它事实上和osgpick例子的实现没有太多不同。您大可自己写一段更灵活的实现代码。
Intersections的定义如下:
  1. typedef std::multiset<Intersection> osgUtil::LineSegmentIntersector::Intersections
复制代码
而Intersection结构体则包含了一切您所需的内容,具体可以参看API文档

该用户从未签到

 楼主| 发表于 2009-8-22 14:54:57 | 显示全部楼层
我下载的API文档居然没有NodePath。
崩溃...

我这个是osg开发包里面自带的,可能有一些丢失。

不知道哪里可以下到比较完整的API文档?

该用户从未签到

发表于 2009-8-22 15:45:23 | 显示全部楼层
不会有丢失,只能是您查找的不仔细,或者在看错误的资料。我也不知道什么是“osg开发包”

该用户从未签到

发表于 2009-8-22 15:51:54 | 显示全部楼层
8# working123

在 osg/Node 里定义的NodePaht
  1. typedef std::vector<Node*> NodePath;
复制代码
你可以将它看成是个堆栈

关键在于你想要从鼠标事件中获得什么样的顶点,最末尾的一个节点应当是个Geode.

你可以尝试使用
  1. for(int i = np.size()-1;i>=0;i--) //从最末尾开始找
  2. {
  3.       //在这中间使用某些方法找你要的节点
  4. }
复制代码
对于每个Intersection(交集) (每个交集是应当是某个三角形与当前这条线段的交点等信息的集合)
你可以详看源代码将它弄清楚。也可参考 教程区的《多面体求交器的代码解读》 我想都是差不多的。

该用户从未签到

发表于 2009-8-22 19:14:48 | 显示全部楼层
稍稍纠正一下,std::vector不是堆栈,是向量组,呵呵,这种地方还是严谨一点好~~

该用户从未签到

发表于 2009-8-22 21:58:06 | 显示全部楼层
11# array
  想要说明的意思一样的嘛>_< 理解成一个堆栈>_<不是一样的么..
我也知道它是个向量组>_<

该用户从未签到

发表于 2009-8-23 22:29:03 | 显示全部楼层
不一样的!堆栈,通常是后进先出(LIFO);向量组则无此特性

该用户从未签到

 楼主| 发表于 2009-8-24 17:18:46 | 显示全部楼层
是啊

我现在的问题就是怎么判断这个节点就是叶子节点啊?

该用户从未签到

发表于 2009-8-24 20:18:53 | 显示全部楼层
dynamic_cast
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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