|
前端时间正确编译了freetype-2.4.5,现在能正常显示汉字了。非常感谢论坛这个交流的平台还有版主的热心回答!
目前显示汉字的实现过程是先创建文字设置一些相关的属性,让后将其加在Geode节点下,Geode在挂在Group节点下,最后实现仿真循环。这样显示的文字会随着鼠标的移动而旋转。
但是如果要一直贴在屏幕上显示,不随着鼠标的移动而改变位置,需要先将文字关联到一个相机节点Camera下,再将Camera挂在Group下。目前发现的问题是:挂在Camera下的文字,能显示英文,但是不能显示中文,在中文显示的位置是几个小框框,不知道这个是什么原因,请看图片的左上角那部分显示
以下是程序代码:
-
- #include <osg/Geode>
- #include <osgText/Text>
- #include <osgViewer/Viewer>
- #include <osgDB/ReadFile>
- #include <osgText/Font>
- #include <osgText/Text>
- //设置字体的属性(要显示的文字,字库,字体大小,字的位置)
- void setupProperties( osgText::Text& textObject, osgText::Font* font,
- float size, const osg::Vec3& pos )
- {
- textObject.setFont( font ); //设置字库,字库决定了文字字形的样式,比如宋体,黑体等
- textObject.setCharacterSize( size );//设置文字的大小
- textObject.setPosition( pos );//设置文字初始显示的位置
- textObject.setColor( osg::Vec4(1.0, 0.0, 0.0, 1.0) );//设置文字的颜色
- textObject.setAlignment( osgText::Text::CENTER_BOTTOM );//设置文字的对齐方式
- textObject.setAxisAlignment( osgText::Text::XZ_PLANE );//设置文字的轴对齐方式,即文字放在哪个坐标平面显示
- }
- /*******************************************************************************/
- //创建文字内容的显示
- void createContent( osgText::Text& textObject, const char* string )
- {
- //mbstowcs为C++函数,用于将输入的多字符(char*)形式转化为宽字符串(wchar*)形式
- int requiredSize = mbstowcs( NULL, string, 0 );
- wchar_t* wtext = new wchar_t[requiredSize+1];
- mbstowcs( wtext, string, requiredSize+1 );
- textObject.setText( wtext );
- delete wtext;
- }
- /*******************************************************************************/
- //创建平面文字,即文字不随着场景的变化,一直显示在屏幕上
- osg::Group* createHUDText()
- {
- osg::Group* rootNode = new osg::Group;//新建Group节点
- osgText::Font* font = osgText::readFontFile("fonts/arial.ttf");//读取字体文件
- osg::Geode* geode = new osg::Geode;//新建Geode节点
- rootNode->addChild(geode);
- float windowHeight = 900.0f;//场景高度
- float windowWidth = 1440.0f;//场景宽度
- float margin = 50.0f;//文字显示的边界距离
- osg::Vec4 layoutColor(1.0f,1.0f,0.0f,1.0f);//文字的颜色(黄色)
- float layoutCharacterSize = 50.0; //文字的大小
- //新建一个文字的实例,并将其加入到场景当中(左上角显示)
- {
- osg::ref_ptr<osgText::Text> text = new osgText::Text;
- text->setFont(font);
- text->setColor(layoutColor);
- text->setCharacterSize(50);
- text->setPosition(osg::Vec3(margin,windowHeight-margin,0.0f));
- text->setLayout(osgText::Text::LEFT_TO_RIGHT);
- const char* mytext = "我们在一起\ncongratulations";//标题文字
- createContent(*text,mytext);
- geode->addDrawable(text.get());//将绘制的文字关联至geode节点
- }
- return rootNode;
- }
- int main( int argc, char** argv )
- {
- setlocale( LC_ALL, ".936" );//设定本地字符编码
- osg::Group* group = new osg::Group;//创建场景的组节点
- const char* titleString = "桂林\ncongratulations";//标题文字
- const char* textString = { //文档内容
- "人生若只如初见,何事秋风悲画扇;\n"
- "等闲变却故人心,却道故人心易变。\n"
- "OpenSceneGraph Documentation\n"
- "何如薄幸锦衣郎,比翼连枝当日愿。"
- };
-
- osgText::Font* fontHei = osgText::readFontFile( "C:\\WINDOWS\\Fonts\\simfang.ttf" );
- osgText::Font* fontKai = osgText::readFontFile( "Fonts/simkai.ttf" );
-
- osg::ref_ptr<osgText::Text> title = new osgText::Text;
- setupProperties( *title, fontHei, 20.0f, osg::Vec3(0.0f, 0.0f, 0.0f) );//设置文字显示的各种属性值
- createContent( *title, titleString );//创建文字显示
-
- osg::ref_ptr<osgText::Text> text = new osgText::Text;
- setupProperties( *text, fontKai, 15.0f, osg::Vec3(0.0f, 0.0f, -80.0f) );//设置文字显示的各种属性值
- createContent( *text, textString );//创建文字显示
-
- osg::ref_ptr<osg::Geode> geode = new osg::Geode;//创建一个Geode节点
- geode->addDrawable( title.get() );//将标题文字节点关联至Geode节点
- geode->addDrawable( text.get() );//将文档内容文字节点关联至Geode节点
- group->addChild(geode);//将这两部分文字节点加入场景c
- osg::Camera* camera = new osg::Camera;//新建Camera相机节点,用于显示静态的文字,不跟随场景变动
- camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
- camera->setProjectionMatrixAsOrtho2D(0,1440,0,900);
- camera->setViewMatrix(osg::Matrix::identity());
- camera->setClearMask(GL_DEPTH_BUFFER_BIT);
- /*****************************************************************************/
- camera->addChild(createHUDText());//将创建的平面文字关联至相机节点!!!!!!!!!!!!!!!!!!!
- /*****************************************************************************/
- camera->getOrCreateStateSet()->setMode(GL_LIGHTING,osg::StateAttribute::OFF);
- group->addChild(camera);//将相机节点关联至场景的组节点
-
- osgViewer::Viewer viewer;//创建视镜器,开始仿真循环
- viewer.setSceneData( group);
- return viewer.run();
- }
复制代码
希望能有人帮助解决这个问题,谢谢~ |
|