OSG项目经验2<在场景中添加文字面版>
osg::Vec3 center; // osg中的坐标是三维的,所以我们需要定义一个三维向量center用来存储获得的坐标
int NodeNum;
center = mRoot->getChild(NodeNum)->computeBound()._center; //获得鼠标点击模型的包围盒的中心处坐标,NodeNum是我加载模型的时候模型在节点中的序号
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中
widthVec=osg::Vec3(num1,,); //这个num1就是矩形的长
heightVec=osg::Vec3(,,num2); //这个num2就是矩形的高
          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<在场景中添加文字面版>的更多相关文章
- osg项目经验1<MFC+OSG中模型点选效果>
		点选主要是重载osg的GUIEventHandler, class CPickHandler : public osgGA::GUIEventHandler{ //自定义回调函数名:CPickHand ... 
- LoadRunner测试场景中添加负载生成器
		如何在LoadRunner测试场景中添加负载生成器 本文对如何在LoadRunner的测试场景中添加负载生成器,如何使用负载生成器的方法,总结形成操作指导手册,以指导测试人员指导开展相关工作. 1.什 ... 
- Loadrunner:场景中添加负载生成器
		场景中添加负载生成器: (1)远程机子(假设ip为192.168.134.23)开启负载生成器 开始菜单找到:LoadRunner Agent Process 开启后任务栏会显示如下图: (2)场景中 ... 
- 用Physijs在场景中添加物理效果
		1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理 ... 
- WPF 在绘图控件(Shape)中添加文字 [2018.7.15]
		原文:WPF 在绘图控件(Shape)中添加文字 [2018.7.15] Q:使用Shape的子类Ellipse画一个圆,如何在圆中添加文字? A:Shape类中不包含Text属性.可使用Shape类 ... 
- THREE.JS(如何想场景中添加物体对象)
		这篇主要实现向模型对象中添加头像,并组成一个矩形 一.three.js是什么? 上篇说了点TWEEN这篇又来一根THREE是不是两兄弟啊?还真有点像,当想要做3D动画的时候,可能会考虑用TWEEN的动 ... 
- FFmpeg 向视频中添加文字
		原文地址:http://www.cnblogs.com/wanggang123/p/6707985.html FFmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文 ... 
- Ffmpeg 视频教程 向视频中添加文字
		Ffmpeg支持添加文字功能,具体如何将文字叠加到视频中的每一张图片,FFmpeg调用了文字库FreeSerif.ttf.当我们 用到ffmpeg 添加文字功能时 我们需要先下载改文字库,下载地址是h ... 
- WPF中RichTextBox中添加文字的两种方法
		RichTextBox控件不同于TextBox控件,后者可以直接通过其Text属性绑定或者在后台动态添加文字. (一)使用数据绑定 <RichTextBox FontSize="12& ... 
随机推荐
- JS学习笔记(三)函数
			js中的方法名一般都是首字母小写,其余单词首字母大写的规范. 声明 function 函数名(参数列表) { // 函数体 return 返回值; } 调用 函数名(); (js中花括号喜欢用这种方式 ... 
- vim常用命令总结 (转)
			在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code format ... 
- 浅谈Mybatis(二)
			一.resultMap 作用:发现数据库的查询结果与实体之间不匹配时,需要通过ResultMap来进行映射处理.常用于多表查询. 多表查询还是比较复杂的,因为可能的情况很多.这里只说两种情况: 1.1 ... 
- java.el.PropertyNotFoundException解决方法
			今天在开发中遇到了java.el.PropertyNotFoundException异常,检查JSP页面.Action.Bean.都没有发现错误 在网上搜了一下可能是我的bean不是一个标准的bean ... 
- 常用笔记: JS实现VBS当中的Replace
			<script> //JS实现VBS当中的Replace,替换全部.方法名大写,区别于原方法,与VBS相类似. String.prototype.Replace = function(ol ... 
- which 查看可执行文件的位置
			我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索: which 查看可执行文件的位置. whereis 查看文件的位置. ... 
- 十大最值得注意的MySQL变量
			MySQL数据库中的变量非常多,下文为您整理出了十大最值得注意的MySQL变量,希望对您学习MySQL数据库能够有一些帮助. AD: MySQL变量很多,其中有一些MySQL变量非常值得我们注意,下面 ... 
- JS行合并处理方法
			//行合并 function _w_table_rowspan(col){ _w_table_firsttd = ""; _w_table_currenttd = "&q ... 
- .net mvc笔记4_依赖注入
			一.Building Loosely Coupled Components MVC模式最重要的特点就是关注点分离.我们希望应用中的组件能尽可能的独立,相互之间即使有依赖也要在我们的控制之下. 在理想情 ... 
- DatabaseMetaData的用法(转)
			http://blog.csdn.net/sdliubo/article/details/6546889 
