查看: 2396|回复: 10

鼠标与场景求交

[复制链接]

该用户从未签到

发表于 2009-4-7 19:38:16 | 显示全部楼层 |阅读模式
求交代码如下:
       osgUtil:ineSegmentIntersector::Intersections intersections;
        if (view->computeIntersections(x, y, intersections))
        {
            osgUtil::LineSegmentIntersector::Intersection intersection = *intersections.begin();
            osg::NodePath& nodePath = intersection.nodePath;
            node = (nodePath.size()>=1)?nodePath[nodePath.size()-1]:0;
            parent = (nodePath.size()>=2)?dynamic_cast<osg::Group*>(nodePath[nodePath.size()-2]):0;
        }

该如何获取交点的三维坐标?

该用户从未签到

发表于 2009-4-7 20:15:38 | 显示全部楼层
intersection.getWorldIntersectPoint()

该用户从未签到

 楼主| 发表于 2009-4-7 21:22:42 | 显示全部楼层
我的问题描述的有点问题,应该是这样的:
我的场景中有两个camera,一个是RTT camera,一个是 主camera.
通过RTT camera 把场景绘制到一张纹理上,在主camera中对场景进行后处理,然后通过一个正方形将结果显示出来,
那么当我采用如下方法进行求交时:
            osgViewer::View* view = new osgViewer::View;
            // add the handler for doing the picking
            view->addEventHandler(new PickHandler());
求得的交点是与那张平面纹理所附着的正方形的交点,而不是与原来的场景的交点。
我该怎样进行处理才能得到与原场景的交点?

该用户从未签到

 楼主| 发表于 2009-4-7 22:51:10 | 显示全部楼层
我认为这个问题本质上就是只知道一个camera以及其投影矩阵,模型试图矩阵以及viewport,如何根据鼠标的二维位置来求其坐标?

该用户从未签到

 楼主| 发表于 2009-4-8 12:08:33 | 显示全部楼层

我采用了如下方法,但是还是没有交点:

//首先将屏幕坐标转换为世界坐标,通过近平面和远平面两个点来确定一条线,
                osg::Matrix VPW = camera->getViewMatrix() *
                        camera->getProjectionMatrix() *
                        camera->getViewport()->computeWindowMatrix();
                osg::Matrix inverseVPW;
                inverseVPW.invert(VPW);
                osg::Vec3d world_near = osg::Vec3d(x, y, 0.0) * inverseVPW;  // x, y为屏幕坐标, 0.0表示近平面
                osg::Vec3d world_far = osg::Vec3d(x, y, 1.0) * inverseVPW;
//然后用这条线和场景求交
                osg::ref_ptr< osgUtil:ineSegmentIntersector > picker =
                        new osgUtil::LineSegmentIntersector(osgUtil::Intersector::MODEL, world_near, world_far);

                osgUtil::IntersectionVisitor iv(picker.get());
                iv.setTraversalMask(0xffffffff);
                camera->accept(iv);

                osgUtil::LineSegmentIntersector::Intersections intersections ;
                if (picker->containsIntersections())
                {
                        intersections = picker->getIntersections();
                }
结果,无论怎么样都没有交点

[ 本帖最后由 panbin 于 2009-4-8 12:11 编辑 ]

该用户从未签到

 楼主| 发表于 2009-4-8 15:42:00 | 显示全部楼层
唉,已经搞定了。上面的代码是错误的。基本原则是通过两个点来确定一条线,即 :LineSegmentIntersector,然后与场景进行求交。把代码发上来大家一起研究一下吧:
//首先将屏幕上的点转换为三维坐标点               
osg::Matrix VPW = _mp->getRttCamera()->getViewMatrix() *
                        _mp->getRttCamera()->getProjectionMatrix() *
                        _mp->getRttCamera()->getViewport()->computeWindowMatrix();
                osg::Matrix inverseVPW;
                inverseVPW.invert(VPW);
                osg::Vec3d world_far = osg::Vec3d(x,  y, 1.0) * inverseVPW;

                osg::Vec3d eye = osg::Vec3d(-46594, -33513.910, 13703); //这个要与摄像机的位置一致

                osg::ref_ptr< osgUtil:ineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(eye, world_far);

                osgUtil::IntersectionVisitor iv(picker.get());
                _mp->getRttCamera()->accept(iv);

                osgUtil::LineSegmentIntersector::Intersections intersections ;

                if (picker->containsIntersections())
                {
                        intersections = picker->getIntersections();
                }

[ 本帖最后由 panbin 于 2009-4-8 16:09 编辑 ]

该用户从未签到

发表于 2009-4-8 17:35:44 | 显示全部楼层
呵呵,楼主自己分析问题解决问题的能力很值得赞赏啊~~抱歉今天一天都发烧腹泻,没办法及时回答问题,现在才敢勉强上论坛看一看

该用户从未签到

 楼主| 发表于 2009-4-8 19:10:35 | 显示全部楼层
注意身体啊!

该用户从未签到

发表于 2009-4-9 09:23:28 | 显示全部楼层
--"osg::Vec3d eye = osg::Vec3d(-46594, -33513.910, 13703); //这个要与摄像机的位置一致"
相机位置可以通过对(0,0,0)应用相机矩阵来获取:camera->getInverseViewMatrix().preMult(osg::Vec4(0, 0, 0, 1));

该用户从未签到

发表于 2009-4-9 09:30:00 | 显示全部楼层
其实这些代码在osgUtil::SceneView中都有的:)
projectWindowXYIntoObject
projectObjectIntoWindow

该用户从未签到

 楼主| 发表于 2009-4-9 10:39:19 | 显示全部楼层
对,indif提供的信息很重要,是同一个问题,但是前提条件是不一样的,我遇到的问题只有相机,而没有view,相机没有与sceneview绑定,即只有相机,所以这些工作只能自己来写函数,虽然算法是一样的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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