osg 文字

目录

1、osgText

1.1、osgText::Text

1.2、osgText::Font 类

1.3、osgText::FadeText 类 (渐变文字)

2、osgText3D

2.1、osgText::Text3D


        适当的文字信息对于显示场景信息是非常重要的。在OSG 中,osgText 提供了向场景中添加文字的强大功能,由于第三方插件 FreeType 的支持,它完全支持 TrueType 字体。

  • 文字显示效果主要分为两大类,即二维文字和三维文字。
  • osgText::Text 负责二维平面文字的渲染;
  • osgText::Text3D 负责三维立体文字的渲染; 

1、osgText

        在OSG 中,为了显示高质量文字,专门定义了新的命名空间来管理场景中文字的渲染,这个命名空间中的类主要用于加载字体和控制文字各种渲染属性。

该空间主要包括下面几个类:

class FadeText;    // 渐变文字
class Font;        // 字体
class Font3D;      // 3D字体
class VectorUInt;  // 向量单元
class String;      // 字符串————用于多字节字符和各类文字编码
class Text;        // 文字
class Text3D;      // 3D文字
class TextBase;    // 文字基类

1.1、osgText::Text

osgText::Text 类继承自osgText::TextBase 类;

osgText::TextBase 是一个基类,定义了文字渲染的基本接口。

文字的主要属性包括颜色、位置、方向、大小模式、分辨率、对齐方式、输出格式、绘制模式、背景类型和颜色倾斜模式等。

  •  颜色
void setColor(const osg::Vec4 &color);
  • 位置
void setPosition(const osg::Vec3 &pos);
  • 方向
void Text::setAxisAlignment(AxisAlignment axis);

    文字方向枚举:

enum AxisAlignment
{
    XY_PLANE,             // xy面
    REVERSED_XY_PLANE,    // xy面的反面
    XZ_PLANE,             // xz面
    REVERSED_XZ_PLANE,    // xz面的方面
    YZ_PLANE,             // yz面
    REVERSED_YZ_PLANE,    // yz面的反面
    SCREEN,               // 屏幕
    USER_DEFINED_ROTATION // 用户自定义旋转
};
  •  大小模式
void setCharacterSizeMode(CharacterSizeMode mode);

     文字大小模式枚举:

enum
{
    OBJECT_COORDS,    // 默认模式
    SCREEN_COORDS,    // 根据屏幕坐标自动缩放
    OBJECT_COORDS_WITH_MAXIMUM_SCREEN_SIZE_CAPPED_BY_FONT_HEIGHT    // 根据视点自动缩放
};
  • 分辨率
void setFontResolution(unsigned int width, unsigned int height);

     默认情况下,osg 每个文字图形分配 32*32 个像素单元。

    分辨率越大,越清晰,但是渲染负担也越大。一般默认最小分辨率就可以满足需要了。

  • 对齐方式
void Text::setAlignment(AlignmentType alignment);

     文字对齐枚举:

enum AlignmentType
{
    LEFT_TOP,            // 左上
    LEFT_CENTER,         // 左中           
    LEFT_BOTTOM,         // 左下
    CENTER_TOP,          // 中上
    CENTER_CENTER,       // 中中
    CENTER_BOTTOM,       // 中下
    RIGHT_TOP,           // 右上
    RIGHT_CENTER,        // 右中
    RIGHT_BOTTOM,        // 右下
    LEFT_BASE_LIEN,           // 左基线
    CENTER_BASE_LINE,         // 中间的基线
    RIGHT_BASE_LINE,          // 右基线
    LEFT_BOTTOM_BASE_LINE,           // 左下基线
    CENTER_BOTTOM_BASE_LINE,         // 中下基线
    RIGHT_BOTTOM_BASE_LINE,          // 右下基线
    BASE_LINE = LEFT_BASE_LINE         // default  左基线为默认方式
};
  • 输出格式
void setLayout(Layout layout);

    文字输出格式枚举:

enum Layout
{
    LELT_TO_RIGHT,    // default  默认格式从左到右
    RIGHT_TO_LEFT,    // 从右到左
    VERTICAL          // 垂直
};    
  • 绘制模式
void setDrawMode(unsigned int mode);

     绘制模式枚举:

enum
{
    TEXT = 1,            // 默认模式文字
    BOUNDINGBOX = 2,     // 包围盒
    ALIGNMENT = 4        // 对齐
};
  • 背景类型
void setBackdropType(BackdropType type);

     背景类型枚举模式:

enum BaskdropType
{
    DROP_SHADOW_BOTTOM_RIGHT = 0,    // 默认阴影
    DROP_SHADOW_CENTER_RIGHT,
    DROP_SHADOW_TOP_RIGHT,
    DROP_SHADOW_BOTTOM_CENTER,
    DROP_SHADOW_TOP_CENTER,
    DROP_SHADOW_BOTTOM_LEFT,
    DROP_SHADOW_CENTER_LEFT,
    DROP_SHADOW_TOP_LEFT,
    OUTLINE,
    NONE
};
  • 颜色倾斜模式
void setColorGradientMode(ColorGradientMode mode);

    颜色倾斜枚举模式:

enum ColorGradientMode
{
    SOLID = 0,        // 立体,实心模式
    PER_CHARACTER,    // 每一个字
    OVERALL           // 全部
}

文字的属性较多,但不是每一个都需要设置,

通常需要设置的有位置、内容、大小、对齐方式和颜色。

1.2、osgText::Font 类

  • osgText::Font 类直接继承自 osg::Object 类。
  • 该类主要用于对字体的管理,使用FreeType 插件来读取字体文件,根据字体文件构建字体贴图,同时创建一个字体对象。

 读取字体可以用以下函数:

osgText::readFontFile(const std::string &filename, const osgDB::ReaderWriter::Options* userOptions = 0);

 在场景中添加文字的主要步骤如下:

  1. 创建一个Font 字体对象,并读取文字。
  2. 创建一个osgText::Text 对象,设置文字的属性,同时关联字体(系统有默认字体)
  3. 调用addDrawable() 方法将步骤2 创建的 osgText::Text 实例对象添加到一个Geode 实例,如果要多处添加文字,可以多次创建 osgTest::Text 对象,也可以创建多个Geode,逐个添加。

1.3、osgText::FadeText 类 (渐变文字)

渐变文字(osgText::FadeText 类) 继承自 osgText::Text 类。

        创建渐变文字与一般的文字没有很大的区别,只是它创建的是osgText::FadeText 类的实例对象。同时,它还需要设置拣选回调(setCullCallBack)为聚集筛选(osg::ClusterCullingCallBack),聚集筛选是一种类似于背面筛选的场景筛选方法,但是它可以将多个对象组合起来并进行同意的背面筛选,代码如下:

osgText::FadeText* text = new osgText::FadeText();
text->setCullCallBack(new osg::ClusterCullingCallBack(pos, normal, 0.0));

2、osgText3D

  • 三维立体文字比二维平面文字显示效果更好,它有非常好的立体显示效果。
  • 但是,三维文字会加重渲染负担,相对于二维文字,它占用的内存是非常大的。

2.1、osgText::Text3D

osgText::Text3D 类继承自 osgText::TextBase 类。

在osgText::Text3D 类中包含了一个设置深度信息的函数,可以通过该函数设置立体文字深度:

void setCharacterDepth(float characterDepth);

三维立体文字就创建成功了!!!

你可能感兴趣的:(OSG,c++,经验分享,OSG)