查看: 1943|回复: 5

用linesegment射线求交时的疑惑

[复制链接]

该用户从未签到

发表于 2011-1-9 22:44:40 | 显示全部楼层 |阅读模式
本帖最后由 lanxun1988 于 2011-1-9 22:48 编辑

问题:射线求交时候,
    osgUtil:ineSegmentIntersector::Intersections intersections;
    osg::NodePath& nodePath = intersection.nodePath;
    这里的nodePath具体是指什么?我看了那个帮助文档说是从根节点到相交节点的路径上的所有节点的指针集合,但我用std::cout<<nodePath.size()<<std::endl;时候发现并不是这样,我做了一个测试如下:
    一个很简单的场景:root---node节点(这里是那头牛);
   问题1: 当我用射线求交时候,如果我鼠标点在牛身上,确实是选中了,但是nodePath.size()的结果是4,而不是2,这个场景不就2个节点么?为什么会是4呢?不应该是2么?
    问题2:附录代码中的currentNodeParent节点是不是指向root?
    问题3:我要实现的目标是这样的:场景是root---matrixtransform---node,然后用户每点种node一次,就让matrixtransform偏移一下。我的想法就是每选中一个node,让其作为currentNode,然后让currentNodeParent进行偏移工作(当然,转换的时候要转成osg::MatrixTransform类型),但是结果不对。。。。
   



附:
    OSG编程指南书上pick中的一段代码是:
    void pick(osg::ref_ptr<osgViewer::View> view,float x,float y)
{
      osgUtil::LineSegmentIntersector::Intersections intersections;
      if(view->computeIntersections(x,y,intersections))
      {
           osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
           osg::NodePath& nodePath = intersection.nodePath;
          currentNode = (nodePath.size()>=1)?(nodePath[nodePath.size()-1]):0;
          currentNodeParent = (nodePath.size()>=2)?dynamic_cast<osg::Group*> (nodePath[nodePath.size()-2]):0;
      }
  if(currentNode.get()&¤tNodeParent.get())
      {
         /*   .....*/
      }
}

    谢谢各位老师~~~

该用户从未签到

 楼主| 发表于 2011-1-9 22:45:24 | 显示全部楼层
自己先顶一下吧~~

该用户从未签到

发表于 2011-1-10 08:55:53 | 显示全部楼层
但是nodePath.size()的结果是4,而不是2,这个场景不就2个节点么?
看一看cow.osg的内容,您就知道它本身还包含哪些节点了

附录代码中的currentNodeParent节点是不是指向root
显然不是。您不妨将nodePath中的对象一一列出来,使用className()得到它们的类型,或者事先setName()并在求交时getName()来得到您设置的名字,从而理解nodePath的概念

该用户从未签到

 楼主| 发表于 2011-1-10 14:18:20 | 显示全部楼层
3# array
    我进入cow.osg中看了下,里面的结构是这样的group--geode--geometry,如果把这个cow.osg看做是三个结点的话,那么得到的节点数目就正确了~~
    不过新的疑问又来了,如下:
    (1)我如果用node->setName()设置名字,那么具体是哪个节点是这个名字呢?是group?geode?geometry?
     我用node->setName("mycow")测试了一下,将射线求交时候的intersections.begin()节点的nodePath中的内容按照从本节点向根节的顺序遍历了一下,每次用getName()显示出来,显示的结果是:
    cow.osg ---mycow---  (空的,没有显示)----(空的,没有显示)
    我的想法是:root肯定是没有名字的,但是我就不知道在这个cow.osg的内部,顺序是怎么样的了。。。还望指教
    (2)有没有一种办法,我可以将读入的模型内部的节点(比如cow中的geode之类的)给屏蔽掉,而让他只作为一个节点呢?因为我只希望得到这个模型节点在场景树中的父节点指针,至于他的内部是什么样子的我暂时还不用管~请指教~~~

    谢谢您~~

该用户从未签到

发表于 2011-1-10 15:16:49 | 显示全部楼层
view->computeIntersections()其实是以view->getCamera()为起点,因此这四个节点是mainCamera->root->cow[group]->cow[geode],Geometry不是节点类型而是几何体类型

我如果用node->setName()设置名字
设置的就是node的名字,这取决于您这里的node是谁……

有没有一种办法,我可以将读入的模型内部的节点(比如cow中的geode之类的)给屏蔽掉
答案理所当然是没有,因为文件不过是一种存储方式,它不能影响场景图的组织结构。当数据从文件中转换到内存中以后,文件本身就失去了存在的意义

该用户从未签到

 楼主| 发表于 2011-1-10 15:57:09 | 显示全部楼层
5# array
   非常感谢,给我增长了许多见识~~祝您工作顺利~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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