OSG文字-HUD显示汉字示例(3)

        显示文字是一种非常实用的技术,可以用来把一些重要的文字始终显示在屏幕上。HUD的全称是HeadsUpDisplay,即抬头显示,这种技术最早应用在军事战斗机上。

        创建HUD显示的基本步骤如下:

        <1> 创建一个osg::Camera对象,设置视图、投影矩阵及渲染顺序,以确保在场景图形全部渲染完后才进行渲染。

        <2> 创建一个osg::Geode 对象和一个osgText::Text 对象,并设置相应的文字属性。把osgText::Text对象添加到 Geode 叶节点。

        <3> 把叶节点Geode关联到步骤(1)所创建的相机

        在创建HUD显示文字显示时,需要注意的有如下几点:

  • 渲染顺序设置为 POST,否则可能会被场景中的其他图形所覆盖。
  • 注意关闭光照和深度
  • 投影矩阵通常设置为屏幕尺寸大小。

        代码如程序清单9-3所示。

1.	/* HUD 显示汉字 */  
2.	osg::ref_ptr<osg::Camera> createHUDText(const string strFontPath)  
3.	{  
4.	    osg::ref_ptr<osg::Camera> camera = new osg::Camera();  
5.	  
6.	    // 设置投影矩阵  
7.	    camera->setProjectionMatrix(osg::Matrix::ortho2D(0, 1280, 0, 800));  
8.	      
9.	    // 设置视图矩阵,同事确保不被场景中其它图形位置变换影响,使用绝对帧引用  
10.	    camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);  
11.	    camera->setViewMatrix(osg::Matrix::identity());  
12.	  
13.	    // 清除深度缓存  
14.	    camera->setClearMask(GL_DEPTH_BUFFER_BIT);  
15.	  
16.	    // 设置渲染顺序为POST  
17.	    camera->setRenderOrder(osg::Camera::POST_RENDER);  
18.	  
19.	    // 设置为不接收时间,始终不得到焦点  
20.	    camera->setAllowEventFocus(false);  
21.	  
22.	    osg::ref_ptr<osg::Geode> geode = new osg::Geode();  
23.	    osg::ref_ptr<osg::StateSet> stateset = geode->getOrCreateStateSet();  
24.	  
25.	    // 关闭光照  
26.	    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);  
27.	  
28.	    // 关闭深度测试  
29.	    stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);  
30.	      
31.	    // 设置文字  
32.	    osg::ref_ptr<osgText::Text> text = new osgText::Text();  
33.	    osg::ref_ptr<osgText::Font> font = new osgText::Font();  
34.	    font = osgText::readFontFile(strFontPath);  
35.	    text->setFont(font.get());  
36.	    text->setText(L"http://www.OsgChina.osg-OpenScenseGraph 中国官方");  
37.	    text->setPosition(osg::Vec3(100.0, 600.0, 0));  
38.	    text->setCharacterSize(40.0);  
39.	    text->setColor(osg::Vec4(1.0, 0.0, 0.0, 1.0));  
40.	    text->setDrawMode(osgText::Text::TEXT | osgText::Text::BOUNDINGBOX);  
41.	  
42.	    geode->addDrawable(text.get());  
43.	    camera->addChild(geode.get());  
44.	  
45.	    return camera.get();  
46.	}  
47.	  
48.	void osgText_HUD_Text_9_3(const string &strDataFolder)  
49.	{  
50.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
51.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
52.	    traits->x = 40;  
53.	    traits->y = 40;  
54.	    traits->width = 600;  
55.	    traits->height = 480;  
56.	    traits->windowDecoration = true;  
57.	    traits->doubleBuffer = true;  
58.	    traits->sharedContext = 0;  
59.	  
60.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
61.	  
62.	    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();  
63.	    camera->setGraphicsContext(gc.get());  
64.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
65.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
66.	    camera->setDrawBuffer(buffer);  
67.	    camera->setReadBuffer(buffer);  
68.	  
69.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
70.	  
71.	    // 读取模型  
72.	    string strDataPath = strDataFolder + "logo.ive";  
73.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
74.	  
75.	    root->addChild(node.get());  
76.	  
77.	    // 添加HUD文字  
78.	    string strFontPath = strDataFolder + "font\\simhei.ttf";  
79.	    root->addChild(createHUDText(strFontPath));  
80.	  
81.	    // 优化场景数据  
82.	    osgUtil::Optimizer optimizer;  
83.	    optimizer.optimize(root.get());  
84.	  
85.	    viewer->setSceneData(root.get());  
86.	    viewer->realize();  
87.	    viewer->run();  
88.	} 

        运行程序,截图如图9-5 所示。

