zoukankan      html  css  js  c++  java
  • 【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

    image

    文字与图片中的效果一一对应,注意,绿点代表Position的坐标。理解好啥是BASE_LINE就差不多了。


     

    二、示例代码

    image

    如图所示,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();
    }
  • 相关阅读:
    C语言库函数大全及应用实例十一
    Oracle数据库游标使用大全
    搂来的menu
    vagerent的Asp.net笔记
    小别
    图解Oracle 11g physical standby Rolling Upgrade物理备库滚动升级特性
    图解MySQL Replication的几种拓扑
    MySQL企业版VS社区版
    图解揭秘Oracle Buffer Header数据结构
    Oracle、MySQL、SQL Server架构大对比
  • 原文地址:https://www.cnblogs.com/pezy/p/3868666.html
Copyright © 2011-2022 走看看