OSG文字-渐变文字(4)

        渐变文字(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.mfbz.cn/a/177215.html

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

相关文章

【JavaEE】Spring更简单的存储和获取对象(类注解、方法注解、属性注入、Setter注入、构造方法注入)

一、存储Bean对象 在这篇文章中我介绍了Spring最简单的创建和使用&#xff1a;Spring的创建和使用 其中存储Bean对象是这样的&#xff1a; 1.1 配置扫描路径 想要成功把对象存到Spring中&#xff0c;我们需要配置对象的扫描包路径 这样的话&#xff0c;就只有被配置了的包…

详解Python中哈希表的使用。站在开发者角度,与大家一起探究哈希的世界。

文章目录 1. 前言2. 哈希表2.1 哈希函数2.2 哈希算法2.3 常见哈希算法2.4 哈希冲突 3.总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面…

【数据库】数据库中的备份与恢复,保障容灾时的数据一致性与完整性

数据库的备份机制 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#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;}//除数是-…

2023年亚太杯数学建模思路 - 案例:粒子群算法

文章目录 1 什么是粒子群算法&#xff1f;2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法&#xff1f; 粒子群算法&#xff08;Pa…

阿里云跨账号建立局域网

最近有活动&#xff0c;和好友一并薅了下阿里云的羊毛。琢磨着两台机器组一个局域网&#xff0c;于是有了这个需求&#xff0c;把步骤记录一下&#xff1a; 假设两台机器叫A和B&#xff0c;我们开始进行建立和组网 1. 建立ECS 把A机器公共环境装好&#xff0c;然后使用《实例与…

ROSNS3(一)

https://github.com/malintha/rosns3 第一步&#xff1a;clone和构建rosns3客户端 第二步&#xff1a;运行 最详细的ubuntu 安装 docker教程 - 知乎 1. unable to find source space /home/muta/src 解决方法&#xff1a; 将副将将碰到的bug&#xff0c;解决方法_#include &…

【蓝桥杯省赛真题45】Scratch九宫格游戏 蓝桥杯scratch图形化编程 中小学生蓝桥杯省赛真题讲解

目录 scratch九宫格游戏 一、题目要求 编程实现 二、案例分析 1、角色分析

csdn最新最全pytest系列——pluggy插件源码解读(一)HookspecMarker类和HookimplMarker类分析

简介 pluggy是一个非常优秀的插件系统&#xff0c;它是理解pytest的核心&#xff0c;只有理解了pluggy的原理&#xff0c;才能更好的理解和使用pytest&#xff0c;否则见到了pytest的很多应用都会感觉很难理解 pluggy插件总共的代码量不足一千行&#xff0c;而实现的功能却是…

909-2015-T3

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

解决 VSCode 配置远程连接,过程试图写入的管道不存在

解决 VSCode 配置远程连接&#xff0c;过程试图写入的管道不存在

【数据结构】链表中二级指针的应用

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 (注:为方便演示本篇使用的x86系统,因此指针的大小为4个字节) 目录 &#x1f4cc;形参的改变不影响实参! 1.调用函数更改整型时传值调用与传址调用的区别 &#x1f38f;传值…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了&#xff0c;是一款现在非常主流的自动化测试工具&#xff0c;包括了web、api、APP&#xff0c;甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件&#xff0c;swagger是一个规范和完整的框架&a…

【数据库】数据库中的检查点Checkpoint,数据落盘的重要时刻

检查点(checkpoint) ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

PostMan接口测试教程

1、下载和安装 Postman: 前往 Postman 官网 &#xff08;https://www.postman.com&#xff09;&#xff0c;下载适用于你的操作系统的 Postman 客户端。 执行下载后的安装程序&#xff0c;并按照安装向导的指引完成安装过程。 2、创建一个新的集合&#xff1a; 打开 Postma…

LangChain库简介

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

那仰望的人

心底的孤独和叹息

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

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

数组扩展方法(一)

Array.prototype.forEach MDN解释forEach()方法是对数组的每个元素执行一个给定的函数&#xff0c;换句话来说就是在调用forEach()方法的时候&#xff0c;需要传入一个回调函数callback&#xff0c;循环每个数组内部元素时都会执行一次传入的回调函数callback forEach()方法的…

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

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