首页 > 代码库 > 【OSG】osgText::Text 研究
【OSG】osgText::Text 研究
由于需要在3D坐标轴上显示刻度值,所以要用到osgText::Text,这里简单记录一下其常见用法。
一、基本知识
- 常见设置
设置字体:setFont
设置内容:setText,这里输入参数需要是osgText::String,但它的构造函数可以接收std::string类型的字符串。
设置坐标位置:setPosition
设置文字尺寸:setCharacterSize
设置恒定尺寸还是随视角缩放(与现实一致):恒定为setCharacterSizeMode( osgText::Text::SCREEN_COORDS );
设置字体分辨率:setFontResolution
设置颜色:setColor
- 文字方向
setAxisAlignment(),着重介绍一下其枚举含义:
osgText::Text::SCREEN : 一直朝向镜头,所以,文字不会随着物体的旋转而旋转,永远都是水平的。
osgText::Text::XY_PLANE : 沿着轴对齐,文字处于XY决定的平面上,朝着Z轴正方向。
osgText::Text::REVERSED_XY_PLANE : 和上条的唯一区别是,朝着Z轴负方向。
(YZ, XZ同理)
- 对齐方式(图片摘自《OpenSceneGraph Quick Start Guide》)
各枚举效果:
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
文字与图片中的效果一一对应,注意,绿点代表Position的坐标。理解好啥是BASE_LINE就差不多了。
二、示例代码
如图所示,osgText::Text 继承自osgText::TextBase,更远的继承自 osg::Drawable。所以对于osgText::TextBase 来说,是与 osg::Geometry 一个层次的。
实例:为飞机添加一段描述:
#include <osg/Camera>#include <osgDB/ReadFile>#include <osgText/Font>#include <osgText/Text>#include <osgViewer/Viewer>osg::ref_ptr<osgText::Font> g_font = osgText::readFontFile("fonts/arial.ttf");osg::Camera* createHUDCamera( double left, double right, double bottom, double top ){ osg::ref_ptr<osg::Camera> camera = new osg::Camera; camera->setReferenceFrame( osg::Transform::ABSOLUTE_RF ); camera->setClearMask( GL_DEPTH_BUFFER_BIT ); camera->setRenderOrder( osg::Camera::POST_RENDER ); camera->setAllowEventFocus( false ); camera->setProjectionMatrix( osg::Matrix::ortho2D(left, right, bottom, top) ); return camera.release();}osgText::Text* createText( const osg::Vec3& pos, const std::string& content, float size ){ osg::ref_ptr<osgText::Text> text = new osgText::Text; text->setFont( g_font.get() ); text->setCharacterSize( size ); text->setAxisAlignment( osgText::TextBase::XY_PLANE ); text->setPosition( pos ); text->setText( content ); return text.release();}int main(){ osg::ref_ptr<osg::Geode> textGeode = new osg::Geode; textGeode->addDrawable( createText( osg::Vec3(150.0f, 500.0f, 0.0f), "The Cessna monoplane", 20.0f) ); textGeode->addDrawable( createText( osg::Vec3(150.0f, 450.0f, 0.0f), "Six-seat, low-wing and twin-engined", 15.0f) ); osg::Camera* camera = createHUDCamera(0, 1024, 0, 768); camera->addChild( textGeode.get() ); camera->getOrCreateStateSet()->setMode( GL_LIGHTING, osg::StateAttribute::OFF ); osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild( osgDB::readNodeFile("cessna.osg") ); root->addChild( camera ); osgViewer::Viewer viewer; viewer.setUpViewInWindow(40, 40, 800, 600); viewer.setSceneData( root.get() ); return viewer.run();}