查看: 1758|回复: 17

怎么样能pick到HUD

[复制链接]

该用户从未签到

发表于 2013-8-7 14:41:16 | 显示全部楼层 |阅读模式
用hud显示文字信息,想让鼠标点击这个hud的时候有相应的提示,现在是pick场景里其他物体可以,就是点pick的时候没反应,经测试是直接选中的hud后面的场景中的物体,也搜了一下以前的帖子 ,发现有相同的问题,该如何设置啊?

该用户从未签到

发表于 2013-8-8 11:34:34 | 显示全部楼层
你可以尝试用Widget或者Label来实现。

该用户从未签到

发表于 2013-8-8 11:34:54 | 显示全部楼层
你可以尝试用Widget或者Label来实现。

该用户从未签到

 楼主| 发表于 2013-8-8 12:34:46 | 显示全部楼层
Mooneast 发表于 2013-8-8 11:34
你可以尝试用Widget或者Label来实现。

widget或者label的话能像node一样添加到root吗?

该用户从未签到

发表于 2013-8-8 13:56:59 | 显示全部楼层
都可以Pick到啊  我这里使用没有问题啊

该用户从未签到

 楼主| 发表于 2013-8-8 14:44:34 | 显示全部楼层
liuzhiyu123 发表于 2013-8-8 13:56
都可以Pick到啊  我这里使用没有问题啊

那能麻烦您下把 您的代码贴出来我学习下好吗,我这里实在是不行啊!

该用户从未签到

发表于 2013-8-8 15:14:19 | 显示全部楼层
就是最简单的 osgViewer::View中的那个 intersection

该用户从未签到

发表于 2013-8-8 15:16:57 | 显示全部楼层
huahuawei88 发表于 2013-8-8 12:34
widget或者label的话能像node一样添加到root吗?

当然可以啦,不过得在Widget外面套一层box。

该用户从未签到

 楼主| 发表于 2013-8-8 16:37:26 | 显示全部楼层
liuzhiyu123 发表于 2013-8-8 15:14
就是最简单的 osgViewer::View中的那个 intersection

我就用的这个啊,调试也是没有交到东西,相交检测里的for循环都没进

该用户从未签到

发表于 2013-8-9 13:25:04 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-8-9 13:31 编辑

//创建HUD相机
        osg::ref_ptr<osg::Camera> pHUDcamera = new osg::Camera;
    pHUDcamera->setClearMask( GL_DEPTH_BUFFER_BIT );
    pHUDcamera->setRenderOrder(osg::Camera:: POST_RENDER );
        pHUDcamera->setReferenceFrame( osg::Camera::ABSOLUTE_RF );       
        //设置相交的视点
        pHUDcamera->setViewMatrixAsLookAt(osg::Vec3(0.0f,-100.0f,0.0f), osg::Vec3(0.0,-99.0,0.0), osg::Vec3(0.0f,0.0f,1.0f));
        double dFovy,dR,dNear,dFar;
        //设置相交的镜头视锥体
       //得到主摄像机的视锥参数---m_Viewer为主视图对象指针
        m_Viewer->getCamera()->getProjectionMatrixAsPerspective(dFovy,dR,dNear,dFar);
        pHUDcamera->setProjectionMatrixAsPerspective(dFovy,dR,dNear,dFar);
       
        // 初始化根节点
        osg::Group* root = new osg::Group();  

// 设置HUD 文字的参数
        string sFontsPath="C:\\WINDOWS\\Fonts\\";
        string sFontsName="SIMFANG.TTF";
       
        osg::Geode* HUDGeode2 = new osg::Geode();
        osgText::Text* textTWO = new osgText::Text();
        sFontsName=sFontsPath+sFontsName;
        textTWO->setFont(sFontsName);
        textTWO->setText(L"钓客笑傲江湖!");
        textTWO->setAxisAlignment(osgText::Text::SCREEN);
        textTWO->setPosition(osg::Vec3(-120.0, 165, -1.47));
        textTWO->setColor(osg::Vec4(199, 77, 15, 1));
       
        osg::ref_ptr<osg::Group> pTxtGrp=new osg::Group;
        pTxtGrp->addChild(HUDGeode2);
        HUDGeode2->addDrawable(textTWO);

     pHUDcamera->addChild(pTxtGrp);

    //
    root->addChild(pHUDcamera.get());

