osg基本图元

OSG绘制几何体学习总结(超全)

在osg中,场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率

场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息。根节点和各个组节点都可以有零个(实际上是没有执行任何操作)或多个子成员。在场景图形的最底部,各个叶节点包含了构成场景中物体的实际几何信息。


         首先,必须明确的是,在应用程序中所有几何体的渲染都必须与Geode节点相关联。在osg::Geode类中,也提供了addDrawable()函数来关联应用程序中需要渲染的几何体信息。一个Geode可以包含多个Drawable,Geode维护了一个Drawable的列表因此在OSG中我们想要绘制诸如三角形等.最终需要使用的肯定还是Geode叶子节点.然后将Drawable通过addDrawable()方法加入Geode下...实际上要生成几何体adddrawable()的要么是一个Geomety,要么是一个shapedrawable。

          在osg中,通常有三种生成几何体的手段:一是松散封装的OpenGL绘图基元osg::Geometry,二是使用OSG中预定义的基本几何体;三是从文件中导入场景模型。

不管是松散封装的OpenGL的绘图基元,还是osg自己预定义的几何体,其基类都是osg::Drawable,它派生自osg::Object(该类派生自osg::referenced),具体继承关系如下图所示,


注意:最常用的是DrawPixels,Geometry,shapedrawable,osgText::TextBase

其中:DrawPixels用于绘制图像,具体用法如下:

osg::DrawPixels* pixels = new osg::DrawPixels();
pixels->setPosition(osg::Vec3((float)vX[0],(float)vY[1] ,(float)vZ[1])); 
QString imagePath = ::GetImagePath() + pWell->GetWellSymbol();
pixels->setImage(osgDB::readImageFile(imagePath.toStdString()));
//声明一个图片节点
osg::Geode* imagNode = new osg::Geode();
imagNode->addDrawable(pixels);

osgText用于绘制文字,具体用法如下:

QString strFont1 = ::GetImagePath() + "fonts/MicroSoftYahei.ttf";
QTextCodec *code = QTextCodec::codecForName("gb18030");
std::string strFont2 = strFont1.toStdString();
if( code )
{
strFont2 = code->fromUnicode(strFont1).data(); 
}
{
m_pText = new osgText::Text;
m_pText->setDataVariance(osg::Object::DYNAMIC); 
//p->setUseDisplayList(false);
m_pText->setFont(strFont2 );


m_pText->setDrawMode(osgText::Text::TEXT);
m_pText->setFontResolution(15,15);
m_pText->setCharacterSize(15);
m_pText->setAlignment(osgText::Text::CENTER_CENTER );
m_pText.setAxisAlignment(osgText::Text::SCREEN);//让文字所在平面始终对着屏幕
m_pText->setColor(osg::Vec4f(0,0,0,1) );
}


m_pGeode = new osg::Geode();
m_pGeode->clone( osg::CopyOp::DEEP_COPY_ALL );
 
m_pGeode->addDrawable( m_pText );


m_pSwitch = new osg::Switch;
m_pSwitch->addChild( m_pGeode  );

下面重点讲解Geometry和ShapeDrawable。

在实际应用中,往场景里面添加一个几何体,都必须先定义个geode,osg::Geode* geode = new osg::Geode;

然后要么用自定义几何体osg::Shape,使用方式:geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::vec3(0.0f,0.0f,0.0f),radius),hints.get()));

osg中提供了大量的预定义几何体,来简化场景的绘制,继承关系如图所示。如果要渲染这些几何体,必须将其挂到某个geode下面,但是geode只能通过adddrawable添加osg::drawable类型,因此实际应用中提供了osg::ShapeDrawable来完成这个功能。在该类的构造函数中提供了关联osg::Shape的方法:

ShapeDrawable(Shape * shape,TessellationHints * hints=0)//第一个参数即为要绘制的几何体,第二个为网格化类,主要用于设置几何体的精细程度


要么用Geometry,使用方式:

        osg::ref_ptr<osg::Geode> geode1 = new osg::Geode();
osg::ref_ptr<osg::Geometry> geom1 = new osg::Geometry();
//创建顶点数组
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();
v->push_back(osg::Vec3(458000,0,-1500));
v->push_back(osg::Vec3(458000,0,-2750));
v->push_back(osg::Vec3(452000,0,-2750));
v->push_back(osg::Vec3(452000,0,-1500));
geom1->setVertexArray(v.get());

