【OSG学习笔记】Day 53: Text3D( 三维文字)

三维文字渲染:osgText::Text3D

在 OpenSceneGraph(OSG)开发中,文字渲染是场景标注、信息展示的核心功能。

除了之前介绍的平面淡入淡出文字 FadeText ,OSG 还提供了真正的三维立体文字 ------osgText::Text3D,它能生成具有厚度、立体感、可旋转、可缩放的3D文字模型,广泛应用于三维仿真、数字孪生、场景标识、广告展示等领域。

本文将从继承关系、核心特性、API详解、完整代码、使用场景 全方位讲解Text3D,带你彻底掌握OSG三维文字开发。


核心特性

osgText::Text3D 是OSG专门为三维空间立体文字设计的绘制类,核心优势:

  1. 真正的3D模型:文字拥有厚度,不是平面贴片,可360°查看;
  2. 独立渲染属性:支持自定义文字厚度、渲染模式、对齐方式、包围盒显示;
  3. 兼容材质/光照:可设置颜色、反光、透明度,和三维模型渲染逻辑完全一致;
  4. 灵活布局:支持指定三维坐标、对齐平面,适配任意三维场景;
  5. 可组合使用:能和模型、地形、粒子特效等场景元素无缝融合。

关键对比

  • osgText::Text:二维平面文字,始终面向相机,无厚度;
  • osgText::FadeText:带距离渐变的二维文字,无厚度;
  • osgText::Text3D三维立体模型文字,有长宽高,可旋转观察。

类继承关系

Text3D 拥有标准的OSG继承链,和普通文字同源,扩展性极强:

复制代码
osg::Object → osg::Drawable → osgText::TextBase → osgText::Text → osgText::Text3D
  1. osg::Object:OSG所有对象的基类,提供引用计数;
  2. osg::Drawable:可绘制对象基类,具备渲染能力;
  3. osgText::TextBase:文字抽象基类,定义文字通用接口;
  4. osgText::Text:二维文字基类,实现基础文字渲染;
  5. osgText::Text3D三维文字最终类,扩展立体、厚度、模型化功能。

这意味着:所有 Text 支持的功能,Text3D 都可以直接使用,并额外拥有3D专属属性。


核心API方法详解

结合实战代码,Text3D 最常用的关键API如下:

API 方法 功能说明
setText(字符串) 设置文字内容,支持中文/英文/数字
setFont(路径) 设置字体文件(ttf/otf)
setPosition(Vec3) 设置文字三维空间坐标
setCharacterSize(大小) 设置文字尺寸
setCharacterDepth(厚度) 3D专属:设置文字立体厚度
setRenderMode(模式) 设置文字渲染模式
setDrawMode(模式) 设置绘制方式(文字/包围盒)
setAxisAlignment(模式) 设置文字对齐平面(XY/XZ/YZ)

完整可运行代码

cpp 复制代码
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgDB/WriteFile>
#include <osgText/Text3D>
#include <osgText/Font3D>
#include <osgText/Text>
#include <osgUtil/Optimizer>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Material>
#include <osg/StateSet>
#include <iostream>

// 创建三维立体文字
osg::ref_ptr<osg::Geode> create3DText()
{
    osg::ref_ptr<osg::Geode> geode = new osg::Geode();

    // 创建 3D 文字对象
    osg::ref_ptr<osgText::Text3D> text3D = new osgText::Text3D();

    // ========== 1. 基础文字设置 ==========
    // 文字内容(支持中文,需配套中文字体)
    text3D->setText(L"http://www.OsgChina.org --- OpenSceneGraph 三维文字");
    // 字体路径(必须使用支持中文的字体)
    text3D->setFont("../../fonts/simhei.ttf");
    // 文字大小
    text3D->setCharacterSize(60.0f);
    // 文字三维位置
    text3D->setPosition(osg::Vec3(0.0f, 0.0f, 0.0f));

    // ========== 2. 3D文字专属设置 ==========
    // 渲染模式:按字形独立渲染
    text3D->setRenderMode(osgText::Text3D::PER_GLYPH);
    // 文字厚度(核心3D属性)
    text3D->setCharacterDepth(10.0f);
    // 绘制模式:显示文字 + 包围盒
    text3D->setDrawMode(osgText::Text3D::TEXT | osgText::Text3D::BOUNDINGBOX);
    // 对齐平面:XZ平面(地面水平显示)
    text3D->setAxisAlignment(osgText::Text3D::XZ_PLANE);

    // ========== 3. 材质与光照 ==========
    osg::ref_ptr<osg::Material> material = new osg::Material();
    // 环境光 + 漫反射 = 白色立体文字
    material->setAmbient(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
    material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
    material->setAlpha(osg::Material::FRONT_AND_BACK, 1.0f);

    // 将材质应用到节点
    geode->getOrCreateStateSet()->setAttribute(material.get());
    geode->addDrawable(text3D.get());

    return geode;
}

// 主函数
int main()
{
    // 创建OSG窗口
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    osg::ref_ptr<osg::Group> root = new osg::Group();

    // 添加3D文字
    root->addChild(create3DText());

    // 优化场景
    osgUtil::Optimizer optimizer;
    optimizer.optimize(root.get());

    // 启动渲染
    viewer->setSceneData(root.get());
    viewer->realize();
    viewer->run();

    return 0;
}

使用场景

osgText::Text3D 适用于以下专业场景:

  1. 三维场景标识:建筑名称、道路指示牌、设备标注
  2. 数字孪生系统:车间、场馆、城市三维看板文字
  3. 仿真训练系统:三维环境中的操作提示
  4. 展览展示项目:立体广告、标题、logo
  5. 游戏与可视化:3D空间内的文字特效

总结

  1. osgText::Text3D三维立体文字模型,拥有厚度与真实3D结构;
  2. 继承自Text,兼容二维文字所有功能,并扩展3D属性;
  3. 核心API:setCharacterDepth(厚度)、setAxisAlignment(对齐)、setRenderMode(渲染);
  4. 必须搭配材质+字体才能正常显示;
  5. 是OSG开发中三维信息展示的标准方案。

相关推荐
十月的皮皮2 小时前
C语言学习笔记20260706-栈的压入、弹出序列验证
c语言·笔记·学习
渣渣灰飞3 小时前
MySQL 系统学习 第二阶段 第三章 DQL(Data Query Language)第二节:WHERE 条件查询
sql·学习·mysql
维他奶糖613 小时前
基于 DrissionPage 实现小红书搜索笔记批量采集
笔记
心中有国也有家3 小时前
AtomGit Flutter 鸿蒙客户端:E-Brufen 架构设计
学习·flutter·华为·harmonyos
hssfscv4 小时前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
克里斯蒂亚诺更新4 小时前
电脑关闭密码的操作
笔记
小小的代码里面挖呀挖呀挖4 小时前
杰理蓝牙耳机开发--LE Audio与游戏耳机应用
笔记·单片机·物联网·学习
xiaomici5 小时前
SAC中的Dataset/Model/Planning model
笔记
一楼的猫5 小时前
AI写作检测机制技术深度解析:200+维度检测、叙事指纹与网文AI辅助怎么过审
人工智能·学习·安全·chatgpt·ai写作
学数学的口心贝5 小时前
从零搭建并维护个人主页
经验分享·笔记