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& ...
随机推荐
- asp.net DropDownList的AppendDataBoundItems属性
个人笔记 当设置DropDownList的AppendDataBoundItems属性为true,是将数据绑定项追加到静态声明的列表上,即在绑定之前可加入静态列表项. 例如: 前台这么写: <a ...
- Matlab中取模(mod)与取余(rem)的区别
取模(mod)与取余(rem)是不同的,通常取模运算也叫取余运算,它们返回结果都是余数. rem和mod唯一的区别在于: 当x和y的正负号一样的时候,两个函数结果是等同的:当x和y的符号不同时,rem ...
- 错误:类Byte是公共的,应在名为Byte.java 的文件中声明public class Byte{}一个错误
解决:文件名是xyz,那你的这个类名也应该是xyz.
- WinForm 控件的布局(Dock属性)的注意点
对于Dock属性,添加控件的顺序会影响它们停驻的方式.例如,如果你对窗体添加控件A,指示其停驻填充(Fill), 然后你对窗体添加控件B并指示其停驻顶部(Top),控件B将覆盖控件A的上部.原因就是控 ...
- jsf小例子
有人问我用过jsf没? 当时没有用过,就看了一下: 写了一个小例子 JSF和struts2 差不多的,都有一些配置和跳转 struts2的action配置和JSF的faces-config.xm ...
- [C#参考]锁定lock
Lock关键字解释: lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁. 下面的示例包含一个 lock 语句. lock 关键字可确保当一个线程位于代码的临界区 ...
- Hive学习之更改表的属性
1.修改表名 alter table table_name rename to new_table_name;2.修改列名 alter table tablename change col ...
- Hibernate知识总结(一)——Hibernate原理概述
一.Hibernate是什么: 它是一个持久化框架,它对JDBC进行了轻量级的封装,简化对数据库的操作,提高开发效率.和另一个持久化框架MyBatis一样,他们操作数据库都是通过一个session对象 ...
- Linux各个发行版本的介绍, 以及VirtualBox+CentOS的安装步骤
Linux和Unix系统有哪些主要的发行版本 Unix: (非开源传统商业操作系统) IBM AIX, HP HP-UX, Sun Solaris,等 各家硬件厂商的发行版本, 往往是和自家的硬件设备 ...
- Java基础之参数传递
public class ArgsTransfer { /* * 基本数据类型直接存储在变量中,函数参数传递时,是将变量中存储的数据拷贝,函数中改变形参,和调用处的实参是不同的变量,两边互不影响 * ...