图9-5 HUD显示汉字示例截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/159920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【CSH 入门基础 11 -- csh 判断命令是否执行成功】

文章目录 CSH 命令执行情况判断BASH 命令执行情况判断CSH 命令执行情况判断 在 csh 或 tcsh 脚本中,可以使用 $status 变量来检查上一个命令的退出状态。如果 $status 的值为零 (0),这表示上一个命令执行成功。任何非零值表示命令执行失败。 以下是一个 csh 脚本的示例,它执…

kubernetes学习-概念3

工作负载资源 Kubernetes 提供了几个内置的 API 来声明式管理工作负载及其组件。 最终&#xff0c;你的应用以容器的形式在 Pods 中运行&#xff1b; 但是&#xff0c;直接管理单个 Pod 的工作量将会非常繁琐。例如&#xff0c;如果一个 Pod 失败了&#xff0c;你可能希望运行…

lombok 引入

lombok 依赖--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

ARCGIS网络分析

一、实验名称&#xff1a; 网络分析 二、实验目的&#xff1a; 通过本实验练习&#xff0c;掌握空间数据网络分析的基本方法。 三、实验内容和要求&#xff1a; 实验内容&#xff1a; 利用ARCGIS软件网络分析工具及相关空间数据&#xff0c;查找距离“名人故居”、“博物…

Linux-进程替换

进程程序替换目的 首先我们要知道&#xff0c;创建子进程的目的是什么&#xff1f; 想让子进程执行父进程代码的一部分想让子进程执行一个全新的代码 我们之前所写的程序&#xff0c;子进程都是在执行父进程代码的一部分&#xff0c;而要想让子进程执行全新的代码&#xff0…

Mysql 8.0主从复制模式安装(兼容Mysql 5.7)

Mysql V8.0.35安装 官网地址&#xff1a;MySQL :: Download MySQL Community Server 下载【Mysql 8.0.35】压缩包 解压压缩包&#xff0c;仅保留6个安装文件即可 mysql-community-client-8.0.31-1.el7.x86_64.rpm mysql-community-client-plugins-8.0.31-1.el7.x86_64.rpm my…

马斯克震撼演讲:我想创立一个新世界

目录 1拼多多杀入大模型领域&#xff1a;年薪百万招聘人才 2马斯克震撼演讲&#xff1a;我想创立一个新世界 3文心4.0上线首交答卷&#xff1a;百度2023Q3成色如何 1拼多多杀入大模型领域&#xff1a;年薪百万招聘人才 快科技11月22日消息&#xff0c;据国内媒体报道&#x…

Java判断字符串当中是否包含中文内容

代码如下&#xff1a; public static void main(String[] args_) throws Exception {String str1 "zhang张123";String str2 "zhang123";System.out.println(checkStringType(str1)); // 包含中文字符System.out.println(checkStringType(str2)); // 不包…

独立按键去抖动

/*----------------------------------------------- 内容&#xff1a;切换到独立按键模式&#xff0c;通过按键在数码管显示对应的数字 ------------------------------------------------*/ #include<reg52.h> //包含头文件&#xff0c;一般情况不需要改动&#xff0…

Linux C IO复用

IO复用 概述IO模型阻塞式IO非阻塞式IOIO复用select、poll、epoll异同 信号驱动式IO异步IO select函数select示例代码 poll函数poll示例代码 epoll函数创建  epoll_create注册、修改、删除  epoll_ctl轮询 I/O 事件的发生  epoll_waitepoll示例代码 基于TCP和epoll在线多人…

