查看: 1445|回复: 12

hud

[复制链接]

该用户从未签到

发表于 2010-10-5 11:27:23 | 显示全部楼层 |阅读模式
给视口添加HUD相机,然后再在本视口写一个四边形,结果四边形被覆盖掉了;如何将四边形不被覆盖?

该用户从未签到

发表于 2010-10-5 21:20:16 | 显示全部楼层
osg::Camera* camera = new osg::Camera;

    // set the projection matrix
    camera->setProjectionMatrix(osg::Matrix:rtho2D(0,1280,0,1024));

    // set the view matrix   
    camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    camera->setViewMatrix(osg::Matrix::identity());

    // only clear the depth buffer
    camera->setClearMask(GL_DEPTH_BUFFER_BIT);

    // draw subgraph after main camera view.
    camera->setRenderOrder(osg::Camera:OST_RENDER);

    // we don't want the camera to grab event focus from the viewers main camera(s).
    camera->setAllowEventFocus(false);
//---------
    camera->setRenderOrder(osg::Camera::POST_RENDER);把camera设置成POST_RENDER即可

该用户从未签到

 楼主| 发表于 2010-10-6 09:46:31 | 显示全部楼层
谢谢了!
我的HUD也是这样写的,但是总是覆盖写的四边形,是不是我的四边形写的不是地方啊?下面是我的HUD和main函数的一部分,你看有怎么修改。
osg::ref_ptr<osg::Camera> createHUDmap()
{
        osg::ref_ptr<osg::Camera> camera = new osg::Camera() ;
        //设置投影矩阵
        camera->setProjectionMatrix(osg::Matrix:rtho2D(0,1440,0,900));
        //设置视图矩阵,同时确保不被场景中其他图形位置变换影响,使用绝对帧引用
        camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        camera->setViewMatrix(osg::Matrix::identity());
        //清除深度缓存
        camera->setClearMask(GL_DEPTH_BUFFER_BIT);
        //设置渲染顺序为POST
        camera->setRenderOrder(osg::Camera:OST_RENDER);
        //设置为不接收事件,始终不得到焦点
        camera->setAllowEventFocus(false);
        osg::ref_ptr<osg::Geode> geode = new osg::Geode() ;
        osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet() ;
        //关闭光照
        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
        //关闭深度测试
        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
        osg::ref_ptr<osg:rawPixels> bitmap=new osg::DrawPixels;
        bitmap->setPosition(osg::Vec3(0,0,0));
        bitmap->setImage(osgDB::readImageFile("fangzi.png"));
        geode->addDrawable(bitmap.get());
        camera->addChild(geode.get());       
        return camera.get() ;
}
四边形函数是createfour();
main函数为   
                     ………………
                     viewer->addView(view.get());
                view->getCamera()->setViewport( new osg::Viewport(0,0,600,600));
                view->getCamera()->setGraphicsContext(gc.get());
                osg::ref_ptr<osg::Group> root = new osg::Group;
                root->addChild(createHUDmap());
                root->addChild(createfour());
                view->setSceneData(root.get());
                                ………………

该用户从未签到

发表于 2010-10-6 11:07:30 | 显示全部楼层
//关闭深度测试
        stateset->setMode(GL_DEPTH_TEST,osg::StateAttribute::OFF);
//-------------
把深度测试打开试试

该用户从未签到

 楼主| 发表于 2010-10-6 11:28:57 | 显示全部楼层
把深度测试打开还是不行,怎么办?

该用户从未签到

发表于 2010-10-7 10:27:55 | 显示全部楼层
你不加hud有没?
hud显示的什么,你hud后序渲染,肯定会盖住原来屏幕上的东东

该用户从未签到

 楼主| 发表于 2010-10-7 14:56:56 | 显示全部楼层
你好,我加HUD了,hud显示的是 bitmap->setImage(osgDB::readImageFile("fangzi.png"));,我的hud渲染顺序为camera->setRenderOrder(osg::Camera:OST_RENDER);这个应该是前序渲染吧

该用户从未签到

发表于 2010-10-8 22:18:40 | 显示全部楼层
POST_RENDER是后序渲染,也就是相机的子场景会在主场景渲染结束后再被渲染

该用户从未签到

 楼主| 发表于 2010-10-9 17:56:03 | 显示全部楼层
王锐老师,那前序渲染怎么写?

该用户从未签到

发表于 2010-10-9 20:29:39 | 显示全部楼层
PRE_RENDER,不过您真的认为您这里应当用到前序渲染?

该用户从未签到

 楼主| 发表于 2010-10-10 11:17:12 | 显示全部楼层
我不清楚,我还想问一下while(!viewer->done()){viewer->frame();},这个循环是什么意思,怎么用?

该用户从未签到

发表于 2010-10-11 08:37:36 | 显示全部楼层
如果您想实现HUD效果的话,osghud是一个很好的参考

至于
while(!viewer->done()){viewer->frame();}
的作用,它只是仿真循环而已,也就是viewer.run()的内部执行方式

该用户从未签到

 楼主| 发表于 2010-10-11 20:13:58 | 显示全部楼层
谢谢,王锐老师!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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