若该文为原创文章,未经允许不得转载
原博主博客地址: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使用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模型固定路径动画》
持续补充中…
前面显示了文字,本章使文字抬头显示(HUD)。
Hud显示文字使一种非常使实用的技术,可以用来把需要的文字始终显示在屏幕上,HUD即Heads Up Display(抬头显示),这种技术最早应用在军事战斗机上。
在创建Hud要注意以下几点:
enum RenderOrder
{
PRE_RENDER, // 最先渲染,场景背景图用这个
NESTED_RENDER, // 应该是正常顺序渲染
POST_RENDER // 最后渲染,HUD设置这个
};
POST渲染选项为最后为该项最后渲染。
// 设置POST渲染顺序(最后渲染)
pCamera->setRenderOrder(osg::Camera::POST_RENDER);
osg::ref_ptr OsgWidget::getHudTextNode()
{
osg::ref_ptr pGroup = new osg::Group();
osg::ref_ptr pGeode = new osg::Geode();
osg::ref_ptr 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 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 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();
}
原因:
对齐问题,本身位置是(0,0,0)。
解决方法:
对齐的方式是对齐该点为哪个位置,比如左上对齐,那么左上点就是我们设置的位置(0,0,0),然后就显示不出来了。
原因:
设置显示面的问题。
解决方法:
对应版本号1.17.0
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/97382348