渐变文字(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渐变文字示例截图