OSG文字-显示汉字 (1)

  1. OSG文字

        适当的文字信息对于显示场景信息是非常重要的。在 OSG中,osgText 提供了向场景中添加文字的强大功能,由于有第三方插件 FreeType 的支持,它完全支持TrueType字体。

        读者可能对 FreeType和TrueType还不太了解,下面进行具体介绍(下面的资料都来自网络,笔者觉得这样介绍会更加专业和准确)。

        TrueType是由AppleComputer 公司和Microsoft 公司联合提出的一种新型数学字形描述技术。它用数学函数描述字体轮廓外形,含有字形构造、颜色填充、数字描述函数、流程条件控制、栅格处理控制和附加提示控制等指令。TrueType 采用几何学中的二次B样条曲线及直线来描述字体的外形轮廓,其特点是:既可以用作打印字体,又可以用作屏幕显示;由于它由指令对字形进行描述,因此与分辨率无关,输出时总是按照打印机的分辨率输出;无论放大或缩小,字符总是光滑的,不会有锯齿出现;但相对 PostScript 字体来说,其质量要差一些,特别是在文字太小时,就表现得不是很清楚。

        FreeType 是一种字体服务但没有提供为实现文字布局或图形化处理这样高阶的功能使用的API(如带色文字渲染之类的)。然而,它提供一个简单、易用且统一的接口实现对多种字体文件的访问,从而大大简化了这些高级的任务。FreeType支持TrueTypeOpenType规格定义的全部字符映射。同时,它也完全有能力自动合成Type使用的Unicode字符表,这种表要求必须把一个供转换编码时使用的结束符放置在表的末尾一这在 Type 使用的格式中是很常见的(当然,如果读者需要,原始的编码方式也是可用的)。FreeType 是一个完整且有效率的 TrueType字节码解释器,这个引擎可以用很小的点产生极好的输出。由于 TrueType 规格极其令人费解且十分含糊,所以其组件想要成功完成输出是极其困难的。但无论如何我们现在已经能使Windows 的显示质量达到 Mac的水平。

    1. osgText

        在 OSG 中,为了显示高质量的文字,专门定义了一个新的名字空间来管理场景中文字的渲染,这个名字空间中的类主要用于加载字体和控制文字各种渲染属性。该空间主要包括下面几个类:

class FadeText   // 渐变文字
class Font       // 字体
class Font3D     // 3D字体
class VectorUInt // 向量单元
class String     // 字符串-用于多字节字符和各类文字编码
class Text       // 文字
class Text3D     // 3D文字
class TextBase   // 文字基类

        文字显示效果主要分为两大类,即二维平面文字和三维立体文字。osgText::Text 类负责二维平面文字的渲染,osgText::Text3D负责三维立体文字的渲染。

      1. osgText::Text

        osgText::Text类继承自osgText::TextBase类,继承关系图如图9-1所示:

图9-1 osgText:Text 的继承关系图

        从继承关系图可以看出,osgText::Text类间接继承自osg::Drawable类因此在应用程序中想把文字信息加到场景中,就要像添加一个Geometry 实例一样添加一个Geode。

        osgText::TextBase 是一个基类,定义了文字渲染的基本接口。文字的主要属性包括颜色、位置方向、大小模式、分辨率、对齐方式、输出格式、绘制模式、背景类型和颜色倾斜模式等

  • 颜色

        设置颜色可以直接调用如下成员函数

        void setColor(const osg::Vec4 &clr);

  • 位置设置

        位置可以直接调用如下成员函数

        void setPosition(const osg::Vec3 &pos);

  • 方向

        设置文字方向可以直接调用如下成员函数:

        void Text::setAxisAlignment(AxisAlignment axis);

        文字方向枚举模式如下:

