小言_互联网的博客

OSG开发笔记(二十):OSG使用HUD显示文字

820人阅读  评论(0)

若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/97382348

目录

前言

目标效果

HUD(抬头显示)

HUD设置渲染顺序

HUD坐标系解释

代码

Demo运行效果

入坑

入坑二:位置(0,0,0)未显示

入坑二:无法显示hud,但是当作图形添加,可以显示

工程模板:对应版本号1.17.0


 

OSG三维开发专栏

OSG开发笔记(一):OSG介绍、编译

OSG开发笔记(二):OSG帮助文档编译

OSG开发笔记(三):OSG使用osgQt嵌入Qt应用程序

OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序》:

OSG开发笔记(五):OSG场景理解与基础类概述

OSG开发笔记(六):OSG内存管理

OSG开发笔记(七):OSG复现OpenGL入门示例和OSG坐标系

OSG开发笔记(八):OSG模型文件存储与读取

OSG开发笔记(九):OSG模型的基本操作之添加/删除、显示/隐藏、开关节点开/》:

OSG开发笔记(十):OSG模型的变换之平移、旋转和缩放

OSG开发笔记(十一):OSG渲染状态与2D纹理映射

OSG开发笔记(十二):OSG基本几何图形、内置几何类型

OSG开发笔记(十三):OSG三维纹理映射(体渲染)

OSG开发笔记(十四):OSG交互

OSG开发笔记(十五):OSG光照

OSG开发笔记(十六):OSG视口、相机和视点

OSG开发笔记(十七):OSG中的相机移动

OSG开发笔记(十八):OSG鼠标拾取pick、拽托球体以及多光源

OSG开发笔记(十九):OSG文字显示

OSG开发笔记(二十):OSG使用HUD显示文字

OSG开发笔记(二十一):OSG使用HUD绘制图形以及纹理混合模式

OSG开发笔记(二十二):OSG场景背景

OSG开发笔记(二十三):Qt使用QOpenGLWidget渲染OSG地球仪

OSG开发笔记(二十四):OSG漫游之平移、转向和低抬头

OSG开发笔记(二十五):OSG漫游之CS移动、碰撞检测与跳跃

OSG开发笔记(二十六):OSG漫游之上下楼梯

OSG开发笔记(二十七):OSG路径漫游之录制播放固定路径动画

OSG开发笔记(二十八):OSG模型固定路径动画

  持续补充中…

 

        OSG开发笔记(二十):OSG使用HUD显示文字

前言

       前面显示了文字,本章使文字抬头显示(HUD)。

目标效果

      

HUD(抬头显示)

       Hud显示文字使一种非常使实用的技术,可以用来把需要的文字始终显示在屏幕上,HUD即Heads Up Display(抬头显示),这种技术最早应用在军事战斗机上。

       在创建Hud要注意以下几点:

  • Hud要单独创建一个生相机
  • 注意关闭光照,不受光照影响,所以内容以同一亮度显示
  • 关闭深度测试
  • 渲染顺序设置为POST,否则可能会被场景中的其他图形所覆盖。
  • 设置参考贴为绝对型:setReferenceFrame(osg::Transform:ABSOLUTE_RF)
  • 使其不受父节点变换的影响:setMatrix(osg::Matrix::identity())
  • 投影矩阵通常会设置为屏幕尺寸大小

HUD设置渲染顺序

enum RenderOrder
{
    PRE_RENDER,      // 最先渲染,场景背景图用这个
    NESTED_RENDER,   // 应该是正常顺序渲染
    POST_RENDER     // 最后渲染,HUD设置这个
};

       POST渲染选项为最后为该项最后渲染。

// 设置POST渲染顺序(最后渲染)
pCamera->setRenderOrder(osg::Camera::POST_RENDER);

HUD坐标系解释

        

代码

