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_LEFT
    DROP_SHADOW_CENTER_LEFT
    DROP_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.mfbz.cn/a/169453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Openlayer【二】—— 绘制不同的点、线以及给其添加监听事件

Openlayer【二】—— 绘制不同的点、线以及给其添加监听事件 接上篇&#xff1a;OpenLayer初始化 在openlayer当中&#xff0c;图层Layer与地图源Source是一对一的关系。当创建了一个图层Layer&#xff0c;相应的需要给图层添加地图源Source&#xff0c;然后将图层Layer添加到…

企业经营好不好?看看官方评价指标(适电子元、器件制造业)

一家企业经营的到底好不好&#xff1f;有没有评价标准呢&#xff1f;这里我们不妨参考一下国资委对全国各个行业的考核指标&#xff0c;对照一下自己的企业&#xff0c;就比较清楚自身企业的经营水平了。另外&#xff0c;我们也希望使用ODOO-ERP业财一体系统的企业&#xff0c;…

docker swarm集群部署

文章目录 前言一、安装docker1.1 解压1.2 配置docker 存储目录和dns1.3 添加docker.service文件1.4 docker 启动验证 二、docker swarm 集群配置2.1 关闭selinux2.2 设置主机名称并加入/etc/hosts2.3 修改各个服务器名称&#xff08;uname -a 进行验证&#xff09;2.4 初始化sw…

Java-类和类的关系

代码 总结&#xff1a; 【1】面向对象的思维&#xff1a;找参与者&#xff0c;找女孩类&#xff0c;找男孩类 【2】体会了什么叫方法的形参&#xff0c;什么叫方法的实参&#xff1a; 具体传入的内容 实参&#xff1a; 【3】类和类可以产生关系&#xff1a; &#xff08;1…

Django(九、choices参数的使用、多对多表的三种创建方式、Ajax技术)

文章目录 一、choices参数choices参数的用法choices 参数用法总结 二、MVC与MTV模式1.MVC2.MTV 三、多对多的三种创建方式1.全自动创建2.纯手动创建半自动创建 四、Django与Ajax1.什么是Ajax常见的场景Ajax案例 一、choices参数 在没有用到choices参数之前&#xff0c;我们在D…

如何科学的进行Android包体积优化

这篇文章会分享小厂如何做包体积优化相关主题&#xff0c;涉及内容包括&#xff1a;1) Android包体积优化的一种可能是比较标准的推进做法&#xff0c;2) 大致流程的心路历程和思考方式&#xff0c;3) 如何去总结和分享你们进行过的包体积优化项目。本文不仅仅是一篇分享&#…

PCIe协议加持,SD卡9.1规范达到媲美SSD的速度4GB/s

近日&#xff0c;SD协会&#xff08;SDA&#xff09;宣布了最新的SD Express存储卡的进化&#xff0c;将microSD Express存储卡的速度提高了一倍&#xff0c;达到2GB/s&#xff0c;并引入了4个新的SD Express速度等级&#xff0c;以确保新的SD 9.1规范中最低的顺序性能水平。这…

【自动驾驶解决方案】C++取整与保留小数位

一、C基础 1.1double型保留小数为&#xff0c;并以字符输出 #include <iostream> #include <sstream> #include <iomanip> // 包含std::fixedint main() {//浮点数double number 3.1415926;//转换工具类streamstd::stringstream stream;stream << s…

U-boot(三):start.S

本文主要探讨x210的uboot的start.S文件,也是uboot启动的第一阶段。 头文件 config.h config.h x210_sd.h,由mkconfig脚本生成,包含了开发板的配置宏 rootkaxi-virtual-machine:~/qt_x210v3s_160307/uboot/include# cat config.h /* Automatically generate…

LangChain 组件

输入输出模块 该模块负责与LLM做交互&#xff0c;通过该接口向模型输入 Prompt 并提取模型输出信息。主要包括&#xff1a;提示词、语言模型&#xff0c;输出解析器。 数据连接 已训练好的大语言模型&#xff0c;在训练时使用了大量的训练数据&#xff0c;但这些训练数据中可能…

