添加文字版需要用到osg的三个名字空间:
                        osgText::Text,这个类用来添加文字和设置文字的一些属性;
                        osg::Geometry,这个类用来画常见的图形;
                        osg/ShapeDrawable,通过这个类也可以画一些常见的图形,并且可以吧Geometry加进osg::Geode节点中;
下面先简要介绍一下这三个命名空间;
 
1、osgText::Text:见http://www.cnblogs.com/xiaocainiao2hao/p/4544273.html
 
2、OSG::Gemotery
      用户使用Gemotery类,可以通过制定顶点、颜色和法线的方式,绘制简单的多边形,然后通过Geode->addDrawable()方法,把绘制的多边形添加到节点中。
    我在项目中仅仅画了矩形,然后通过设置geo的各个属性来达到想要的效果,这在后面的代码中会加以介绍。如果想了解更多的关于osg::Geometry的相关知识,请查看www.baidu.com。
 
3、osg::ShapeDrawable类
    这个没啥好介绍的,也是画一些节本的图形,不果geode要调用它的一个方法比较有用
                                geode->addDrawable(osg::Geometry geo)
    这个可以把我们自己画的Gemotery图形加到节点中。
 
下面通过部分代码来对这三个类的应用加以介绍:
    在项目经验1中,我们已经能够通过自定义的CPickHandler()回调来达到我们在场景中用鼠标点击某个点,就能得到点击处的屏幕坐标,进而转换为世界坐标,而且我们能够通过模型的相关信息(我用的是模型的名字)来确定我们选择的是哪个模型,进而对我们的选择事件作出相应。
    那么,我们首先在我们选择的模型上加上一个信息展示面板,展示模型的相关信息。
    
    第一步,我们需要获得我们选择的模型的世界坐标:

   osg::Vec3 center;                      // osg中的坐标是三维的,所以我们需要定义一个三维向量center用来存储获得的坐标
int NodeNum;
center = mRoot->getChild(NodeNum)->computeBound()._center; //获得鼠标点击模型的包围盒的中心处坐标,NodeNum是我加载模型的时候模型在节点中的序号
    我们可以通过center这个坐标获得我们选择节点的世界坐标,通过下面一句:                  
