查看: 1948|回复: 14

如何获取选中物体的世界坐标

[复制链接]

该用户从未签到

发表于 2011-5-23 13:54:17 | 显示全部楼层 |阅读模式
想扩展osg自带的osgmanipulator例子,当选中,拖拽某个物体时,如何获取该物体的当前世界坐标?
恳请高手帮忙。

该用户从未签到

发表于 2011-5-23 15:36:16 | 显示全部楼层
矩阵级联,computeLocalToWorldMatrix gettrans

该用户从未签到

 楼主| 发表于 2011-5-23 16:14:03 | 显示全部楼层
谢谢,能具体一点吗?
我参照osgmanipulator例子,稍微改了,但是字体显示不出来。红色的为添加的代码

bool handle(const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa,
                    osg::Object*, osg::NodeVisitor*)
        {
            osgViewer::View* view = dynamic_cast<osgViewer::View*>(&aa);
            if (!view) return false;

            if (ea.getKey() == osgGA::GUIEventAdapter::KEY_Tab &&
                ea.getEventType() == osgGA::GUIEventAdapter::KEYDOWN &&
                _activeDragger == 0)
            {
                _mode = ! _mode;
            }
            
            if (VIEW == _mode) return false;

            switch (ea.getEventType())
            {
                case osgGA::GUIEventAdapter:USH:
                {
                    osgUtil:ineSegmentIntersector::Intersections intersections;

                    _pointer.reset();

                    if (view->computeIntersections(ea.getX(),ea.getY(),intersections))
                    {
                        _pointer.setCamera(view->getCamera());
                        _pointer.setMousePosition(ea.getX(), ea.getY());

                                                //osgUtil::LineSegmentIntersector::Intersections::iterator hitr;
                        for(osgUtil::LineSegmentIntersector::Intersections::iterator hitr = intersections.begin();
                            hitr != intersections.end();
                            ++hitr)
                        {
                            _pointer.addIntersection(hitr->nodePath, hitr->getLocalIntersectPoint());
                   //输入流
              os<<"Mouse in World X:"<<hitr->getWorldIntersectPoint().x()
                      <<"  Y:"<<hitr->getWorldIntersectPoint().y()
                      <<"Z:"<<hitr->getWorldIntersectNormal().z()
                      <<std::endl;
                        }
                        for (osg::NodePath::iterator itr = _pointer._hitList.front().first.begin();
                             itr != _pointer._hitList.front().first.end();
                             ++itr)
                        {
                            osgManipulator:ragger* dragger = dynamic_cast<osgManipulator::Dragger*>(*itr);
                            if (dragger)
                            {

                                dragger->handle(_pointer, ea, aa);
                                _activeDragger = dragger;
                                break;
                            }                  
                        }
                                               
                                               
                        _gdList += os.str();
                _updateText->setText(gdList);

                    }
                }

该用户从未签到

发表于 2011-5-23 17:55:37 | 显示全部楼层
如果是显示的话,这段代码提取数据是没问题的,可能是您设置字体那有问题

该用户从未签到

发表于 2011-5-23 18:26:27 | 显示全部楼层
创建访问器获取节点路径,根据节点路径直接调用computeLocalToWorld即可

该用户从未签到

 楼主| 发表于 2011-5-24 13:27:12 | 显示全部楼层
回复 3# xsyasxf


    字体就是显示不出来。

该用户从未签到

 楼主| 发表于 2011-5-24 13:34:24 | 显示全部楼层
回复 4# liuzhiyu123


谢谢oman回答!
     我表达得不清楚,oman可能还没理解我的意思。依照你的意思是:获取场景中根节点下某个子节点的世界坐标。
而我想获取的是当前被选中物体的世界坐标,并且可以对选中物体进行Drag,无论Drag到哪里都能显示该物体当前位置的世界坐标。
也就是说,物体移动的同时就可以显示该物体当前的世界坐标。

该用户从未签到

发表于 2011-5-24 14:38:51 | 显示全部楼层
回复 7# xsyasxf

请先弄明白Dragger和Selection的关系。selection下面挂载的是您的NODE节点,所以您获得Dragger的坐标是不对的,它不是物体的世界坐标。selection和Dragger是共享一个父节点的,说道这里您应该懂得怎么做了,呵呵

该用户从未签到

 楼主| 发表于 2011-5-24 17:09:17 | 显示全部楼层
回复 8# liuzhiyu123


    selection下是有其子节点(该节点即要显示坐标的物体),但已经通过osg::Manipulator::CommandManager的connect()方法将selection和drag联结起来了,我用的是osgManipulator::TabBoxDragger,TabBoxDragger大小和物体的大小是一样的(为了美观,因为物体有好几个,TabBoxDragger很大显得整个场景图形很乱),
所以是获取drag坐标还是获取物体坐标都是一样的,都可以表示当前物体的位置,所以这不是问题的关键。获取坐标的代码应该要写在handle()函数里面的吧?如果是应该写在哪个位置比较好?

该用户从未签到

 楼主| 发表于 2011-5-24 17:10:06 | 显示全部楼层
回复 5# oman


    求教oman!

该用户从未签到

 楼主| 发表于 2011-5-24 22:07:42 | 显示全部楼层
请教各位大侠!

该用户从未签到

发表于 2011-5-24 22:22:43 | 显示全部楼层
if (dragger)
                            {
                                dragger->handle(_pointer, ea, aa);
                                _activeDragger = dragger;
//就放在这里**************************************************
                                break;
                            }

该用户从未签到

 楼主| 发表于 2011-5-25 09:21:03 | 显示全部楼层
回复 12# liuzhiyu123


    谢谢您!我试试。

该用户从未签到

 楼主| 发表于 2011-5-25 19:44:05 | 显示全部楼层
回复 13# xsyasxf


    解决了,谢谢!还是得用访问器!

该用户从未签到

 楼主| 发表于 2011-5-25 19:44:52 | 显示全部楼层
回复 13# xsyasxf


    谢谢!还是得用访问器!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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