查看: 2513|回复: 2

求教:关于pick

[复制链接]

该用户从未签到

发表于 2008-9-16 19:40:51 | 显示全部楼层 |阅读模式
在场景中拾取点的问题,我想经过单击鼠标把场景中的一个点选中。
看了pick的例子,没有看懂。
代码:
osgUtil:ineSegmentIntersector::Intersections intersections;
viewer->computeIntersections(ea.getX(),ea.getY(),intersections);
申请了一个相交测试的结果集,判断屏幕与场景相交后将得到的结果集存入
但是结果集是什么内容呢?
我怎麽把相交得到的点拾取出来呢?编号或者坐标。

sgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
又是什么意思呢?是说第一个被拾取到的节点吗?

hitr->nodePath.back()->getName();
hitr->drawable.valid();
又是什么意思呢?
请使用pick的高手解释一下,不胜感激!

该用户从未签到

发表于 2008-9-16 21:28:14 | 显示全部楼层
osgUtil: LineSegmentIntersector::Intersections intersection是什么内容,这个查一下API文档或者直接读源代码都可以知道:
它是一个交集数据的集合,即std::multiset< LineSegmentIntersector::Intersection >

自然,根据STL的迭代器基本函数可知,intersections.begin()指的就是这个交集集合中的第一个数据,这里事实上也就是第一个与观察者视线相交的物体。

LineSegmentIntersector::Intersection结构体中保存了大量有用的交集信息,除了相交点getWorldIntersectPoint()或getLocalIntersectPoint(),我们还可以取得交点的法线getWorldIntersectNormal()或getLocalIntersectNormal(),与射线产生交集的几何体对象drawable,以及从这个对象到根节点的路径nodePath,等等。它们都是公有的,因此可以随意获取和使用

nodePath.back()->getName()取得节点路径中最末一个节点(事实上也就是存储了Drawable对象的那个叶节点)的名字,这个名字是通过setName函数命名的(或者在.osg文件中通过"name xxx"行定义)
drawable.valid()用于判断这个几何体对象是否是合法的(比如,您在取得交集之后立刻把这个几何体removeChild了,那么它可能就不可用了)

经常查阅API文档和源代码是最好的老师~~

该用户从未签到

 楼主| 发表于 2008-9-19 19:22:29 | 显示全部楼层
感谢版主的指点
学习中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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