osg::Vec3 wordMark = mRoot->getChild(NodeNum)->getBound().center()*osg::computeLocalToWorld(mGroup->getChild(NodeNum)->getParentalNodePaths()[]);//获得节点的世界坐标
    然后我们就可以通过这个世界坐标在该位置添加文字面板了。
 
    下写一个添加文字的方法:

   void CreatText(osgText::Text& textObject,osgText::Font* font,float size,const osg::Vec3& pos )
{
textObject.setFont(font);// 读入字体
textObject.setCharacterSize(size);//字体大小
textObject.setPosition(pos);
textObject.setColor(osg::Vec4(0.0,1.0,0.0,1.0));
textObject.setAlignment(osgText::Text::LEFT_BOTTOM);//文字对齐方向
textObject.setAutoRotateToScreen(true);//跟随视角不断变化,但离物体越远,文字越小
textObject.setAxisAlignment(osgText::Text::XZ_PLANE);//获取文字对称成方式 }//在这个函数中也可以根据自己的需要使用text的其他方法,如文字描边:textObject.setBackdropType(),给文字加上边框:textObject.setDrawMode()等 void createContent(osgText::Text& textObject,const char* string)
{
int requiredSize=mbstowcs(NULL,string,); //如果mbstowcs第一参数为NULL那么返回字符串的数目
wchar_t* wText=new wchar_t[requiredSize+];
mbstowcs(wText,string,requiredSize+) ;//由char转换成wchar类型
textObject.setText(wText);
delete wText;
}
    然后我们可以通过调用这两个函数添加文字:

      const char* textString={
   "我选中的节点是这个;\n"
   "先画一个文字面板;\n"
   "再添加文字;\n"
   "然后把文字和面板都添加到geode中;\n"
   "最后把geode加载到mRoot中"
   };
   const char* titleString={
   "文字面板"
   };
osgText::Font* fontHei = osgText::readFontFile("simhei.ttf"); //读入字体
osg::ref_ptr<osgText::Text> text = new osgText::Text; //新建一个text对象
CreatText(*text,fontHei,350.0,wordMark); //调用CreatText()方法,创建一个文字对象,wordMark就是我们上步计算的选择节点的世界坐标
createContent(*text,textString); osg::ref_ptr<osgText::Text> title = new osgText::Text;
setupProperties(*title,fontHei,350.0,osg::Vec3(wordMark.x()+,wordMark.y()-,wordMark.z()+));
createContent(*title,titleString);
title->setColor(osg::Vec4(1.0,0.0,0.0,1.0)); osg::ref_ptr<osg::Geode> geode3 = new osg::Geode; //创建一个geode对象,用来加载text和Gemotery对象
//给文字添加底板
osg::ref_ptr<osg::Geometry> geo = new osg::Geometry; //创建一个Gemotery对象
osg::Vec4Array* colorArray = new osg::Vec4Array; //创建一个Vec4Array对象,存放颜色信息
geo = osg::createTexturedQuadGeometry(osg::Vec3(wordMark.x(),wordMark.y()+,wordMark.z()+),osg::Vec3(,0.0,0.0),osg::Vec3(0.0,0.0,),1.0,1.0); //画一个小矩形,用来摆放title,后面会对createTexturedQuadGeometry里面的参数做介绍
colorArray->push_back(osg::Vec4(0.0,1.0,0.0,1.0)); //给colorArray赋值,0101是绿色
geo->setColorArray(colorArray); //给画的矩形设置颜色
geode3->addDrawable(osg::createTexturedQuadGeometry(osg::Vec3(wordMark.x(),wordMark.y()+,wordMark.z()-130.0),osg::Vec3(,0.0,0.0),osg::Vec3(0.0,0.0,),1.0,1.0)); //再画一个大矩形,用来放其它文字信息,并且把矩形加进geode对象中
geode3->addDrawable(geo.get()); //把小矩形也加载进geode
geode3->addDrawable(text.get());
geode3->addDrawable(title.get());
mRoot->addChild(geode3); //把文字面板加进mRoot中
在上面的代码中的wordMark.x()和y、z坐标加减值都是我根据显示效果自己调整的位置。在具体情况下需要自己确定值。
 
关于
         createTexturedQuadGeometry(const Vec3 & corner,const Vec3 & widthVec,const Vec3 & heightVec,float l,float b,float r,float t ); 
其中corner是起点(矩形的左下角),然后从这个起点按照widthVec和heightVec来画出一个矩形,我一般设置

              widthVec=osg::Vec3(num1,,);    //这个num1就是矩形的长
heightVec=osg::Vec3(,,num2); //这个num2就是矩形的高
l,b一般都取0.0,r,t如果不相等,那么二维的贴图会变成长方形。也就是说,我的黑白棋盘格,会变成黑白长方格。相等的话,就会变成黑白正方格。
 
 
另外colorArray 对象的颜色值            
          colarray->push_back(osg::Vec4(1.0, 0.0, 0.0, 1.0));    //Red

                colarray->push_back(osg::Vec4(0.0, 1.0, 0.0, 1.0));    //Green

                colarray->push_back(osg::Vec4(0.0, 0.0, 1.0, 1.0));    //Blue

                colarray->push_back(osg::Vec4(1.0, 1.0, 1.0, 1.0));    //White

OSG项目经验2<在场景中添加文字面版>的更多相关文章

  1. osg项目经验1<MFC+OSG中模型点选效果>

    点选主要是重载osg的GUIEventHandler, class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHand ...

  2. LoadRunner测试场景中添加负载生成器

    如何在LoadRunner测试场景中添加负载生成器 本文对如何在LoadRunner的测试场景中添加负载生成器,如何使用负载生成器的方法,总结形成操作指导手册,以指导测试人员指导开展相关工作. 1.什 ...

  3. Loadrunner:场景中添加负载生成器

    场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中 ...

  4. 用Physijs在场景中添加物理效果

    1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理 ...

  5. WPF 在绘图控件(Shape)中添加文字 [2018.7.15]

    原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ...

  6. THREE.JS(如何想场景中添加物体对象)

    这篇主要实现向模型对象中添加头像,并组成一个矩形 一.three.js是什么? 上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动 ...

  7. FFmpeg 向视频中添加文字

    原文地址:http://www.cnblogs.com/wanggang123/p/6707985.html FFmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文 ...

  8. Ffmpeg 视频教程 向视频中添加文字

    Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是h ...

  9. WPF中RichTextBox中添加文字的两种方法

    RichTextBox控件不同于TextBox控件,后者可以直接通过其Text属性绑定或者在后台动态添加文字. (一)使用数据绑定 <RichTextBox FontSize="12& ...

随机推荐

  1. stl之map 排序

    排序问题,STL中默认是采用小于号来排序的,因为设置int等类型做key,它本身支持小于号运算,在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,因为它没有小于号操作,insert等函数 ...

  2. java 设计模式初探之适配器模式

    1. 概述 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作. 2. 解决的问题 即Adapter模式使得原本由于接口不兼容而不 ...

  3. 2014.9.16HTML表单CSS

    (一)表格 合并单元格(少用) (合并列) 1.先选中要合并的2个或多个单元格,然后点击以下图标 代码:<td colspan="2"> </td> 2.设 ...

  4. ORACLE查看当前连接用户的权限信息或者角色信息

    关于当前用户的相关信息,可以通过如下语句找到: SQL> select * from all_objects where object_name like 'SESSION%'; OWNER O ...

  5. VS2013 快捷键乱掉如何修改回来

    比如 CTRL+E+C =注释 F6=重新生成解决方案 CTRL+D+Q=运行时快速监视 工具-->选项-->环境-->键盘-->应用以下其他键盘映射方案,下拉选择 Visua ...

  6. C# Attribute(特性)之---数据契约 [DataContract]

    服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端和客户端之间要传送的自定义数据类型. 一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,如下所 ...

  7. <转>四个重要属性——Action、Data、Category、Extras

    Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递.通过其自带的属性,其实可以方便的完成很多较为复杂的操作.例如直接调用拨号功能.直接自动调用合适的程序打开不同类型的 ...

  8. springmvc入门demo

    目录结构: package com.wyl; import org.springframework.stereotype.Controller; import org.springframework. ...

  9. 用U盘和iso镜像文件重装系统

    工具: 1.硬件: 容量最好在2.5G以上u盘(比如这次是2.3G的winows_7_32位_中文专业版ISO,我的U盘容量是不到8G). 2.软件: a.Ultraiso软件,来制作u盘启动项 b. ...

  10. wampserver 绑定域名(wampserver 本地域名测试配置)

    一.tomact 配置虚拟主机 1.打开Apache菜单下“httpd.conf”文件: 找到“# Include conf/extra/httpd-vhosts.conf” , 把这句前面的#号去掉 ...