目录
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 负责三维立体文字的渲染;
在OSG 中,为了显示高质量文字,专门定义了新的命名空间来管理场景中文字的渲染,这个命名空间中的类主要用于加载字体和控制文字各种渲染属性。
该空间主要包括下面几个类:
class FadeText; // 渐变文字
class Font; // 字体
class Font3D; // 3D字体
class VectorUInt; // 向量单元
class String; // 字符串————用于多字节字符和各类文字编码
class Text; // 文字
class Text3D; // 3D文字
class TextBase; // 文字基类
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 // 全部
}
文字的属性较多,但不是每一个都需要设置,
通常需要设置的有位置、内容、大小、对齐方式和颜色。
- osgText::Font 类直接继承自 osg::Object 类。
- 该类主要用于对字体的管理,使用FreeType 插件来读取字体文件,根据字体文件构建字体贴图,同时创建一个字体对象。
读取字体可以用以下函数:
osgText::readFontFile(const std::string &filename, const osgDB::ReaderWriter::Options* userOptions = 0);
在场景中添加文字的主要步骤如下:
渐变文字(osgText::FadeText 类) 继承自 osgText::Text 类。
创建渐变文字与一般的文字没有很大的区别,只是它创建的是osgText::FadeText 类的实例对象。同时,它还需要设置拣选回调(setCullCallBack)为聚集筛选(osg::ClusterCullingCallBack),聚集筛选是一种类似于背面筛选的场景筛选方法,但是它可以将多个对象组合起来并进行同意的背面筛选,代码如下:
osgText::FadeText* text = new osgText::FadeText();
text->setCullCallBack(new osg::ClusterCullingCallBack(pos, normal, 0.0));
- 三维立体文字比二维平面文字显示效果更好,它有非常好的立体显示效果。
- 但是,三维文字会加重渲染负担,相对于二维文字,它占用的内存是非常大的。
osgText::Text3D 类继承自 osgText::TextBase 类。
在osgText::Text3D 类中包含了一个设置深度信息的函数,可以通过该函数设置立体文字深度:
void setCharacterDepth(float characterDepth);
三维立体文字就创建成功了!!!