若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/97382348
目录
OSG三维开发专栏
《OSG开发笔记(三):OSG使用osgQt嵌入Qt应用程序》
《OSG开发笔记(四):OSG不使用osgQt重写类嵌入Qt应用程序》:
《OSG开发笔记(七):OSG复现OpenGL入门示例和OSG坐标系》
《OSG开发笔记(九):OSG模型的基本操作之添加/删除、显示/隐藏、开关节点开/关》:
《OSG开发笔记(十):OSG模型的变换之平移、旋转和缩放》
《OSG开发笔记(十二):OSG基本几何图形、内置几何类型》
《OSG开发笔记(十八):OSG鼠标拾取pick、拽托球体以及多光源》
《OSG开发笔记(二十一):OSG使用HUD绘制图形以及纹理混合模式》
《OSG开发笔记(二十三):Qt使用QOpenGLWidget渲染OSG和地球仪》
《OSG开发笔记(二十四):OSG漫游之平移、转向和低抬头》
《OSG开发笔记(二十五):OSG漫游之CS移动、碰撞检测与跳跃》
《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