osg::ref_ptr<osg::Node> OsgWidget::getHudTextNode()
{
    osg::ref_ptr<osg::Group> pGroup = new osg::Group();
    osg::ref_ptr<osg::Geode> pGeode = new osg::Geode();
    osg::ref_ptr<osgText::Text> pText = 0;
    // 步骤一:实例化文字类
    pText = new osgText::Text();
    // 步骤二:设置 文字颜色: 红色, 透明度有效(opengl需要额外开启透明通道)
    pText->setColor(osg::Vec4f(1.0, 1.0, 1.0, 1.0));
    // 步骤三:设置 文字位置(设置文字框的中心点的坐标)
    pText->setPosition(osg::Vec3f(0, 0, 0));
    // 步骤四:设置 文字方向
    pText->setAxisAlignment(osgText::Text::XZ_PLANE);
    // 步骤五:设置 大小模式(测试当前没发现有什么区别)
    pText->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
    // 步骤六:设置 分辨率
    pText->setFontResolution(32, 32);
    // 步骤七:设置 对齐方式
    pText->setAlignment(osgText::Text::LEFT_CENTER);
    // 步骤八:设置 输出格式
    pText->setLayout(osgText::Text::LEFT_TO_RIGHT);
    // 步骤九:设置 绘制模式
    pText->setDrawMode(osgText::Text::TEXT);
    // 步骤十:设置 背景类型
    pText->setBackdropType(osgText::Text::NONE);
    // 步骤十一:设置 颜色倾斜模式
    pText->setColorGradientMode(osgText::Text::SOLID);
    // 以上部分属性是默认的,可以不设置,此处为阅读都写出来
    QString version = "V1.17.0";
    QString text = QString("OsgDemo %1(作者:红模仿 QQ21497936 博客地址: blog.csdn.net/qq21497936)").arg(version);
    pText->setText(text.toStdString(), osgText::String::ENCODING_UTF8);
    // 乱码
    pText->setFont(osgText::readFontFile("fonts/simsun.ttc"));
    pGeode->addDrawable(pText.get());
    pGroup->addChild(pGeode);

    // 增加新的文字,增加相机实现hud
    {
        pText = new osgText::Text();
        pText->setFont(osgText::readFontFile("fonts/simsun.ttc"));
        QString text = QString("作者:红模仿 QQ21497936 博客地址: blog.csdn.net/qq21497936");
        pText->setText(text.toStdString(), osgText::String::ENCODING_UTF8);
        pText->setPosition(osg::Vec3f(0, 0, 0));
        pText->setCharacterSize(40);
        pText->setColor(osg::Vec4f(1.0, 1.0, 1.0, 1.0));
        pText->setDrawMode(osgText::Text::TEXT);
        // 此条会导致hub不显示(必须设置为SCREEN)
//        pText->setAxisAlignment(osgText::Text::XZ_PLANE);
        pText->setAxisAlignment(osgText::Text::XY_PLANE);
        pText->setCharacterSizeMode(osgText::Text::OBJECT_COORDS);
        pText->setFontResolution(32, 32);
        pText->setAlignment(osgText::Text::LEFT_BOTTOM);
        pText->setLayout(osgText::Text::LEFT_TO_RIGHT);
        pText->setBackdropType(osgText::Text::NONE);
        pText->setColorGradientMode(osgText::Text::SOLID);

        // 步骤一:创建HUD摄像机
        osg::ref_ptr<osg::Camera> pCamera = new osg::Camera;
        // 步骤二:设置投影矩阵
        pCamera->setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 800));
        // 步骤三:设置视图矩阵,同时确保不被场景中其他图形位置变换影响, 使用绝对帧引用
        pCamera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
        pCamera->setViewMatrix(osg::Matrix::identity());
        // 步骤四:清除深度缓存
        pCamera->setClearMask(GL_DEPTH_BUFFER_BIT);
        // 步骤五:设置POST渲染顺序(最后渲染)
        pCamera->setRenderOrder(osg::Camera::POST_RENDER);
        // 步骤六:设置为不接收事件,始终得不到焦点
        pCamera->setAllowEventFocus(false);

        pGeode = new osg::Geode();
        osg::ref_ptr<osg::StateSet> pStateSet = pGeode->getOrCreateStateSet();
        // 步骤七:关闭光照
        pStateSet->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
        // 步骤八:关闭深度测试
        pStateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);

        pGeode->addDrawable(pText.get());
        pCamera->addChild(pGeode.get());
        pGroup->addChild(pCamera.get());
    }
    return pGroup.get();
}

 

Demo运行效果

        

         

 

入坑

入坑二:位置(0,0,0)未显示

原因:

       对齐问题,本身位置是(0,0,0)。

解决方法:

       对齐的方式是对齐该点为哪个位置,比如左上对齐,那么左上点就是我们设置的位置(0,0,0),然后就显示不出来了。

       

入坑二:无法显示hud,但是当作图形添加,可以显示

原因:

       设置显示面的问题。

解决方法:

       

工程模板:对应版本号1.17.0

        对应版本号1.17.0


原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/97382348


转载:https://blog.csdn.net/qq21497936/article/details/97382348
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场