查看: 3238|回复: 11

computeIntersections问题

[复制链接]

该用户从未签到

发表于 2010-6-22 12:12:35 | 显示全部楼层 |阅读模式
求助:现在碰到这样一个问题,改变了camera的 Viewport大小,( camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));) 选择模型时,computeIntersections(ea.getX(),ea.getY(),intersects)不起作用了,不知道这是为什么?

该用户从未签到

发表于 2010-6-22 12:39:42 | 显示全部楼层
仅仅从您提供的些许信息,我无法判断什么

该用户从未签到

 楼主| 发表于 2010-6-22 13:06:03 | 显示全部楼层
1# zhoudeji
        // Get the current window size
    ::GetWindowRect(m_hWnd, &rect);
    // Init the GraphicsContext Traits
    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
    // Init the Windata Variable that holds the handle for the Window to display OSG in.
    osg::ref_ptr<osg::Referenced> windata = new osgViewer::GraphicsWindowWin32::WindowData(m_hWnd);
    // Setup the traits parameters
    traits->x = 0;
    traits->y = 0;
    traits->width = rect.right - rect.left;
traits->height = rect.bottom - rect.top;
    traits->windowDecoration = false;
    traits->doubleBuffer = true;
    traits->sharedContext = 0;
    traits->setInheritedWindowPixelFormat = true;
    traits->inheritedWindowData = windata;
    // Create the Graphics Context
    osg::GraphicsContext* gc = osg::GraphicsContext::createGraphicsContext(traits.get());
    // Init a new Camera (Master for this View)
    osg::ref_ptr<osg::Camera> camera = new osg::Camera;
    // Assign Graphics Context to the Camera
    camera->setGraphicsContext(gc);
    // Set the viewport for the Camera
    camera->setViewport(new osg::Viewport(traits->x, traits->y, traits->width, traits->height));
camera->setProjectionMatrix(osg::Matrix::perspective(30.0,(double)traits->width/traits->height,0.1,1000));

camera->setClearColor(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
    // Add the Camera to the Viewer
    mViewer->setCamera(camera.get());
    // Add the Camera Manipulator to the Viewer
    mViewer->setCameraManipulator(keyswitchManipulator.get());
    // Set the Scene Data
mViewer->setSceneData(m_pDisplaySceneRoot.get());

    // Realize the Viewer
    mViewer->realize();
这时用鼠标选择模型
osgUtil:ineSegmentIntersector::Intersections intersections;
bool foundIntersection = view->computeIntersections(ea.getX(),ea.getY(),intersections);可以选中模型;现在我把traits设置成traits->x = 0;
    traits->y = 0;
    traits->width =100;
traits->height =100;其他的不变,选择模型时,bool foundIntersection = view->computeIntersections(ea.getX(),ea.getY(),intersections);返回值一直为false,就是选不了模型了

该用户从未签到

发表于 2010-6-22 13:31:11 | 显示全部楼层
您在运行时修改了Traits中的值?这样做并不会真正改变窗口的大小,但是可能会错误地改变让其他类所使用的参数,因而无法正确进行计算

该用户从未签到

 楼主| 发表于 2010-6-22 13:50:37 | 显示全部楼层
4# array
array大哥您好,我是运行前作的修改,附件中图一中模型可以选中,图二中模型无法选中
1.png
2.png

该用户从未签到

发表于 2010-6-22 15:46:33 | 显示全部楼层
我只能猜测是您的窗口尺寸和视口尺寸不一致,导致求取的坐标不正确。建议您使用getXnormalized(),getYnormalized()得到规范化之后的鼠标位置坐标,如果它在视口中的范围不是[-1,-1]到[1,1]的话,根据视口的实际尺寸将其重新规范化到[-1,-1]-[1,1],然后用IntersectionVisitor进行运算

该用户从未签到

发表于 2010-11-4 22:13:49 | 显示全部楼层
楼上的问题解决了吗,能提供一下方法吗?
我最近做项目,发现拖拽时由dragger 的handler处理的computeIntersections返回值为False。
bool View::computeIntersections(float x,float y, osgUtil:ineSegmentIntersector::Intersections& intersections, osg::Node::NodeMask traversalMask)
{
    if (!_camera.valid()) return false;
    float local_x, local_y = 0.0;
    const osg::Camera* camera = getCameraContainingPosition(x, y, local_x, local_y);
    if (!camera) camera = _camera.get();
    osgUtil::LineSegmentIntersector::CoordinateFrame cf = camera->getViewport() ? osgUtil::Intersector::WINDOW : osgUtil::Intersector:ROJECTION;
    osg::ref_ptr< osgUtil::LineSegmentIntersector > picker = new osgUtil::LineSegmentIntersector(cf, local_x, local_y);
  osgUtil::IntersectionVisitor iv(picker.get());
    iv.setTraversalMask(traversalMask);
    const_cast<osg::Camera*>(camera)->accept(iv);
if (picker->containsIntersections()){
intersections = picker->getIntersections();}
在这里,正常情况下,通过(camera)->accept(iv)之后,intersections 不为空,
我却遇到了intersections 为空的情况,调试后发现并不是窗口视口尺寸不一致的问题,
也不是鼠标坐标规范化的问题,不知道是什么原因,array大牛,能分析一下吗?
在此先道谢啦!

该用户从未签到

发表于 2010-11-5 08:55:07 | 显示全部楼层
您没有提供足够的信息(您给出的代码是OSG中的实现代码,而不是您自己的!),所以我判断不了什么

该用户从未签到

发表于 2010-11-5 11:00:18 | 显示全部楼层
array大牛,感谢您的答复,由于我只是简单的使用dragger,没有什么自己的代码,只是debug到computeIntersections的函数,所以就没有给出。
我不太明白,为什么getCameraContainingPosition返回的camera ,当执行accept操作后
picker->getIntersections()的返回值却为空,难道camera 这里有什么玄机吗?

该用户从未签到

发表于 2010-11-5 12:50:14 | 显示全部楼层
没有什么玄机,有玄机的是您自己的程序……

该用户从未签到

发表于 2010-11-7 11:19:59 | 显示全部楼层
array  的答复真是精彩,我仔细查了查,后来发现
如果我不设置CameraManipulator,就可以pick上,computeIntersections返回值为true。
为什么CameraManipulator 和pick有冲突呢,它对于(camera)->accept(iv)有什么影响吗?
array大牛,请您再指点一二。

该用户从未签到

发表于 2010-11-7 20:50:56 | 显示全部楼层
问题解决!麻烦Array了,我wrapper了osgCamera,我不小心把camera的矩阵更新和osg的帧更新放在一块了,由于没有先后,导致camera计算上出现了异常!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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