OSG文字-渐变文字(4)

news2024/7/2 3:46:12

        渐变文字(osgText::FadeText类)继承自osgText::Text类继承关系图如图9-6所示

图9-6 osgText::FadeText的继承关系图

        从继承关系图中可以看出,它继承自osgText::Text类,因此,它具备一般文字属性的设置方法这里不再重复说明。创建渐变文字与一般的文字没有很大的区别,只是它创建的是 osgText:FadeText类的实例对象。同时,它还需要设置拣选回调(setCullCallback)为聚集筛选(osg::ClusterCullingCallback), 聚集筛选是一种类似于背面筛选的场景筛选方法,但是它可以将多个对象组合起来并进行统一的背面筛选,代码如下:

        osgText::FadeText* text = new osgText::FadeText();

        text->setCullCallback(new osg::ClusterCullingCallback(pos,normal,0.0));

        渐变文字在制作三维地图时非常有用,能够达到很好的渐变效果。尤其是由一个概览到局部细节时,显示效果是非常不错的。

​​​​渐变文字示例

        渐变文字(osgText::FadeText)示例的代码如程序清单9-4所示:

1.	/* 渐变文字示例 osgText::FadeText */  
2.	// 创建文字  
3.	osg::ref_ptr<osgText::Text> createText(const string &strDataFolder, const std::string &str, osg::Vec3 pos)  
4.	{  
5.	    // 创建渐变文字对象  
6.	    osg::ref_ptr<osgText::FadeText> text = new osgText::FadeText();  
7.	  
8.	    // 设置筛选回调  
9.	    osg::Vec3 normal(0.0, 0.0, 1.0);  
10.	  
11.	    // 设置为聚集筛选,一种类似于背面筛选的场景筛选方法,但是它可以将多个对象组合起来并进行统一的背面筛选  
12.	    text->setCullCallback(new osg::ClusterCullingCallback(pos, normal, 0.0));  
13.	  
14.	    text->setText(str);  
15.	    string strFontPath = strDataFolder + "font\\arial.ttf";  
16.	    text->setFont(strFontPath);  
17.	    text->setPosition(pos);  
18.	    text->setCharacterSize(300.0);  
19.	      
20.	    // 设置字体大小的模式  
21.	    text->setCharacterSizeMode(osgText::Text::OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT);  
22.	    text->setAutoRotateToScreen(true);  
23.	  
24.	    return text.get();  
25.	}  
26.	  
27.	// 创建渐变文字  
28.	osg::ref_ptr<osg::Node> createFadeText(const string &strDataFolder)  
29.	{  
30.	    osg::ref_ptr<osg::Group> group = new osg::Group;  
31.	  
32.	    // 关闭深度测试  
33.	    group->getOrCreateStateSet()->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);  
34.	  
35.	    osg::ref_ptr<osg::Geode> geode = new osg::Geode;  
36.	    group->addChild(geode.get());  
37.	  
38.	    // 设置TEXT  
39.	    std::vector<std::string> textList;  
40.	    for (int i = 1; i < 11; ++i)  
41.	    {  
42.	        textList.push_back(std::to_string(i));  
43.	    }  
44.	  
45.	    int numX = 200;  
46.	    int delta = 10;  
47.	  
48.	    // 添加Drawable  
49.	    int t = 0;  
50.	    for (int i = 100; i < numX; i += delta, ++t)  
51.	    {  
52.	        geode->addDrawable(createText(strDataFolder, textList[t%textList.size()], osg::Vec3(0, i, 100)));  
53.	    }  
54.	  
55.	    return group.get();  
56.	}  
57.	  
58.	// 渐变文字示例  
59.	void fadeText_9_4(const string &strDataFolder)  
60.	{  
61.	    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();  
62.	    osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;  
63.	    traits->x = 40;  
64.	    traits->y = 40;  
65.	    traits->width = 600;  
66.	    traits->height = 480;  
67.	    traits->windowDecoration = true;  
68.	    traits->doubleBuffer = true;  
69.	    traits->sharedContext = 0;  
70.	  
71.	    osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());  
72.	  
73.	    osg::ref_ptr<osg::Camera> camera = viewer->getCamera();  
74.	    camera->setGraphicsContext(gc.get());  
75.	    camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));  
76.	    GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;  
77.	    camera->setDrawBuffer(buffer);  
78.	    camera->setReadBuffer(buffer);  
79.	  
80.	    osg::ref_ptr<osg::Group> root = new osg::Group();  
81.	  
82.	    // 加入渐变文字  
83.	    root->addChild(createFadeText(strDataFolder));  
84.	  
85.	    // 读取地形模型  
86.	    string strDataPath = strDataFolder + "lz.osg";  
87.	    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile(strDataPath);  
88.	    root->addChild(node.get());  
89.	  
90.	    // 优化场景数据  
91.	    osgUtil::Optimizer optimizer;  
92.	    optimizer.optimize(root.get());  
93.	    viewer->setSceneData(root.get());  
94.	    viewer->realize();  
95.	    viewer->run();  
96.	}  

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