//设置颜色数组
osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array();
vc->push_back(osg::Vec4(1.0f,0.0f,0.0f,1.0f));
vc->push_back(osg::Vec4(0.0f,1.0f,0.0f,1.0f));
vc->push_back(osg::Vec4(0.0f,0.0f,1.0f,1.0f));
vc->push_back(osg::Vec4(1.0f,1.0f,0.0f,1.0f));
geom1->setColorArray(vc.get());
geom1->setColorBinding(osg::Geometry::BIND_PER_VERTEX);

       //设置法线数组
osg::ref_ptr<osg::Vec3Array> nc = new osg::Vec3Array();
nc->push_back(osg::Vec3(0,1,0));
geom1->setNormalArray(nc.get());
geom1->setNormalBinding(osg::Geometry::BIND_OVERALL);

//添加图元,绘图基元为四边形
geom1->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));
geode1->addDrawable(geom1.get());
m_pRootSwitch->addChild(geode1);

上一段程序中还设置了颜色数据,法线数据与顶点数据绑定的方式,即setColorBindingsetNormalBinding,绑定数据的方式有以下几种:

BIND_OFF

取消绑定

此时,颜色数据或者法线数据与顶点数据完全没有关系,顶点数据的颜色和法线方向完全由缺省值决定。

BIND_OVERALL

绑定全部几何体

此时,颜色数组或者法线坐标数组中只需要保存一个数据,该数据将影响此Geometry类的所有顶点坐标。例如,将红色绑定到全部几何体上,则这个类绘制出的所有物体均是红色的。

BIND_PER_PRIMITIVE

绑定逐个几何体

此时,颜色数组或者法线坐标数组中保存的数据数量应当与用户将要绘制的几何体数量相同。例如,用户依据8个顶点来绘制两个四边形时,可以分别为它们设置两个法线坐标,并使用此参数进行绑定。

BIND_PER_VERTEX

绑定逐个点

逐点绑定。比如上面的例子,将四个颜色数据分别绑定到四个顶点坐标,可以实现顶点颜色之间的过渡效果。



osg::PrimitiveSet类,该类主要松散封装了OpenGL的绘图基元,通过指定绘图基元来指定几何体顶点将采用哪一种或几种基元绘制。继承关系如下图所示,



PrimitiveSet:提供了opengl顶点数组绘图命令的高层次支持。用户可以从Geometry中获得保存的数据,再使用这个类制定要绘制的几何体数据的类型

在给geometry设置完顶点、颜色、法线、纹理以后,必须通过

geom1->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,4));

来指定要利用这些数据生成一个怎么样的形状。

该行代码中,使用DrawArrays类向Geometry类送入了新几何体的信息,即,该几何体是一个QUADS,它的顶点坐标从索引数组中读入,从第1个索引值开始,共读入4个索引值,组成一个四边形图形。

几何体的形状参数除了QUADS之外,还有数种方式,以用于不同的用户需求,列表如下:

POINTS

绘制点

绘制用户指定的所有顶点。

LINES

绘制直线

直线的起点、终点由数组中先后相邻的两个点决定;用户提供的点不止两个时,将尝试继续绘制新的直线。

LINE_STRIP

绘制多段直线

多段直线的第一段由数组中的前两个点决定;其余段的起点位置为上一段的终点坐标,而终点位置由数组中随后的点决定。

LINE_LOOP

绘制封闭直线

绘图方式与多段直线相同,但是最后将自动封闭该直线。

TRIANGLES

绘制三角形

三角形的三个顶点由数组中相邻的三个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止三个时,将尝试继续绘制新的三角形。

TRIANGLE_STRIP

绘制多段三角形

第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由上一段三角形的后两个点决定,第三点由数组中随后的一点决定。

TRIANGLE_FAN

绘制三角扇面

第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由整个数组的第一点和上一段三角形的最后一个点决定,第三点由数组中随后的一点决定。

QUADS

绘制四边形

四边形的四个顶点由数组中相邻的四个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止四个时,将尝试继续绘制新的四边形。

QUAD_STRIP

绘制多段四边形

第一段四边形的起始边由数组中的前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形将会扭曲;其余段四边形的绘制,起始边由上一段决定,其对边由随后的两点及其延伸方向决定。

POLYGON

绘制任意多边形

根据用户提供的顶点的数量,绘制多边形。



和opengl对比:

