OSG学习三

OSG学习记录三

在上一节,我们实现了在Qt中添加OSG功能,这样基本的osg的框架也就可以搭好了,所以接下来我们只需往代码中添加OSG模型代码即可。

OSG中添加HUD(Heads Up Display)

在建立三维场景时,往往需要添加一些文字信息或者游戏中的小地图,而这些文字或者小地图不会跟随漫游器移动或翻转操作,始终显示在场景中,即抬头显示功能。

先贴代码,后面慢慢说明

osg::Camera* OSGQtDemo::CreateHUD(const std::string& hud_text, const unsigned int& width, const unsigned int& height)
{
    osg::ref_ptr<osg::Camera> hud_camera = new osg::Camera;
    hud_camera->setName("hud_camera");
    hud_camera->setProjectionMatrix(osg::Matrix::ortho2D(0,width, 0 , height));

    hud_camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
    hud_camera->setViewMatrix(osg::Matrix::identity());

    hud_camera->setClearMask(GL_DEPTH_BUFFER_BIT);

    hud_camera->setRenderOrder(osg::Camera::POST_RENDER);
    hud_camera->setAllowEventFocus(false);

    {
        osg::ref_ptr<osg::Geode> geode = new osg::Geode;
        std::string font("fonts/arial.ttf");

        // turn lighting off for the text and disable depth test to ensure it's always ontop.
        osg::StateSet* stateset = geode->getOrCreateStateSet();
        stateset->setMode(GL_LIGHTING,osg::StateAttribute::OFF);

        osg::Vec3 position(15.0f, 5.0f, 0.0f);

        {
            osgText::Text* text = new  osgText::Text;
            text->setCharacterSizeMode(osgText::TextBase::SCREEN_COORDS);
            text->setName("hud_geode");
            geode->addDrawable( text );

            text->setColor(osg::Vec4(1.0, 0.5,0.5, 1.0));
            text->setFont(font);
            text->setPosition(position);
            text->setText(hud_text);
        }

        hud_camera->addChild(geode);
    }

    return hud_camera.release();
}

(1). 首先要创建一个Camera, 设置Camera为二维正交投影坐标系,这样保证放大缩小,文字或图片都是同样大小;
(2). 设置Camera的参考帧为绝对坐标系,设为绝对坐标系参考帧后,Camera中的结点都是相对于屏幕左下角(0,0)点移动;
(3). 设置Camera的选择顺序为POST_RENDER,这样可以保证后面添加的图像或图形不会覆盖该hud,也就是说保证该Camera最后绘制;
(4). 设置Camera不允许获取到焦点;
(5). 添加Geode;
(6). 创建一个osgText::Text;
(7). 设置Text字体模式为SCREEN_COORDS,这样就保证文字字体大小只是相对于屏幕调整大小;
(8). 设置Text文字字体,并设置Text文字内容;
(9). 将Text添加到Geode中
(10). 设置Text字体颜色、大小、位置等;
(11). 将Geode添加到Camera中;

如果是要创建小地图,方法和上面是一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值