图9-7渐变文字示例截图

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

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

相关文章

Python通过selenium调用IE11浏览器报错解决方法

前提 正常安装Python 工具&#xff0c;selenium 包可以正常导入。IE浏览器驱动 IEDriverServer.exe 已经正确放置到已经添加path目录的文件下。 报错现象&#xff1a; 解决方法 打开浏览器进入 internet 选项 切换到安全页签 &#xff0c;去除“应用保护模式” 再次调用验证…

进程API

linux下进程的api forkwaitexec fork #include <stdio.h> #include <stdlib.h> #include <unistd.h>/* linux环境运行 子进程并不是完全拷贝了父进程。具体来说&#xff0c;虽然它拥有自己的 地址空间&#xff08;即拥有自己的私有内存&#xff09;、寄存器…

2018-2022年富时罗素 ESG评分数据

2018-2022年富时罗素 ESG评分数据 1、时间&#xff1a;2018-2022年 2、指标&#xff1a;证券代码、证券简称、富时罗素ESG评分、 3、说明&#xff1a; 富时罗素ESG评级体系评估了中国大陆、香港、欧洲以及美国等市场上1800家中国上市企业股票&#xff0c;评估了7200多种证券…

LangChain库简介

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

【10套模拟】【8、9】

关键字&#xff1a; 建立有序单链表、多维数组是特殊线性结构、直接选择排序、哈夫曼树高度及wpl、中序最后叶子先序最后也是、堆是完全二叉树、分块查找 统计二叉树结点数、统计二叉树值和、奇偶数划分、判断链表是否递增

docker报错standard init linux.go:228 exec user process caused: exec format error

1、报错 使用Dockerfile自己做的服务镜像&#xff0c;docker run时启动失败&#xff0c;报错如下&#xff1a; standard init linux.go:228 exec user process caused: exec format error2、原因一 当前服务器的CPU架构和构建镜像时的CPU架构不兼容。比如做镜像是在arm机器下…

2020年计网408

第33题 下图描述的协议要素是&#xff08; &#xff09;。I. 语法 II. 语义 III. 时序 A. 仅 I B. 仅 II C. 仅 III D. I、II 和 III 本题考察网络协议三要素的相关知识。 网络协议的三要素分别是语法、语义、同步&#xff08;时序&#xff09;。语法&#xff1a;定义收发双…

IPFoxy:什么是数据中心代理IP?好用吗?

数据中心代理是代理IP中最常见的类型&#xff0c;也被称为机房IP。这些代理服务器为用户分配不属于 ISP&#xff08;互联网服务提供商&#xff09;而来自第三方云服务提供商的 IP 地址。数据中心代理的最大优势——它们允许在访问网络时完全匿名。 如果你正在寻找海外代理IP&am…

力扣:175. 组合两个表(Python3)

题目&#xff1a; 表: Person ---------------------- | 列名 | 类型 | ---------------------- | PersonId | int | | FirstName | varchar | | LastName | varchar | ---------------------- personId 是该表的主键&#xff08;具有唯一值的列&#…

Raspberry Pi 5 新一代单板计算机:树莓派5代 (介绍、入门、解疑)