该用户从未签到

发表于 2013-8-9 13:37:06 | 显示全部楼层
pick 就是原来的东东,不需要改变,主要是你的HUD创建的问题!

该用户从未签到

 楼主| 发表于 2013-8-9 22:25:44 | 显示全部楼层
VR_user_happy 发表于 2013-8-9 13:37
pick 就是原来的东东,不需要改变,主要是你的HUD创建的问题!

按照你的方法可以pick到了,但是好像是只有点中文字的时候才会pick到,文字之间的空白区域是选不到的吗?

该用户从未签到

发表于 2013-8-10 01:30:02 | 显示全部楼层
当然,那个是字之间的空隙,没有几何绘图,ploy相交当然没有交点了

该用户从未签到

发表于 2013-8-10 09:12:13 | 显示全部楼层
如果你想点中字条的效果:
    1.就需要考虑把其下附带一个透明的矩形几何体,附着在字体范围条框内;这样相交检查就会对暗藏的背景矩形几何体图元作相交检查!
   2.等检测到这个矩形几何体时,你在处理选择结果函数里,再高亮字体对象就可以了

该用户从未签到

 楼主| 发表于 2013-8-10 14:54:10 | 显示全部楼层
VR_user_happy 发表于 2013-8-10 09:12
如果你想点中字条的效果:
    1.就需要考虑把其下附带一个透明的矩形几何体,附着在字体范围条框内;这样 ...

恩,有道理,还有就是你给的代码里面

  1. pHUDcamera->setViewMatrixAsLookAt(osg::Vec3(0.0f,-100.0,0.0f), osg::Vec3(0.0,-99.0,0.0), osg::Vec3(0.0f,0.0f,1.0f));
  2. double dFovy,dR,dNear,dFar;
  3. //设置相交的镜头视锥体
  4. //得到主摄像机的视锥参数---m_Viewer为主视图对象指针
  5. myviewer->getCamera()->getProjectionMatrixAsPerspective(dFovy,dR,dNear,dFar);
  6. pHUDcamera->setProjectionMatrixAsPerspective(dFovy,dR,dNear,dFar);
复制代码
这几句是什么作用,他和updateText->setPosition之间是什么关系,就是现在文字的位置感觉不知道怎么控制

该用户从未签到

发表于 2013-8-10 15:11:23 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-8-10 15:32 编辑

先要明白HUD的原理:
他是对挂接的节点直接进行是相机的投影
投影就是个视锥平躺倒放的矩形平截头锥体对应的镜头下地成像拍摄!
就像一个摄像机的镜头一样(不过不是圆形的是矩形的,镜头就是屏幕),对物体进行拍摄:
1.
setViewMatrixAsLookAt控制摄像机的摄像方向;
你调整它就是调整摄像方向,是否视线对准了物体,拍摄是正立、歪头、还是倒立(摄像机的镜头旋转)。
2.setProjectionMatrixAsPerspective控制摄像机的聚焦和视野,包括远近剪裁面
调整它就是类似伸缩镜头的效果。
3.你的HUD下地节点位置Position,是3D中的坐标;
    而你现在用了HUD,就是对这个节点下地东东进行了相机拍照的效果;
        ------相当于你按下快门,在屏幕上进行了投影。
    所以HUD下地节点3D的位置意义已经不大了,他在屏幕上的位置,是你通过控制相机的参数来调整的,现在明白了吗?

该用户从未签到

发表于 2013-8-10 15:26:44 | 显示全部楼层
本帖最后由 VR_user_happy 于 2013-8-10 15:29 编辑

给物体照相,拍摄的效果有两种,一种是调整相机;另一种是调整拍摄物位置!
当然,你也可以调整节点物体的位置:就相当于,你给某个物体照相,你把相机固定,调整物体的位置,来看成像的结果!
   拍摄HUD的效果:首先是先调整相机,看屏幕上大体成像的位置(远近等),再微调物体的实际位置,以达到最佳屏幕效果!

该用户从未签到

 楼主| 发表于 2013-8-10 23:55:43 | 显示全部楼层
VR_user_happy 发表于 2013-8-10 15:26
给物体照相,拍摄的效果有两种,一种是调整相机;另一种是调整拍摄物位置!
当然,你也可以调整节点物体的 ...

大神啊,非常感谢,非常感谢,以后还请多多指点啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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