enum AxisAlignment
{
XY_PLANE,             // xy面
REVERSED_XY_PLANE,    // xy面的反面
XZ_PLANE,             // xz面
REVERSED_XZ_PLANE,    // xz面的反面
YZ_PLANE,             // yz面
REVERSED_YZ_PLANE,    // yz面的反面
SCREEN,               // 屏幕
USER_DEFINED_ROTATION,// 用户自定义旋转
};
  • 大小模式

    设置大小模式可以直接调用如下成员函数:

    void setCharacterSizeMode(CharacterSizeMode mode);

    文字大小模式枚举变量如下:

enum CharacterSizeMode
{OBJECT_COORDS, // 默认模式SCREEN_COORDS, // 根据屏幕坐标自动缩放OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT // 根据视点自动缩放
};
  • 分辨率

    设置文字分辨率可以直接调用如下成员函数:

void setFontResolution(unsigned int width, unsigned int height);

        在默认的情况下,OSG为每个文字图形分配32x32个像素单元。通过改变字体纹理贴图的分辨率可以调整文字的清晰程度,通常,分辨率越大,越清晰,但是渲染负担就越大。建议在用户程序中可以清晰显示文字的情况下,默认使用最小的分辨率就可以满足需要了。

  • 对齐方式

        设置对齐方式可以直接调用如下成员函数

        void Text::setAlignment(AlignmentType alignment);

        对齐方式枚举模式如下:

enum AlignmentType
{LEFT_TOP,  //左上LEFT_CENTER,//左中LEFT_BOTTOM,/左下CENTER_TOP,//中上CENTER_CENTER,//中中CENTER BOTTOM,//中下RIGHT_TOP,//右上RIGHT_CENTER,//右中RIGHT_BOTTOM,//右下LEFT_BASE_LINE,//左基线CENTER_BASE_LINE,//中间的基线RIGHT_BASE_LINE,//右基线LEFT_BOTTOM_BASE_LINE,/左下基线CENTER_BOTTOM_BASE_LINE,//中下基线RIGHT_BOTTOM_BASE_LINE,/右下基线BASE_LINE=LEFT_BASE_LINE//default,左基线为默认方式
};
  • 输出格式

        设置输出格式可以直接调用如下成员函数

        void setLayout(Layout layout);

        文字输出格式枚举模式如下:

enum Layout
{LEFT_TO_RIGHT, // default,默认格式从左到右RIGHT_TO_LEFT, // 从右到左VERTICAL       // 垂直
};

        绘制模式

        设置绘制模式可以直接调用如下成员函数:

        void sctDrawMode(unsigned int mode);

        绘制模式枚举模式如下::

enum DrawModeMask
{TEXT = 1,       // 默认模式文字BOUNDINGBOX = 2,// 包围盒ALIGNMENT = 4   // 对齐
};
  • 背景类型

        设置背景类型可以直接调用如下成员函数:

        void setBackdropType(BackdropType type)

        背景类型枚举模式如下:

enum BackdropType
{DROP_SHADOW_BOTTOM_RIGHT=0,//款认阴影DROP_SHADOW_CENTER_RIGHT,DROP_SHADOW_TOP_RIGHT,DROP_SHADOW_BOTTOM_CENTER,DROP_SHADOW_TOP_CENTER,DROP_SHADOW_BOTTOM_LEFTDROP_SHADOW_CENTER_LEFTDROP_SHADOWTOP_LEFT,OUTLINE,NONE
}
  • 颜色倾斜模式

        设置颜色倾斜模式可以直接调用如下成员函数:

        void sctColorGradientMode(ColorGradientMode mode)

        颜色倾斜枚举模式如下:

enum ColorGradientMode
{SOLID=0,//立体,实心模式PER_CHARACTER,/每一个字OVERALL//全部
}

        从上面的介绍可以看出,文字的属性比较多,但并不是每一个都需要设置,可以选择设置,有些使用系统默认的即可。通常需要设置的有位置、内容、大小、对齐方式和颜色等。

osgText::Font

        osgText::Font类直接继承自osg::Object类,继承关系图如图9-2所示