树莓派5代正式发布后&#xff0c;硬件和性能的全面升级让众多开发者们都想入手感受一波&#xff0c;外观上Raspberry Pi 5 与前代产品非常相似&#xff0c;不过&#xff0c;在保留信用卡大小的整体尺寸的同时&#xff0c;也更新了一些设计元素&#xff0c;以适应新芯片组的功能…

【c++】——类和对象(下) 万字解答疑惑

作者:chlorine 专栏:c专栏 目录 &#x1f6a9;再谈构造函数 &#x1f393;构造函数体赋值 &#x1f393;初始化列表 &#x1f6a9;explicit关键字 &#x1f6a9;static成员 &#x1f393;概念 面试题&#xff1a;计算创建多少个类对象 &#x1f393;特性 【问题】(非)…

机器学习实战第1天:鸢尾花分类任务

专栏介绍 欢迎订阅专栏——机器学习实战 机器学习实战_Nowl的博客-CSDN博客 纸上得来终觉浅 本专栏项目将着重于解决各类实际机器学习问题&#xff0c;带你上手各种场景的实际问题 数据集可以在我的资源中找到&#xff0c;也可以自行搜索 文中导入数据集的路径要改成自己的…

大图书馆 #9 《流计算系统图解》书评

上周&#xff0c;我收到清华大学出版社编辑寄来的新书《流计算系统图解》。趁着周末的功夫&#xff0c;我快速浏览了本书的主要内容。一句话评价&#xff1a;值得一读&#xff0c;尤其是对开始开发流计算任务或系统一到两年&#xff0c;初步实现过一些功能或作业&#xff0c;但…

【LeetCode刷题】-- 29.两数相除

29.两数相除 思路&#xff1a; class Solution {public int divide(int dividend, int divisor) {//考察被除数为最小值的情况if(dividend Integer.MIN_VALUE){//被除数为最小值&#xff0c;除数是1&#xff0c;返回最小值if(divisor 1){return Integer.MIN_VALUE;}//除数是-…

Java注解(Annotation)的基本知识

Java注解(Annotation)的基本知识 此文的目的只在于了解的注解的基本知识&#xff0c;知道注解的一些概念&#xff0c;使能够看懂注解的使用。 注解概述 Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;使 JDK5.0 引入的一种注释机制。Java 语言中的…

ChatGPT 也并非万能,品牌如何搭上 AIGC「快班车」

内容即产品的时代&#xff0c;所见即所得&#xff0c;所得甚至超越所见。 无论是在公域的电商平台、社交媒体&#xff0c;还是品牌私域的官网、社群、小程序&#xff0c;品牌如果想与用户发生连接&#xff0c;内容永远是最前置的第一要素。 01 当内容被消费过&#xff0c;就…

PC访问华为昇腾开发板的摸索过程

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> 最近要折腾华为昇腾开发板&#xff08;官方名称叫&#xff1a;Atlas 200I DK&#xff09;。先是按照官方教程折腾&#xff1a;Atlas200DK环境部署。我发现…

【bug 回顾】上传图片超时

测试 bug 问题分析 - 上传图片超时 最近在测试上遇到一个莫名奇妙的问题&#xff0c;最后也没有得到具体是哪块的原因&#xff0c;看各位大佬有没有思路&#xff1f;&#xff1f; 一 、背景 现在我们有三台服务器&#xff0c;用来布两套环境。其中另外一台服务器3配置的 tom…

邦永PM2项目管理系统 SQL注入漏洞复现

0x01 产品简介 邦永PM2项目管理系统科学地将项目管理思想和方法和谐、统一&#xff0c;使得长期以来困扰项目管理工作者的工期、进度、投资和成本情况无法整体动态管理的问题得到了全面而彻底的解决。 0x02 漏洞概述 邦永科技PM2项目管理平台Global_UserLogin.aspx接口处未对用…

打不开clickonce问题解决过程

1.用户电脑user文件夹下有xx和xx.1两个账户,原先安装在xx账户下,后修了电脑原数据保留在xx.1,新创建XX,之后clickonce就打不开了表现为没有反应,,删除注册表和appdata都只能正常安装,但是不能打开,没有任何报错,发现在我的电脑下打开有这样的提示,,在用户电脑上没有 尝试通过修…