osg::PrimitiveSet::POINTS对应OpenGL中的GL_POINTS绘制单独的点
osg::PrimitiveSet::LINES对应OpenGL中的GL_LINES绘制每两点连接的线
osg::PrimitiveSet::LINE_STRIP对应OpenGL中的GL_LINE_STRIP绘制依次连接各点的线
osg::PrimitiveSet::LINE_LOOP对应OpenGL中的GL_LINE_LOOP绘制依次连接各点的线,首尾相连
osg::PrimitiveSet::POLYGON对应OpenGL中的GL_POLYGON绘制依次连接各点的多边形
osg::PrimitiveSet::QUADS对应OpenGL中的GL_QUADS绘制依次连接每四点的四边形
如:1、2、3、4、5、6、7、8点 绘制结果1、2、3、4组成四边形,5、6、7、8组成四边形
osg::PrimitiveSet::QUAD_STRIP对应OpenGL中的GL_QUAD_STRIP绘制四边形
如:1、2、3、4、5、6、7、8点 绘制结果1、2、3、4组成四边形,3、4、5、6组成四边形、5、
6、7、8组成四边形
osg::PrimitiveSet::TRIANGLES对应OpenGL中的GL_TRIANGLES绘制每三点连接的三角形
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,4、5、6组成三角形
osg::PrimitiveSet::TRIANGLE_STRIP对应OpenGL中的GL_TRIANGLE_STRIP
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,2、3、4组成三角形,3、4、5组成三角
形4、5、6组成三角形
osg::PrimitiveSet::TRIANGLE_FAN对应OpenGL中的GL_TRIANGLE_FAN
如:1、2、3、4、5、6点 绘制结果1、2、3组成三角形,1、3、4组成三角形,1、4、5组成三角
形,1、5、6组成三角形

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用css设计出商品购物图片

代码&#xff1a; 常见问题&#xff1a;背景填充时候图片大小不一致、重复等等问题&#xff0c;建议在插入图片的时候最好不用img标签直接在div中添加背景图片&#xff0c;有利于对背景图片的更改。 插入图片&#xff1a;background-image: url(../img/product-auto/benz-amg-s…

OLTP、OLAP与HTAP 区别

OLTP On-Line Transaction Processing联机事务处理过程(OLTP) 也称为面向交易的处理过程&#xff0c;其基本特征是前台接收的用户数据可以立即传送到计算中心进行处理&#xff0c;并在很短的时间内给出处理结果&#xff0c;是对用户操作快速响应的方式之一。 这样做的最大优点…

osg布告板技术(Billboard)

公告牌技术,即billboard技术,在3D游戏中有着广泛的应用.它的本质就是用预先做好的几幅 位图来代替3D物体,极大地节省资源和提高速度.仔细观察<<魔法门>>系列游戏,它的精灵,树木,物 品都是二维图象,但由于它始终朝向观察者,你根本看不到它"扁"的一面,所以…

osg坐标系转换

osg中将局部坐标系下的点坐标换算成全局坐标系下点的坐标 标签&#xff1a; matrixlist2012-05-17 16:27 2940人阅读 评论(1) 收藏 举报分类&#xff1a;osg&#xff08;7&#xff09; 坐标变换版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 今天…

C#/WPF 播放音频文件

C#播放音频文件的方式&#xff1a; 播放系统事件声音使用System.Media.SoundPlayer播放wav使用MCI Command String多媒体设备程序接口播放mp3&#xff0c;wav&#xff0c;avi等使用WindowsMediaPlayer的COM组件来播放(可视化)使用DirectX播放音频文件使用Speech播放(朗读器&am…

Hbase 二级索引 Solr int字段排序问题 can not sort on multivalued field

Hbase Solr 同步二级索引后&#xff0c;进行int字段排序时报错 报错如下 {"responseHeader":{"zkConnected":true,"status":400,"QTime":75,"params":{"q":"*:*","sort":"hbase_index…

OpenGL渲染管线,着色器,光栅化等概念理解

卧槽&#xff0c;前些日子看这几个概念就十分想吐槽&#xff0c;这么难理解的概念窃以为纯属翻译的不够接地气。————首先&#xff0c;光栅化&#xff08;Rasterize/rasteriztion&#xff09;。这个词儿Adobe官方翻译成栅格化或者像素化。没错&#xff0c;就是把矢量图形转化…

Hbase Solr 二级索引 同步int数据报错com.ngdata.hbaseindexer.parse.ByteArrayValueMappers: Error mapping byte