图9-2 osgText::Font 的继承关系图

        该类主要用于对字体的管理,使用 FreeType 插件来读取字体文件,根据字体文件构建字体贴图,同时创建一个字体对象。读取字体可以用下面的函数:

        osgText:readFontFile(conststd::string &filename, const osgDB::ReaderWriter::Options *userOptions-0);

        该类在读取字体后,可以设置字体的轮廓纹理等。不过,在实际应用中,这些采用系统默认的设置就可以了,不合理的设置反而会导致文字变形等不正常的现象发生。

        在OSG中文字显示的机制是:创建一个 Font 对象读取字体文件,把 Font与对应的文字相关联,创建绘制字符串图形的纹理贴图。在文字渲染时,文字会根据该字符的形状生成纹理坐标,并为每一个字符绘制一个已添加纹理的四边形。

        在场景中添加文字的主要步骤如下:

        (1)创建一个Font字体对象,并读取字体。

        (2)创建一个osgText::Text 对象,设置文字的属性,同时关联字体,在默认情况下,系统有默认的字体。

        (3)调用 addDrawable()方法将步骤(2)创建的osgText::Text 实例对象添加到一个Geode实例,如果要多处添加文字,可以多次创建osgText::Text 对象,也可以创建多个Geode,然后逐个添加添加后再到场景中进行渲染。

        在场景中显示文字很简单,但显示中文会有一些难度,需要先将中文变成宽字符(方法有很多,如L或W2A()),字体需要使用中文字体simhei.ttf具体的方法参看第9.1.3节的示例。

