查看: 2825|回复: 11

osg鼠标选中线段

[复制链接]

该用户从未签到

发表于 2012-3-23 10:53:56 | 显示全部楼层 |阅读模式
大家好,新人请教,我有一个geode是由许多geometry组成,每个geometry中都由许多线段图元组成。现在我想在osg三维环境下,鼠标选中某个线段,怎么实现呢?array曾经在一个帖子中说过,点和线的选择可以用PolytopeIntersector,又是怎么实现的呢?还有一种方法是转换为屏幕坐标来进行2D判断,但是把场景中有的线段都转化为屏幕2d坐标,再判断鼠标点在哪条线段上,这样做是不是非常耗时?请大家帮忙解答一下,感谢了!!!

该用户从未签到

发表于 2012-3-23 12:19:43 | 显示全部楼层
可用多面体求交器

该用户从未签到

 楼主| 发表于 2012-3-23 13:51:26 | 显示全部楼层
fenma3422 发表于 2012-3-23 12:19
可用多面体求交器

请问是怎么实现呢?我是刚刚接触osg不久,还麻烦您详细讲解一下。

该用户从未签到

 楼主| 发表于 2012-3-23 17:40:10 | 显示全部楼层
难道没有人知道么??请各位大侠帮帮小妹的忙啊

该用户从未签到

发表于 2012-3-23 19:15:18 | 显示全部楼层
PolytopeIntersector 就是 多面体求交器。在osg example 目录下搜索一下 PolytopeIntersector,看看例子是怎么写的,照着写一下

该用户从未签到

 楼主| 发表于 2012-3-23 19:44:30 | 显示全部楼层
xuganggm 发表于 2012-3-23 19:15
PolytopeIntersector 就是 多面体求交器。在osg example 目录下搜索一下 PolytopeIntersector,看看例子是怎 ...

非常感谢xuganggm抽空回答,但是我还是不太明白这是一个什么样的原理,鼠标选中线段可以用多面体求交器,那我创建一个osgUtil:olytopeIntersector* pI =new osgUtil::PolytopeIntersector(poly);这个poly参数多面体应该怎样构建呢,我鼠标点中的话只能获得当前的屏幕坐标啊?是用这个点跟什么来构建多面体进行求交呢?

该用户从未签到

 楼主| 发表于 2012-3-23 21:23:05 | 显示全部楼层
解决了,用的多面体求交,多面体构建为:视点和屏幕上的四个点(由鼠标获得)

该用户从未签到

发表于 2012-3-27 17:59:53 | 显示全部楼层
我想问一下,判断多面体与线段相交的判断语句怎么写?

该用户从未签到

发表于 2012-3-28 10:16:53 | 显示全部楼层
本帖最后由 vinsonxp 于 2012-3-28 11:08 编辑

比如射线求交器可以用下面的代码判断有相交,那么判断多面体与线段相交的应该怎么写?

  1. void PickHandler::pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea)
  2. {
  3.         osgUtil::LineSegmentIntersector::Intersections intersections;
  4.         float x = ea.getX();
  5.         float y = ea.getY();
  6.         if (view->computeIntersections(x,y,intersections))
  7.         {
  8.              for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
  9.                         hitr != intersections.end();
  10.                         ++hitr)
  11.                 {
  12.                      ....
  13.                 }
  14.         }
  15. }
复制代码

该用户从未签到

发表于 2012-3-28 10:17:13 | 显示全部楼层
比如射线求交器可以用下面的语句判断有相交,那么判断多面体与线段相交的应该怎么写?

  1. void PickHandler::pick(osgViewer::View* view, const osgGA::GUIEventAdapter& ea)
  2. {
  3.         osgUtil::LineSegmentIntersector::Intersections intersections;
  4.         float x = ea.getX();
  5.         float y = ea.getY();
  6.         if (view->computeIntersections(x,y,intersections))
  7.         {
  8.              for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
  9.                         hitr != intersections.end();
  10.                         ++hitr)
  11.                 {
  12.                      ....
  13.                 }
  14.         }
  15. }
复制代码

该用户从未签到

 楼主| 发表于 2012-3-28 14:34:51 | 显示全部楼层
//创建多面体求交器,poly为自定义的多面体
osg::ref_ptr<osgUtil:: PolytopeIntersector> intersector = new osgUtil:: PolytopeIntersector(poly)
//创建进行相交的遍历器,遍历器会遍历节点进行相交检测
osgUtil::IntersectionVisitor iv( intersector );
//执行遍历
view->getCamera()->accept( iv );


该用户从未签到

发表于 2012-3-28 15:52:47 | 显示全部楼层
呵呵,找到例子了,在OSG自带例子中的osgkeyboardmouse有用到
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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