二级索引实现方式&#xff1a;Hbase Key-Value Store Indexer Solr 同步int数据时提示异常 异常如下 2019-12-16 17:39:18,346 WARN com.ngdata.hbaseindexer.parse.ByteArrayValueMappers: Error mapping byte value 101 to int java.lang.IllegalArgumentException: off…

CDH 6 安装 Hbase 二级索引 Solr + Key-Value Store Indexer

目录 一、集群安装Solr Key-Value Store Indexer 二、创建Hbase二级索引 1.更改表结构&#xff0c;允许复制 2.创建相应的SolrCloud集合 3.创建 collection实例并将配置文件上传到 zookeeper 4.创建 Lily HBase Indexer 配置 5.配置Morphline文件 6.注册 Lily HBase I…

glClipPlane剪裁平面

glClipPlane裁剪平面 (2012-02-21 12:49:18) 转载▼标签&#xff1a; 半平面 裁剪 线框 球体 表示 杂谈 分类&#xff1a; OPENGL void glClipPlane(GLenum plane, const GLdouble *equation); 定义一个裁剪平面。equation参数指向平面方程Ax By Cz D …

html思维导图

网页版&#xff1a;https://www.processon.com/view/link/5a658afae4b010a6e728e492

c#事件和委托

一、委托(Delegate) 1、定义 delegate是C#中的一种类型&#xff0c;它实际上是一个能够持有对某个方法的引用的类。与其它的类不同&#xff0c;delegate类能够 拥有一个签名&#xff08;signature&#xff09;&#xff0c;并且它"只能持有与它的签名相匹配的方法的引用&qu…

MonoBehaviour常用方法

1.Start()在Update方法被调用之前开始调用Start方法&#xff0c;而且Start方法在整个MonoBehaviour生命周期内只被调用一次。Awake和Start不同的地方在于Start方法仅仅在脚本初始化后被调用&#xff0c;这样允许你延迟加载任何代码&#xff0c;直到代码真正被使用时。Awake方法…

CDH6.x Solr7.x 集成 Ik 分词

下载ik相关jar包&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/19fydKWw15g8rPg4LW1cOtw 提取码&#xff1a;f2l8 在CDH安装目录下 查找CDH6 solr 的启动目录 [roothostname1 ~]# find /opt -name WEB-INF |grep solr /opt/cloudera/parcels/CDH-6.0.0-1.cdh6.0.0.p…

行为树的原理及实现

查阅了一些行为树资料&#xff0c;目前最主要是参考了这篇文章&#xff0c;看完后感觉行为树实乃强大&#xff0c;绝对是替代状态机的不二之选。但从理论看起来很简单的行为树&#xff0c;真正着手起来却发现很多细节无从下手。 总结起来&#xff0c;就是&#xff1a; 1、行为树…

Unity 3D中的射线与碰撞检测

在我们的游戏开发过程中&#xff0c;有一个很重要的工作就是进行碰撞检测。例如在射击游戏中子弹是否击中敌人&#xff0c;在RPG游戏中是否捡到装备等等。在进行碰撞检测时&#xff0c;我们最常用的工具就是射线&#xff0c;Unity 3D的物理引擎也为我们提供了射线类以及相关的函…

HugeGraphServer 部署安装

官方文档链接&#xff1a;https://hugegraph.github.io/hugegraph-doc HugeGraphServer Quick Start 1 概述 HugeGraph-Server 是 HugeGraph 项目的核心部分&#xff0c;包含Core、Backend、API等子模块。 Core模块是Tinkerpop接口的实现&#xff0c;Backend模块用于管理数…

JanusGraph: 可视化 Gephi 插件安装

下载地址 https://gephi.org/ 安装 下一步默认安装即可 打开安装插件 打开后发现提示无法连接&#xff0c;并且可用插件显示为0 &#xff08;我更新过所以不为0&#xff09; 点击“代理配置” 设置代理 安装插件 Graph Streaming 继续 重新启动&#xff0c;安装完成 点击概…

JanusGraph(HugeGraph通用): 可视化 GraphEXP 插件安装

JanusGraph&#xff1a; 可视化 Gephi 插件安装可参考&#xff1a;https://datamining.blog.csdn.net/article/details/103894994 下载地址&#xff1a;https://github.com/bricaud/graphexp 安装 解压&#xff0c;在根目录下修改 graphexp.html <div class"nav inp…