OSG文字-显示汉字 (1)

news2025/1/9 2:16:00
  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.coloradmin.cn/o/1231046.html

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

相关文章

【C++ STL】string类-----迭代器(什么是迭代器?迭代器分哪几类?迭代器的接口如何使用?)

目录 一、前言 二、什么是迭代器 三、迭代器的分类与接口 &#x1f4a6;迭代器的分类 &#x1f4a6;迭代器的接口 &#x1f4a6;迭代器与接口之间的关联 四、string类中迭代器的应用 &#x1f4a6; 定义string类----迭代器 &#x1f4a6;string类中迭代器进行遍历 ✨be…

最强英文开源模型Llama2架构与技术细节探秘

prerequisite: 最强英文开源模型LLaMA架构探秘&#xff0c;从原理到源码 Llama2 Meta AI于2023年7月19日宣布开源LLaMA模型的二代版本Llama2&#xff0c;并在原来基础上允许免费用于研究和商用。 作为LLaMA的延续和升级&#xff0c;Llama2的训练数据扩充了40%&#xff0c;达到…

浅析ChatGPT中涉及到的几种技术点

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

C语言前瞻

文章目录 C语言基础简介编译方式分布编译示例流程一步编译 代码运行运行结果展示实际代码 C语言基础简介 关于C语言的书籍&#xff0c;文章有很多。C的历史我不赘述&#xff0c;只讲C语言的基础语法和使用&#xff0c;帮助大家入门&#xff0c;同时也是自己学习过程的一个回顾。…

Iceberg学习笔记(1)—— 基础知识

Iceberg是一个面向海量数据分析场景的开放表格式&#xff08;Table Format&#xff09;&#xff0c;其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式&#xff08;Table Format&#xff09;可以理解为元数据以及数据文件的一种组织方式&#xff0c;处于计算框架&…

开发者生态:共享知识,携手共进,共创技术辉煌

开发者生态&#xff1a;共享知识&#xff0c;携手共进&#xff0c;共创技术辉煌 在数字化时代&#xff0c;开发者是推动技术进步和创新的重要力量。他们创造着改变世界的软件和应用&#xff0c;推动着技术的边界不断向前。而在这个快速发展的时代&#xff0c;建立一个健康、活跃…

在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; …

网络参考模型与标准协议(二)-TCP/IP对等模型详细介绍

应用层 应用层为应用软件提供接口&#xff0c;使应用程序能够使用网络服务。应用层协议会指定使用相应的传输层协议&#xff0c;以及传输层所使用的端口等。TCP/IP每一层都让数据得以通过网络进行传输&#xff0c;这些层之间使用PDU ( Paket Data Unit,协议数据单元)彼此交换信…

七天.NET 8操作SQLite入门到实战 - SQLite 简介

什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个小型的C语言库的形式存在。它的设计目标是嵌入式的&#xff0c;而且已经在很多嵌入式产品中使用了它&#xff0c;它占用资源非常的低&#xff0c;在嵌入式设备中&#xff0c;可能只需要几…

openAI API简介 怎么写提示词获取更好的结果。prompt-engineering使用指南。人工智能的重大里程碑事件及技术创新chatGPT1

OpenAI API 几乎可以应用于任何任务。 包括内容或代码生成、摘要、对话、创意写作、图片生成、文本语音互转等。 关键概念 文本生成&#xff1a;提示&#xff0c;输入越精准&#xff0c;输出越精准。 获得更好结果的几种策略&#xff1a; 1.写出清晰的指令&#xff1a;包含…

YOLO目标检测——无人机航拍行人检测数据集下载分享【含对应voc、coc和yolo三种格式标签】

实际项目应用&#xff1a;智能交通管理、城市安防监控、公共安全救援等领域数据集说明&#xff1a;无人机航拍行人检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;…

【Java】异常处理(一)

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;什么都不做&#xff0c;才会来不及 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 &#x1f4cb;前…

2023下半年软件设计师考试知识点大全思维导图

软件设计师考试知识点大全思维导图 2023年下半年第一次机考 复习资料 以上是我在学习过程中根据自己的知识结构的特点及刷到的考题 做的导图&#xff0c;有需要的可以留言发原版的 mmap格式文件 方便自己拓展. 软考资料 这是网上找的资料 汇总免费放在这里 吧![ 链接&#x…

SpringBoot 整合 JdbcTemplate(配置多数据源)

数据持久化有几个常见的方案&#xff0c;有 Spring 自带的 JdbcTemplate 、有 MyBatis&#xff0c;还有 JPA&#xff0c;在这些方案中&#xff0c;最简单的就是 Spring 自带的 JdbcTemplate 了&#xff0c;这个东西虽然没有 MyBatis 那么方便&#xff0c;但是比起最开始的 Jdbc…

【Web】Ctfshow Nodejs刷题记录

目录 ①web334 ②web335 ③web336 ④web337 ⑤web338 ⑥web339 ⑦web340 ⑧web341 ⑨web342-343 ⑩web344 ①web334 进来是一个登录界面 下载附件&#xff0c;简单代码审计 表单传ctfshow 123456即可 ②web335 进来提示 get上传eval参数执行nodejs代码 payload: …

软件项目测试指南

软件测试是保证软件产品质量的重要手段之一。它是测量、评估软件产品特点和能力的活动。现在&#xff0c;国内一些软件企业对于软件测试的重视程度还很不够&#xff0c;认为测试工作非常简单&#xff0c;只是简单地操作所测的软件产品而已。这种错误的思想严重影响了国内软件质…

【深入Scrapy实战】从登录到数据解析构建完整爬虫流程

文章目录 1. 写在前面2. 抓包分析3. Scrapy提交登陆请求4. 列表与详情页面数据解析5. 中间件Middleware配置 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xf…

趣学python编程 (四、数据结构和算法介绍)

数据结构和算法在编程中非常重要。数据结构是组织和存储数据的方式&#xff0c;而算法是解决问题的方法和步骤。你要挑战的蓝桥杯&#xff0c;实际也是在设计算法解决问题。其实各种编程语言都只是工具&#xff0c;而程序的核心数据结构算法。犹如练武&#xff0c;数据结构和算…

Zotero在word中插入带超链接的参考文献/交叉引用/跳转参考文献

Zotero以其丰富的插件而闻名&#xff0c;使用起来十分的带劲&#xff0c;最重要的是它是免费的、不卡顿&#xff0c;不像某专业软件。 然而Zotero在word插入参考文献时&#xff0c;无法为参考文献添加超链接&#xff0c;这是一个不得不提的遗憾。 不过&#xff0c;有大佬已经…

C语言——写一个函数,每调用一次这个函数,就会将num的值增加1

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>void Add(int* p) {(*p); // 的优先级高于* } int main() {int num0;Add(&num);printf("第一次调用:num %d\n",num);Add(&num);printf("第二次调用:num %d\n",num);Add(&num);p…