笔记来自OSG Quick Start Guide
-------------------------------------------------------------------------
字体:
使用了osgText组件
使用的通常步骤为:
1,create Font对象:osgText::readFontFile( "fonts/arial.ttf" );
2,create Text对象,关联到Font对象
3,addDrawable(text.get())添加到Geode节点
字体属性设置:
位置坐标:text->setPosition( osg::Vec3( 10.f, 0.f, 1.f ) );
文字方向:text->setAxisAlignment( osgText::Text::SCREEN );
Text::AxisAlignment 的枚举类型总共有七种:Text::XY_PLANE(缺省),
Text::XZ_PLANE,Text::YZ_PLANE 将文字面向某个轴,放置在指定的平面上;
Text::REVERSED_XY_PLANE,Text::REVERSED_XZ_PLANE
和Text::REVERSED_YZ_PLANE 与此类似,但是文字朝向指定轴的负向;
Text::SCREEN使文字总是朝向屏幕
对齐方式:text->setAlignment( osgText::Text::CENTER_TOP );
缺省选项是 Text::LEFT_BASE_LINE
RIGHT_BOTTOM,CENTER_BOTTOM,LEFT_BOTTOM,
RIGHT_BOTTOM_BASE_LINE,CENTER_BOTTOM_BASE_LINE,
LEFT_BOTTOM_BASE_LINE,RIGHT_BASE_LINE,CENTER_BASE_LINE,
LEFT_BASE_LINE, RIGHT_CENTER,CENTER_CENTER, LEFT_CENTER,
RIGHT_TOP,CENTER_TOP,及LEFT_TOP。
文字大小:text->setCharacterSize( 1.0f );
分辨率:text->setFontResolution( 128, 128 );
颜色:text->setColor( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
实例:
下图为三个Text对象,
上方两个为:text->setAxisAlignment( osgText::Text::SCREEN );
下方为:text->setAxisAlignment( osgText::Text::XZ_PLANE );
text->setAlignment( osgText::Text::CENTER_TOP );
代码:
#include <osg/Geode>
#include <osg/Geometry>
#include <osgText/Font>
#include <osgText/Text>
#include <osg/Node>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osg/Notify>
#include <iostream>
using namespace std;
osg::ref_ptr<osg::Drawable> createBase()
{
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
geom->setVertexArray( v.get() );
v->push_back( osg::Vec3( -1.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( 1.f, 0.f, -1.f ) );
v->push_back( osg::Vec3( 1.f, 0.f, 1.f ) );
v->push_back( osg::Vec3( -1.f, 0.f, 1.f ) );
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
geom->setColorArray( c.get() );
geom->setColorBinding( osg::Geometry::BIND_PER_VERTEX );
c->push_back( osg::Vec4( 1.f, 0.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 1.f, 0.f, 1.f ) );
c->push_back( osg::Vec4( 0.f, 0.f, 1.f, 1.f ) );
c->push_back( osg::Vec4( 1.f, 1.f, 1.f, 1.f ) );
osg::ref_ptr<osg::Vec3Array> n = new osg::Vec3Array;
geom->setNormalArray( n.get() );
geom->setNormalBinding( osg::Geometry::BIND_OVERALL );
n->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
geom->addPrimitiveSet(
new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 4 ) );
return geom.get();
}
osg::ref_ptr<osg::Node> createSceneGraph()
{
// Create the root (and only) node.
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable( createBase().get() );//draw a rect
osg::ref_ptr<osgText::Font> font = osgText::readFontFile( "fonts/arial.ttf" );
osg::Vec4 white( 1.f, 1.f, 1.f, 1.f );
{ //top right
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( font.get() );
text->setColor( white );
text->setCharacterSize( .15f );
text->setPosition( osg::Vec3( 1.f, 0.f, 1.f ) );
text->setAxisAlignment( osgText::Text::SCREEN );
text->setText( "Top-right" );
geode->addDrawable( text.get() );
}
{ //top left
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( font.get() );
text->setColor( white );
text->setCharacterSize( .15f );
text->setPosition( osg::Vec3( -1.f, 0.f, 1.f ) );
text->setAxisAlignment( osgText::Text::SCREEN );
text->setText( "Top-left" );
geode->addDrawable( text.get() );
}
{ //bottom
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( font.get() );
text->setFontResolution( 128, 128 );
text->setColor( white );
text->setCharacterSize( .4f );
text->setPosition( osg::Vec3( 0.f, 0.f, -1.04f ) );
text->setAxisAlignment( osgText::Text::XZ_PLANE );
text->setAlignment( osgText::Text::CENTER_TOP );
text->setText( "Hello OSG World" );
geode->addDrawable( text.get() );
}
return geode.get();
}
int main( int argc, char** argv )
{
osg::ref_ptr<osg::Node> root = createSceneGraph();
if (!root.valid())
{
osg::notify(osg::FATAL) << "Failed in createSceneGraph()." << endl;
return 1;
}
std::string out( "Text.osg" );
if ( !(osgDB::writeNodeFile( *(root.get()), out )) )
{
osg::notify(osg::FATAL) << "Failed in osgDB::writeNodeFile()." << endl;
return 1;
}
osg::notify(osg::ALWAYS) << "Successfully wrote \"" << out << "\". Execute \"osgviewer " << out << "\" to view." << endl;
}