​​​​​​​显示汉字示例

        显示汉字(osgText::Text示例的代码如程序清单9-1所示

1.	/****************** 显示汉字(osgText::Text)示例代码  ******************/  
2.	/// 创建文字  
3.	osg::ref_ptr<osg::Geode> createText();  
4.	  
5.	void showChineseText_9_1(const string &strDataFolder);  
6.	  
7.	/// 创建文字  
8.	osg::ref_ptr<osg::Geode> createText()  
9.	{  
10.	    osg::ref_ptr<osgText::Text> text = new osgText::Text;  
11.	    osg::ref_ptr<osgText::Font> font = new osgText::Font();  
12.	  
13.	    //读取字体  
14.	    string strFontPath = "D:\\WorkAndStudy\\SDK\\VS2013\\OSG\\Data\\font\\simhei.ttf";  
15.	    font = osgText::readFontFile(strFontPath);  
16.	  
17.	    // 设置字体文件  
18.	    text->setFont(font.get());  
19.	  
20.	    // 设置文字信息  
21.	    text->setText(L"全民实现中华民族的伟大复兴!");  
22.	  
23.	    // 设置字体大小  
24.	    text->setCharacterSize(0.5f);  
25.	    text->setAutoRotateToScreen(true);  
26.	  
27.	    // 设置字体颜色  
28.	    text->setColor(osg::Vec4(1.0f, 0.0, 0.0, 1.0));  
29.	  
30.	    // 设置显示的位置  
31.	    osg::Vec3f position = osg::Vec3f(0.0, -10.0, 0.0);  
32.	    text->setPosition(position);  
33.	  
34.	    // 设置对齐方式  
35.	    text->setAlignment(osgText::Text::CENTER_TOP);  
36.	  
37.	    // 设置旋转方式  
38.	    text->setAxisAlignment(osgText::Text::SCREEN);  
39.	  
40.	    // 添加到叶节点中  
41.	    osg::ref_ptr<osg::Geode> geode = new osg::Geode();  
42.	  
43.	    geode->addDrawable(text.get());  
44.	  
45.	    return geode.get();  
46.	}  
47.	  
48.	void showChineseText_9_1(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 = new osg::Camera;  
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.	    viewer->addSlave(camera.get());  
70.	  
71.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
72.	  
73.	    // 创建文字  
74.	    osg::ref_ptr<osg::Geode> node = createText();  
75.	    root->addChild(node.get());  
76.	  
77.	    // 优化场景数据  
78.	    osgUtil::Optimizer optimizer;  
79.	    optimizer.optimize(root.get());  
80.	      
81.	    viewer->setSceneData(root.get());  
82.	  
83.	    viewer->realize();  
84.	    viewer->run();  
85.	}  

      

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

图9-3显示汉示例截图

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

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

相关文章

在windows Server安装Let‘s Encrypt的SSL证书

1、到官网&#xff08;https://certbot.eff.org/instructions?wswebproduct&oswindows&#xff09;下载 certbot客户端。 2、安装客户端&#xff08;全部默认安装即可&#xff09; 3、暂停IIS中的网站 开始菜单中找到并运行“Certbot”&#xff0c;输入指令&#xff1a; …

新一代车载以太网传输技术研讨会(AEM)顺利圆满举行

时间定格在2023年11月17日&#xff0c;新一代车载以太网传输技术研讨会在东莞国际会展中心举行。来自相关的的企业几百家。当然&#xff0c;深圳维信仪器作为主办方&#xff08;AEM线束测试仪中国区总平台&#xff09;举优质的线束测试设备&#xff0c;不论是手持线束测试&…

苹果(Apple)公司的新产品开发流程(一)

目录 简介 ANPP CSDN学院推荐 作者简介 简介 苹果这家企业给人的长期印象就是颠覆和创新。 而流程跟创新似乎是完全不搭边的两个平行线&#xff1a; 流程是一个做事的标准&#xff0c;定义了权力的边界&#xff0c;对应人员按章办事&#xff1b;而创新的主旋律是发散&am…

实时监控电脑屏幕的软件丨同时查看12台电脑屏幕

Hello 大家好 又见面啦 今天给大家推荐两款比较实用的监控电脑使用情况、屏幕的软件&#xff01; 软件一 实时性能监控 从软件名就可以看出来&#xff0c;这是一款电脑性能监测工具。它可以实时监测内存、CPU、磁盘占用情况&#xff0c;也能一键结束进程&#xff0c;给电脑提…

【zabbix监控三】zabbix之部署代理服务器

一、部署代理服务器 分布式监控的作用&#xff1a; 分担server的几种压力解决多机房之间的网络延时问题 1、搭建proxy主机 1.1 关闭防火墙&#xff0c;修改主机名 systemctl disbale --now firewalld setenforce 0 hostnamectl set-hostname zbx-proxy su1.2 设置zabbix下…

BP神经网络原理与如何实现BP神经网络

本文部分图文来自《老饼讲解-BP神经网络》bp.bbbdata.com 目录 一、BP神经网络的背景生物学原理 二、BP神经网络模型 2.1 BP神经网络的结构 2.2 BP神经网络的激活函数 三、BP神经网络的误差函数 四、BP神经网络的训练 4.1 BP神经网络的训练流程 4.2 BP神经网络的训练流…

【运维篇】5.6 Redis server 主从复制配置

文章目录 0. 前言1. 配置方式步骤1: 准备硬件和网络步骤2: 安装Redis步骤3: 配置主服务器的Redis步骤4: 配置从服务器的Redis步骤5: 测试复制功能步骤6: 监控复制状态 2. 参考文档 0. 前言 在Redis运维篇的第5.6章节中&#xff0c;将讨论Redis服务器的主从复制配置。在开始之前…

如何实现MATLAB与Simulink的数据交互

参考链接&#xff1a;如何实现MATLAB与Simulink的数据交互 MATLAB是一款强大的数学计算软件&#xff0c;Simulink则是一种基于模型的多域仿真平台&#xff0c;常用于工程和科学领域中的系统设计、控制设计和信号处理等方面。MATLAB和Simulink都是MathWorks公司的产品&#xff0…

数据结构【DS】图的应用

图的连通性问题 最少边数 最多边数 无向图非连通 &#x1d48e;&#x1d7ce; &#x1d48e;&#x1d48f;−&#x1d7d0;∗(&#x1d48f;−&#x1d7cf;)/&#x1d7d0; 无向图连通 &#x1d48e;&#x1d48f;−&#x1d7cf; &#x1d48e;&#x1d48f;∗(&#…

在Sprinng Boot中使用Redis充当缓存

关于我们使用EhCache可以适应很多的应用场景了&#xff0c;但是因为EhCache是进程内的缓存框架&#xff0c;在集群模式下&#xff0c;我们在我们的应用服务器或者云服务器之间的缓存都是独立的。故而在不同的服务器之间的进程会存在缓存不一致的情况&#xff0c;就算我们的EhCa…

word批量图片导出wps office word 图片批量导出

word批量导出图片教程 背景 今天遇到了一个场景&#xff0c;因为word里的图片打开看太模糊了&#xff0c;如果一个一个导出来太麻烦。想批量将word中的图片全部导出 但是&#xff0c;wps导出的时候需要会员 教程开始&#xff1a; 将word保存为 .docx 格式&#xff0c;可以按F1…

Golang 协程、主线程

Go协程、Go主线程 原先的程序没有并发和并行的概念&#xff0c;没有多核的概念&#xff0c;就是一个进程打天下。后面发现这个效率太低了&#xff0c;就搞出了线程&#xff0c;这样极大的发挥CPU的效率&#xff0c;因为硬件总是比软件发展的快。 现在go考虑的是能不能让多核cp…

【数据结构】C语言实现队列

目录 前言 1. 队列 1.1 队列的概念 1.2 队列的结构 2. 队列的实现 2.1 队列的定义 2.2 队列的初始化 2.3 入队 2.4 出队 2.5 获取队头元素 2.6 获取队尾元素 2.7 判断空队列 2.8 队列的销毁 3. 队列完整源码 Queue.h Queue.c &#x1f388;个人主页&#xff1a…

【数据结构】树与二叉树(廿一):树和森林的遍历——先根遍历(递归算法PreOrder、非递归算法NPO)

文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语 5.2 二叉树5.3 树5.3.1 树的存储结构1. 理论基础2. 典型实例3. Father链接结构4. 儿子链表链接结构5. 左儿子右兄弟链接结构 5.3.2 获取结点的算法5.3.3 树和森林的遍历1. 先根遍历&#xff08;递归&am…

<b><strong>,<i><em>标签的区别

1. b标签和strong标签 b标签&#xff1a;仅仅是UI层面的加粗样式&#xff0c;并不具备HTML语义 strong标签&#xff1a;不仅是在UI层面的加粗样式&#xff0c;具备HTML语义&#xff0c;表示强调 2. i标签和em标签 i 标签&#xff1a;仅仅是UI层面的斜体样式&#xff0c;并不…

HTML5学习系列之实用性标记

HTML5学习系列之实用性标记 前言实用性标记高亮显示进度刻度时间联系信息显示方向换行断点标注 总结 前言 学习记录 实用性标记 高亮显示 mark元素可以进行高亮显示。 <p><mark>我感冒了</mark></p>进度 progress指示某项任务的完成进度。 <p…

(c语言进阶)内存函数

一.memcpy(void* dest,void* src,int num) &#xff0c;操作单位为字节&#xff0c;完成复制且粘贴字符串 1.应用 #include <stdio.h> #include<string.h> int main() {int arr1[] { 1,2,3,4,5,6,7,8,9,10 };int arr2[20] { 0 };memcpy(arr2, arr1, 20);//从…

Linux - 用户级缓冲区和系统缓冲区 - 初步理解Linux当中文件系统

前言 文件系统 我们先来看两个例子&#xff1a; 这个程序输出&#xff1a; 此时的输出也满足的我们预期。 我们也可以把 程序执行结果&#xff0c;输出重定向到 一个文件当中: 当我们在代码的结尾处&#xff0c;创建了子进程&#xff0c;那么输出应该还是和上述是一样的&…

Day35力扣打卡

打卡记录 相邻字符不同的最长路径&#xff08;树状DP&#xff09; 链接 若节点也存在父节点的情况下&#xff0c;传入父节点参数&#xff0c;若是遍历到父节点&#xff0c;直接循环里 continue。 class Solution:def longestPath(self, parent: List[int], s: str) -> in…

基于Vue+SpringBoot的医院门诊预约挂号系统 开源项目

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…