• OSG文字-osgText3D(5)


    osgText3D

            三维立体文字比二维平面文字显示效果更好,相对二维平面文字,它有非常好的立体显示效果。

            在实际虚拟现实项目中,过多使用三维立体文字会降低染效率,加重渲染负担,相对平面二维文字,它占用的内存是非常大的。

     osgText::Text3D

            osgText::Text3D类继承自osgText::TextBase类,继承关系图如图9-8所示。

    图9-8 osgText::Text3D的继承关系图

            从继承关系图可以看出它继承自 osgText::TextBase类,因此它具备普通二维文字的属性设置方法。它的方法与平面文字的创建方法基本一致,但它是有厚度的文字,并没有直接设置颜色的接口,可以通过设置材质来设置颜色。至于材质如何设置,可以参看前面的材质章节。在osgText::Text3D类中包含一个设置深度信息的函数,可以通过该函数设置立体文字的深度:

            void setCharacterDepth(float characterDepth);

            通过上面的说明,三维立体文字就创建了,没想到会这么简单,下面来看一个示例。

    ​​​​​​​ 3D汉字显示示例

            3D汉字显示(osgText::Text3D)示例的代码如程序清单9-5所示

    1. 1. /* 3D汉字显示示例 */
    2. 2. osg::ref_ptr create3DText(const string &strDataFolder)
    3. 3. {
    4. 4. osg::ref_ptr geode = new osg::Geode();
    5. 5.
    6. 6. // 创建3D文字
    7. 7. osg::ref_ptr text = new osgText::Text3D();
    8. 8.
    9. 9. text->setText(L"http://www.OsgChina.osg-OpenScenseGraph 中国官方");
    10. 10. string strFontPath = strDataFolder + "fonts\\simhei.ttf";
    11. 11. text->setFont(strFontPath);
    12. 12. text->setCharacterSize(60.0f);
    13. 13. text->setPosition(osg::Vec3(0.0, 0.0, 0.0));
    14. 14.
    15. 15. // 设置文字渲染模式
    16. 16. text->setRenderMode(osgText::Text3D::PER_GLYPH);
    17. 17.
    18. 18. // 设置文字深度
    19. 19. text->setCharacterDepth(10.0);
    20. 20. text->setDrawMode(osgText::Text3D::TEXT | osgText::Text3D::BOUNDINGBOX);
    21. 21.
    22. 22. // 设置文字与坐标轴对齐方式
    23. 23. text->setAxisAlignment(osgText::Text3D::XZ_PLANE);
    24. 24.
    25. 25. geode->addDrawable(text.get());
    26. 26.
    27. 27. // 设置材质
    28. 28. osg::ref_ptr front = new osg::Material;
    29. 29. front->setColorMode(osg::Material::AMBIENT);
    30. 30. front->setAlpha(osg::Material::FRONT_AND_BACK, 1);
    31. 31. front->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 0.0, 1.0));
    32. 32. front->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0, 1.0, 0.0, 1.0));
    33. 33. geode->getOrCreateStateSet()->setAttributeAndModes(front.get());
    34. 34.
    35. 35. return geode.get();
    36. 36. }
    37. 37.
    38. 38. void osgText3D_9_5(const string &strDataFolder)
    39. 39. {
    40. 40. osg::ref_ptr viewer = new osgViewer::Viewer();
    41. 41. osg::ref_ptr traits = new osg::GraphicsContext::Traits;
    42. 42. traits->x = 40;
    43. 43. traits->y = 40;
    44. 44. traits->width = 600;
    45. 45. traits->height = 480;
    46. 46. traits->windowDecoration = true;
    47. 47. traits->doubleBuffer = true;
    48. 48. traits->sharedContext = 0;
    49. 49.
    50. 50. osg::ref_ptr gc = osg::GraphicsContext::createGraphicsContext(traits.get());
    51. 51.
    52. 52. osg::ref_ptr camera = viewer->getCamera();
    53. 53. camera->setGraphicsContext(gc.get());
    54. 54. camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));
    55. 55. GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;
    56. 56. camera->setDrawBuffer(buffer);
    57. 57. camera->setReadBuffer(buffer);
    58. 58.
    59. 59. osg::ref_ptr root = new osg::Group();
    60. 60.
    61. 61. // 添加三维文字
    62. 62. root->addChild(create3DText(strDataFolder));
    63. 63.
    64. 64. // 优化场景数据
    65. 65. osgUtil::Optimizer optimizer;
    66. 66. optimizer.optimize(root.get());
    67. 67. viewer->setSceneData(root.get());
    68. 68. viewer->realize();
    69. 69. viewer->run();
    70. 70. }

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

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

  • 相关阅读:
    飞书公式总结
    Java 网络编程 —— 创建非阻塞的 HTTP 服务器
    复旦微JFMVU3P-2FFVC1517 FPGA+AI全国产化人工智能数据处理平台,适用于雷达与中频信号采集、视频图像采集
    BENTLY 350015 127610-01数字量输入模块
    【网站架构】同是响应式布局为什么我的页面布局是错乱的?布局工作占了大部分前端工作量怎样才能做好响应式布局?一份代码如何适配多个显示端?
    程序化广告系列之一---名词解释
    适配移动端,菜单采用底部固定形式(1+X Web前端开发初级 例题)
    5G WiFi 安信可 BW16 模组 RTL8720DN 入门笔记 2:Linux 搭建二次开发SDK开发环境,点亮一盏LED灯。
    保姆级-微信小程序开发教程
    基于DBC Signal Group生成Autosar SR接口(1)
  • 原文地址:https://blog.csdn.net/liangfei868/article/details/134561624