Windows 下 Sublime Text 2.0.2 下载及配置

1 下载地址&#xff1a; https://www.sublimetext.com/2 Sublime Text 2.0.2 (此版本选择了 portable version)&#xff0c;直接解压就可以使用。 https://download.sublimetext.com/Sublime Text 2.0.2.zip 2 配置Python相关环境 (前提 Pyhon 已加入环境变量) 2.1 新建 py …

为什么大家都不用postman而选择 Apifox呢?

丢掉 Postman&#xff0c;Apifox 更香 作为开发者&#xff0c;丢掉 Postman 和 Jmeter吧&#xff0c;这款国产 API 工具更香&#xff0c;更安全&#xff01;一键即可导入 Postman 数据&#xff01; 一、Apifox 是什么&#xff1f; 1、Apifox 定位 Apifox Postman Swagger …

安全项目简介

安全项目 基线检查 密码 复杂度有效期 用户访问和身份验证 禁用administrator禁用guest认证失败锁定 安全防护软件操作系统安全配置 关闭自动播放 文件和目录权限端口限制安全审计… 等保测评 是否举办了安全意识培训是否有应急响应预案有无第一负责人 工作内容 测评准备…

如何判断sql注入流量特征

如何判断sql注入流量特征 以dvwa的sql注入为例 首先构造一个完整的sql注入请求包 GET /dvwa_2.0.1/vulnerabilities/sqli/?id1&SubmitSubmit HTTP/1.1 Host: 10.9.47.41 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/119.…

Jenkins自动化部署(虚拟机部署)

文章目录 一、持续集成和持续交付二、自动化部署流程三、虚拟机安装四、安装Jenkins环境4.1.安装java环境4.2. 安装Jenkins4.3.Jenkins配置 五、nginx安装和配置5.1. 安装nginx5.2.通过Linux命令创建文件夹和文件&#xff1a;5.3. 配置nginx 六、将代码上传到Git仓库七、Jenkin…

趣学python编程(六、关于蓝桥杯比赛)

蓝桥杯全国软件和信息技术专业人才大赛简称“蓝桥杯”&#xff0c;是由工业和信息化部人才交流中心举办的国内最大的信息技术竞赛。为促进中小学科技创新&#xff0c;提升中小学生逻辑思维&#xff0c;发现和培养面向未来的科技精英人才。 蓝桥杯介绍 蓝桥杯全国软件和信息技术…

【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 本章将介绍视觉SLAM的基本问题之一&#xff1a;如何描述刚体在三维空间中的运动&#xff1f; 旋转矩阵 点、向量和坐标系 三维空间由3个轴组成&…

C++数据结构:并查集

目录 一. 并查集的概念 二. 并查集的模拟实现 2.1 并查集类的声明 2.2 并查集的实现 三. 路径压缩 四. 总结 一. 并查集的概念 在生活中&#xff0c;我们经常需要对某一些事物进行归类处理&#xff0c;即&#xff1a;将N个不同的元素划分为几个互不相交的集合。在初始状态…

如何解决网站被攻击的问题:企业网络攻防的关键路径

在当今数字化时代&#xff0c;企业面临着不断升级的网络威胁&#xff0c;网站遭受攻击的风险也与日俱增。解决网站被攻击的问题对企业发展至关重要&#xff0c;不仅关系到企业的信息安全&#xff0c;也直接影响到企业的声誉和利益。从企业发展的角度出发&#xff0c;我们将探讨…

安装oracle19c卡在安装界面

我在个人window10电脑上安装 Oracle 19c 时遇到问题。解压后的数据库文件放在没有中文的文件目录下面&#xff0c;用管理员用户启动 CMD 窗口进行安装&#xff0c;但随后卡在菜单上。 取消安装之后去任务管理器中的服务里停掉OracleRemExecServiceV2服务。 用管理员运行CMD…