查看: 3056|回复: 5

关于在屏幕上显示静止不动的汉字的问题

[复制链接]

该用户从未签到

发表于 2011-9-3 16:52:30 | 显示全部楼层 |阅读模式
前端时间正确编译了freetype-2.4.5,现在能正常显示汉字了。非常感谢论坛这个交流的平台还有版主的热心回答!
目前显示汉字的实现过程是先创建文字设置一些相关的属性,让后将其加在Geode节点下,Geode在挂在Group节点下,最后实现仿真循环。这样显示的文字会随着鼠标的移动而旋转。
但是如果要一直贴在屏幕上显示,不随着鼠标的移动而改变位置,需要先将文字关联到一个相机节点Camera下,再将Camera挂在Group下。目前发现的问题是:挂在Camera下的文字,能显示英文,但是不能显示中文,在中文显示的位置是几个小框框,不知道这个是什么原因,请看图片的左上角那部分显示 QQ截图20110903164051.jpg QQ截图20110903164918.jpg


以下是程序代码:


  1. #include <osg/Geode>
  2. #include <osgText/Text>
  3. #include <osgViewer/Viewer>
  4. #include <osgDB/ReadFile>
  5. #include <osgText/Font>
  6. #include <osgText/Text>

  7. //设置字体的属性(要显示的文字,字库,字体大小,字的位置)
  8. void setupProperties( osgText::Text& textObject, osgText::Font* font,
  9.                       float size, const osg::Vec3& pos )
  10. {
  11.     textObject.setFont( font ); //设置字库,字库决定了文字字形的样式,比如宋体,黑体等
  12.     textObject.setCharacterSize( size );//设置文字的大小
  13.     textObject.setPosition( pos );//设置文字初始显示的位置
  14.     textObject.setColor( osg::Vec4(1.0, 0.0, 0.0, 1.0) );//设置文字的颜色
  15.     textObject.setAlignment( osgText::Text::CENTER_BOTTOM );//设置文字的对齐方式
  16.     textObject.setAxisAlignment( osgText::Text::XZ_PLANE );//设置文字的轴对齐方式,即文字放在哪个坐标平面显示
  17. }
  18. /*******************************************************************************/
  19. //创建文字内容的显示
  20. void createContent( osgText::Text& textObject, const char* string )
  21. {
  22. //mbstowcs为C++函数,用于将输入的多字符(char*)形式转化为宽字符串(wchar*)形式
  23.     int requiredSize = mbstowcs( NULL, string, 0 );
  24.     wchar_t* wtext = new wchar_t[requiredSize+1];
  25.     mbstowcs( wtext, string, requiredSize+1 );
  26.     textObject.setText( wtext );
  27.     delete wtext;
  28. }
  29. /*******************************************************************************/
  30. //创建平面文字,即文字不随着场景的变化,一直显示在屏幕上
  31. osg::Group* createHUDText()
  32. {
  33.     osg::Group* rootNode = new osg::Group;//新建Group节点
  34.     osgText::Font* font = osgText::readFontFile("fonts/arial.ttf");//读取字体文件
  35.     osg::Geode* geode  = new osg::Geode;//新建Geode节点
  36.     rootNode->addChild(geode);
  37.     float windowHeight = 900.0f;//场景高度
  38.     float windowWidth = 1440.0f;//场景宽度
  39.     float margin = 50.0f;//文字显示的边界距离
  40.     osg::Vec4 layoutColor(1.0f,1.0f,0.0f,1.0f);//文字的颜色(黄色)
  41.     float layoutCharacterSize = 50.0;    //文字的大小
  42.     //新建一个文字的实例,并将其加入到场景当中(左上角显示)
  43.     {
  44.   osg::ref_ptr<osgText::Text> text = new osgText::Text;
  45.         text->setFont(font);
  46.         text->setColor(layoutColor);
  47.         text->setCharacterSize(50);
  48.         text->setPosition(osg::Vec3(margin,windowHeight-margin,0.0f));
  49.         text->setLayout(osgText::Text::LEFT_TO_RIGHT);
  50.   const char* mytext = "我们在一起\ncongratulations";//标题文字
  51.   createContent(*text,mytext);
  52.         geode->addDrawable(text.get());//将绘制的文字关联至geode节点
  53.     }
  54. return rootNode;   
  55. }
  56. int main( int argc, char** argv )
  57. {
  58.     setlocale( LC_ALL, ".936" );//设定本地字符编码
  59. osg::Group* group = new osg::Group;//创建场景的组节点
  60.     const char* titleString = "桂林\ncongratulations";//标题文字
  61.     const char* textString = {       //文档内容
  62.         "人生若只如初见,何事秋风悲画扇;\n"
  63.         "等闲变却故人心,却道故人心易变。\n"
  64.         "OpenSceneGraph Documentation\n"
  65.         "何如薄幸锦衣郎,比翼连枝当日愿。"
  66.     };
  67.    
  68.     osgText::Font* fontHei = osgText::readFontFile( "C:\\WINDOWS\\Fonts\\simfang.ttf" );
  69.     osgText::Font* fontKai = osgText::readFontFile( "Fonts/simkai.ttf" );
  70.    
  71.     osg::ref_ptr<osgText::Text> title = new osgText::Text;
  72.     setupProperties( *title, fontHei, 20.0f, osg::Vec3(0.0f, 0.0f, 0.0f) );//设置文字显示的各种属性值
  73.     createContent( *title, titleString );//创建文字显示
  74.    
  75.     osg::ref_ptr<osgText::Text> text = new osgText::Text;
  76.     setupProperties( *text, fontKai, 15.0f, osg::Vec3(0.0f, 0.0f, -80.0f) );//设置文字显示的各种属性值
  77.     createContent( *text, textString );//创建文字显示
  78.    
  79.     osg::ref_ptr<osg::Geode> geode = new osg::Geode;//创建一个Geode节点
  80.     geode->addDrawable( title.get() );//将标题文字节点关联至Geode节点
  81.     geode->addDrawable( text.get() );//将文档内容文字节点关联至Geode节点
  82. group->addChild(geode);//将这两部分文字节点加入场景c

  83. osg::Camera* camera = new osg::Camera;//新建Camera相机节点,用于显示静态的文字,不跟随场景变动
  84. camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  85. camera->setProjectionMatrixAsOrtho2D(0,1440,0,900);
  86. camera->setViewMatrix(osg::Matrix::identity());
  87. camera->setClearMask(GL_DEPTH_BUFFER_BIT);
  88. /*****************************************************************************/
  89. camera->addChild(createHUDText());//将创建的平面文字关联至相机节点!!!!!!!!!!!!!!!!!!!
  90. /*****************************************************************************/
  91. camera->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
  92. group->addChild(camera);//将相机节点关联至场景的组节点
  93.    
  94.     osgViewer::Viewer viewer;//创建视镜器,开始仿真循环
  95.     viewer.setSceneData( group);
  96.     return viewer.run();
  97. }

复制代码


希望能有人帮助解决这个问题,谢谢~

该用户从未签到

发表于 2011-9-3 18:07:36 | 显示全部楼层
你仔细看 createHUDText()这个函数,你读的arial.ttf而不是中文字体,显示的肯定是乱码啊

该用户从未签到

 楼主| 发表于 2011-9-3 20:07:15 | 显示全部楼层
回复 2# pixii


    谢谢,看来这次我是在阴沟里翻船了。一直以为OSG中的字体设置和WORD之类的文字处理软件一样,是可以随便设置系统中已经安装的字体,看来理解错了,谢谢你的提醒,改成一个中文字体就能正常显示了!

该用户从未签到

 楼主| 发表于 2011-9-3 20:10:54 | 显示全部楼层
QQ截图20110903201024.jpg

该用户从未签到

发表于 2011-9-4 13:30:09 | 显示全部楼层
学习了。。

该用户从未签到

发表于 2013-3-23 00:28:00 | 显示全部楼层
本帖最后由 xuhaiyan8825 于 2013-3-23 14:52 编辑

顶一个,明天仔细看看。
我显示出来是口口口
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表