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.mzph.cn/news/159971.shtml

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

相关文章

PHP 安装

您需要做什么&#xff1f; 为了开始使用 PHP&#xff0c;您可以&#xff1a; 找一个支持 PHP 和 MySQL 的 Web 主机在您自己的 PC 机上安装 Web 服务器&#xff0c;然后安装 PHP 和 MySQL 使用支持 PHP 的 Web 主机 如果您的服务器支持 PHP&#xff0c;那么您不需要做任何事情…

​软考-高级-系统架构设计师教程(清华第2版)【第14章 云原生架构设计理论与实践(P496~526)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第14章 云原生架构设计理论与实践&#xff08;P496~526&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

Java排序实战:如何高效实现电商产品排序

在当今的数字化时代&#xff0c;电子商务已成为人们日常生活的重要组成部分。消费者可以在电商平台上浏览和购买来自全球的商品&#xff0c;这无疑为我们的生活带来了极大的便利。然而&#xff0c;随着电商平台的规模不断扩大&#xff0c;商品数量的急剧增加&#xff0c;如何对…

[点云分割] 区域增长分割

效果&#xff1a; 原始数据 分割结果 代码&#xff1a; #include <iostream> #include <vector> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> // 各种点云数据类型 #include <pcl/search/search.h> #include <pcl/search/kdtr…

Vue3 官推的状态管理 Pinia

Vue3 官推的状态管理 Pinia 一、Pinia是什么&#xff1f;二、Pinia的特点三、Pinia的使用1.npm install pinia -s2.创建pinia实例3.注册到App实例上4.模块化管理5.组件中使用6.路由中使用1.创建全局路由守卫2.全局守卫中使用全局状态 四、修改数据 $patch五、重置数据 $reset六…

《C++ Primer》第9章 顺序容器(一)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 C 中的容器可以分为 3 类&#xff1a;顺序容器、关联容器、无序关联容器。 9.1 顺序容器概述&#xff08;P292&#xff09; 所有顺序容器都提供了快速顺序访问的能力&#xff0c;但在以下方面的性能有所不…

【考研】数据结构(更新到双链表)

声明&#xff1a;所有代码都可以运行&#xff0c;可以直接粘贴运行&#xff08;只有库函数没有声明&#xff09; 线性表的定义和基本操作 基本操作 定义 静态&#xff1a; #include<stdio.h> #include<stdlib.h>#define MaxSize 10//静态 typedef struct{int d…

Semaphore使用acquire和tryAcquire方法案例

Semaphore(信号量)可以用来控制同时访问特定资源的线程数量 acquire()方法&#xff1a; 当使用acquire()方法时&#xff0c;如果没有或许到许可证就会被堵塞&#xff0c;直至获得了许可证。 tryAcquire()方法&#xff1a; 当使用tryAcquire()方法时&#xff0c;如果没有获取…

Redis入门指南学习笔记(3):Redis高级特性

一.前言 上一篇博客对Redis常用的数据结构进行了详细介绍。Redis除了丰富的数据类型支持&#xff0c;还包含许多高级特性&#xff0c;例如事务、内存驻留策略、排序、消息队列等&#xff0c;本文将对这些进行逐一介绍。 二.事务 Redis同样包含事务&#xff08;transaction&a…

Vue2系列 — 渲染函数 (render + createElement)

官网文档&#xff1a;https://v2.cn.vuejs.org/v2/guide/render-function.html 1 render 函数 render 函数 不使用模板&#xff0c;使用 js 生成虚拟 dom 2 createElement() 接受的参数&#xff1a; 参数1 节点类型参数2 attribute参数3 子节点 3 DEMO <template>&…

git 泄露

得到flag有两种方法&#xff1a; 1、版本比对&#xff1a;git diff 用法&#xff1a;git diff <分支名1> <分支名2> 2、版本回退&#xff1a;git reset 用法&#xff1a;git reset --hard <分支名> python2 GitHack.py http://www.example.com/.git/ g…

AppLink结合金蝶云星空作订单信息同步流程

此次通过AppLink&#xff0c;根据请求数据金蝶云星空做销售订单信息同步拉取 在获取订单信息前需要得到金蝶云星空授权&#xff0c;详细授权步骤可查看&#xff1a;金蝶云星空授权指南 根据请求数据在金蝶云星空保存销售订单 当webhook接收到数据时触发流程 步骤1&#xff…

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

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

oracle数据库常见巡检脚本-系列一

简介 作为数据库管理员&#xff08;DBA&#xff09;&#xff0c;定期进行数据库的日常巡检是非常重要的。以下是一些原因&#xff1a; 保证系统的稳定性&#xff1a;通过定期巡检&#xff0c;DBA可以发现并及时解决可能导致系统不稳定的问题&#xff0c;如性能瓶颈、资源利用率…

MATLAB对比两txt文件内容是否一致

实现功能 对比两txt每行的内容是否一致&#xff0c;若一致则输出’完全一致’&#xff0c;不一致则输出’第 %d 行不一致’;若行数不等则输出’文件1比文件2少/多%d行’ MATLAB代码 注意修改代码中txt文件名 clear all;close all;clc; %清理工作区&#xff0c;关闭所有窗口…

详解自动化之单元测试工具Junit

目录 1.注解 1.1 Test 1.2 BeforeEach 1.3 BeforeAll 1.4 AfterEach 1.5 AfterAll 2. 用例的执行顺序 通过 order() 注解来排序 3. 参数化 3.1 单参数 3.2 多参数 3.3 多参数(从第三方csv文件读取数据源) 3.4 动态参数ParameterizedTest MethodSource() 4. 测试…

this的指向问题

1、script 全局环境下 this指向window console.log(this)//window 2、函数直接调用 this代表window ,函数内部开启严格模式, this 指向 undefined use strict 开启严格模式 function f(){console.log(this)} f()//window 开启严格模式 function f(){//严格…

SolidWorks快捷键

SolidWorks快捷键 SolidWorks快捷键1.Windows通用类2.视图、模型移动操作类3.设计树操作类4.草图类5.选择过滤类6.装配相关快捷键7.重画重建类8.其他F类快捷键9.其他快捷键 SolidWorks快捷键 SolidWorks快捷键可在软件里自行设置&#xff0c;自定义鼠标笔势&#xff0c;这里列…

机器学习第12天:聚类

文章目录 机器学习专栏 无监督学习介绍 聚类 K-Means 使用方法 实例演示 代码解析 绘制决策边界 本章总结 机器学习专栏 机器学习_Nowl的博客-CSDN博客 无监督学习介绍 某位著名计算机科学家有句话&#xff1a;“如果智能是蛋糕&#xff0c;无监督学习将是蛋糕本体&a…

已发表的paper

文章目录 2019202120222023 2019 基于改进权重映射的高分辨率遥感影像建筑实例分割 2021 HA U-Net: Improved Model for Building Extraction From High Resolution Remote Sensing Imagery (SCI) 地块尺度的山区耕地精准提取方法 &#xff08;EI&#xff09; 2022 基于深…