三维立体文字比二维平面文字显示效果更好,相对二维平面文字,它有非常好的立体显示效果。
在实际虚拟现实项目中,过多使用三维立体文字会降低染效率,加重渲染负担,相对平面二维文字,它占用的内存是非常大的。
osgText::Text3D类继承自osgText::TextBase类,继承关系图如图9-8所示。

图9-8 osgText::Text3D的继承关系图
从继承关系图可以看出它继承自 osgText::TextBase类,因此它具备普通二维文字的属性设置方法。它的方法与平面文字的创建方法基本一致,但它是有厚度的文字,并没有直接设置颜色的接口,可以通过设置材质来设置颜色。至于材质如何设置,可以参看前面的材质章节。在osgText::Text3D类中包含一个设置深度信息的函数,可以通过该函数设置立体文字的深度:
void setCharacterDepth(float characterDepth);
通过上面的说明,三维立体文字就创建了,没想到会这么简单,下面来看一个示例。
3D汉字显示(osgText::Text3D)示例的代码如程序清单9-5所示
- 1. /* 3D汉字显示示例 */
- 2. osg::ref_ptr
create3DText(const string &strDataFolder) - 3. {
- 4. osg::ref_ptr
geode = new osg::Geode(); - 5.
- 6. // 创建3D文字
- 7. osg::ref_ptr
text = new osgText::Text3D(); - 8.
- 9. text->setText(L"http://www.OsgChina.osg-OpenScenseGraph 中国官方");
- 10. string strFontPath = strDataFolder + "fonts\\simhei.ttf";
- 11. text->setFont(strFontPath);
- 12. text->setCharacterSize(60.0f);
- 13. text->setPosition(osg::Vec3(0.0, 0.0, 0.0));
- 14.
- 15. // 设置文字渲染模式
- 16. text->setRenderMode(osgText::Text3D::PER_GLYPH);
- 17.
- 18. // 设置文字深度
- 19. text->setCharacterDepth(10.0);
- 20. text->setDrawMode(osgText::Text3D::TEXT | osgText::Text3D::BOUNDINGBOX);
- 21.
- 22. // 设置文字与坐标轴对齐方式
- 23. text->setAxisAlignment(osgText::Text3D::XZ_PLANE);
- 24.
- 25. geode->addDrawable(text.get());
- 26.
- 27. // 设置材质
- 28. osg::ref_ptr
front = new osg::Material; - 29. front->setColorMode(osg::Material::AMBIENT);
- 30. front->setAlpha(osg::Material::FRONT_AND_BACK, 1);
- 31. front->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 0.0, 1.0));
- 32. front->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 0.0, 1.0));
- 33. geode->getOrCreateStateSet()->setAttributeAndModes(front.get());
- 34.
- 35. return geode.get();
- 36. }
- 37.
- 38. void osgText3D_9_5(const string &strDataFolder)
- 39. {
- 40. osg::ref_ptr
viewer = new osgViewer::Viewer(); - 41. osg::ref_ptr
traits = new osg::GraphicsContext::Traits; - 42. traits->x = 40;
- 43. traits->y = 40;
- 44. traits->width = 600;
- 45. traits->height = 480;
- 46. traits->windowDecoration = true;
- 47. traits->doubleBuffer = true;
- 48. traits->sharedContext = 0;
- 49.
- 50. osg::ref_ptr
gc = osg::GraphicsContext::createGraphicsContext(traits.get()); - 51.
- 52. osg::ref_ptr
camera = viewer->getCamera(); - 53. camera->setGraphicsContext(gc.get());
- 54. camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
- 55. GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
- 56. camera->setDrawBuffer(buffer);
- 57. camera->setReadBuffer(buffer);
- 58.
- 59. osg::ref_ptr
root = new osg::Group(); - 60.
- 61. // 添加三维文字
- 62. root->addChild(create3DText(strDataFolder));
- 63.
- 64. // 优化场景数据
- 65. osgUtil::Optimizer optimizer;
- 66. optimizer.optimize(root.get());
- 67. viewer->setSceneData(root.get());
- 68. viewer->realize();
- 69. viewer->run();
- 70. }
运行程序,截图如图 9-9 所示。

图9-9 3D汉字显示示例截图