形态学操作—闭运算

闭运算&#xff08;Closing&#xff09;是图像形态学中的一种操作&#xff0c;它结合了膨胀&#xff08;Dilation&#xff09;和腐蚀&#xff08;Erosion&#xff09;操作。闭运算的原理是先对图像执行腐蚀操作&#xff0c;然后再进行膨胀操作。这个过程能够消除图像中的小孔洞…

OpenCV 中Mat.depth()的理解——每个像素的位数——每个像素中每个通道的精度

文章目录 1 图像深度的意义2 depth()与图像显示的映射关系2.1 CV_xS|U|FCx2.2 显示图像转换1 图像深度的意义 depth:深度,即每一个像素的位数(bits),那么我们创建的时候就可以知道根据类型也就可以知道每个像素的位数,也就是知道了创建mat的深度。这个depth() 是我们在定…

赞!优雅的Python多环境管理神器!易上手易操作!

前言 Python 的不同版本之间常常存在依赖关系和兼容性问题&#xff0c;为了方便开发人员在 不同项目中使用不同的版本 。 如果大家使用过Python版本管理工具&#xff0c;肯定大多数人使用的都是Anaconda&#xff0c;它是一个优秀的数据科学开发环境&#xff0c;本身也提供了丰…

通达信吊灯止损指标公式,根据波动幅度自动调整止盈止损

吊灯止损指标是由查克勒博(Chuck LeBeau)发明的&#xff0c;亚历山大埃尔德(Alexander Elder)在其著作《走进我的交易室》中介绍了这种止盈止损方法&#xff08;中文版翻译为倒挂式离场法则&#xff09;&#xff0c;它是根据平均真实波幅ATR设置跟踪止损。吊灯止损指标的目的是…

Redis性能压测、监控工具及优化方案

Redis是一款高性能的开源缓存数据库&#xff0c;但是在实际应用中&#xff0c;我们需要对Redis进行性能压测、监控以及优化&#xff0c;以确保其稳定性和高可用性。本文将介绍Redis性能压测、监控工具及优化方案。 01 Redis性能压测 常用的Redis性能压测工具有&#xff1a; …

909-2015-T3

文章目录 1.原题2.算法思想2.1.求树的高度2.2.求路径 3.关键代码4.完整代码5.输出结果 1.原题 试编写算法&#xff0c;求给定二叉树上从根节点到叶子节点的一条路径长度等于树的深度减一的路径&#xff08;即列出从根节点到该叶子节点的节点序列&#xff09;&#xff0c;若这样…

MQTT.js

MQTT.js mqtt.js简介MQTT测试工具mqttboxMQTTX mqtt使用mqtt引入&#xff08;方式一&#xff09;mqtt引入&#xff08;方式二&#xff09;创建mqtt客户端连接到mqtt代理订阅topic处理接收到的消息重新连接取消订阅发布消息断开连接关闭客户端MQTT APIMQTT在VUE中使用MQTT在Reac…

MySQL数据库常见错误及解决方案

“时记数据安全,共享优质资源”,数据库安全是指数据库数据的完整、真实、可靠和可用性。数据库也是一种软件系统,与其他软件系统一样也需要保护,需要采取一定的技术和一定的安全管理策略,保证数据库中的数据不被泄漏、不被破坏、不被修改或删除。本文列举MySQL数据库常见错…

“index“ should always be multi-word

vue报错&#xff1a;Component name “index” should always be multi-word 分析&#xff1a;组件名要以驼峰格式命名&#xff0c;自定义的要以loginIndex.vue等这种方式命名&#xff0c;防止和html标签冲突&#xff0c;所以命名index.vue 会报错 解决&#xff1a;在.eslint…

性能测试:系统架构性能优化思路

今天谈下业务系统性能问题分析诊断和性能优化方面的内容。这篇文章重点还是谈已经上线的业务系统后续出现性能问题后的问题诊断和优化重点。 系统性能问题分析流程 我们首先来分析下如果一个业务系统上线前没有性能问题&#xff0c;而在上线后出现了比较严重的性能问题&#x…