任何复杂的东西都是由一些简单部分组合构成的,对于OSG创建的场景和对象也同样如此,它们是由简单的图元(我们把构成3D对象的构件成为图元)按照一定的方式排列和组合而成的,OSG中的所有图元都是一维或二维对象,包括点、线和复杂的多边形。

几何体(osg::Geometry)类,继承自osg::Drawable类,使用它用户可以通过指定顶点,颜色和法线的方式,绘制简单的线段,三角形,多边形,并将绘图的结果添加到场景的叶结点Geode中。一般步骤可分为:

1、建立新的Geometry实例,用于输入顶点,颜色等数据的变量数组

osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
osg::Vec3Array* vecarray = new osg::Vec3Array;     //顶点坐标数组
osg::UByteArray* vecindex = new osg::UByteArray;   //顶点索引数组
osg::Vec4Array* colarray = new osg::Vec4Array;     //颜色RGB值数组
osg::UByteArray* colindex = new osg::UByteArray;   //颜色索引数组
osg::Vec3Array* norarray = new osg::Vec3Array;     //法线坐标数组
osg::UByteArray* norindex = new osg::UByteArray;   //法线索引数组

2、向顶点坐标变量数组中输入顶点数据。向颜色数组中添加颜色数据,除了RGB值之外,还包括一个Alpha分量。

vecarray->push_back(osg::Vec3(1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, 1.0));
vecarray->push_back(osg::Vec3(-1.0, 0.0, -1.0));
vecarray->push_back(osg::Vec3(1.0, 0.0, -1.0));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));    //Whitenorarray->push_back(osg::Vec3(0.0, -1.0, 0.0));

3、向Geometry类设置数据

//指定向量数据
geometry->setVertexArray(vecarray);  //设置顶点数组
geometry->setVertexIndices(vecindex); //设置顶点索引数组
geometry->setColorArray(colarray);  //设置颜色数组
geometry->setColorIndices(colindex); //设置颜色索引数组
geometry->setNormalArray(norarray); //设置法线数组
geometry->setNormalIndices(norindex); //设置法线索引数组//设置绑定方式
geometry->setNormalBinding(osg::Geometry::BIND_PER_PRIMITIVE);  //设置法线绑定方式
geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX); //设置颜色绑定方式

说明:绑定方式主要有以下几种:

BIND_OFF                 //不启用绑定。此时,颜色数据或者法线数据与顶点数据完全没有关系,顶点数据的颜色和法线方向完全由缺省值决定
BIND_OVERALL             //绑定全部的顶点。此时,颜色数组或者法线坐标数组中只需要保存一个数据,该数据将影响此Geometry类的所有顶点坐标。
BIND_PER_PRIMITIVE_SET   //单个绘图单元绑定。此时,颜色数组或者法线坐标数组中保存的数据数量应当与用户将要绘制的几何体数量相同。
BIND_PER_PRIMITIVE       //单个独立的绘图基元绑定
BIND_PER_VERTEX          //单个顶点绑定。逐点绑定。比如上面的例子,将四个颜色数据分别绑定到四个顶点坐标,可以实现顶点颜色之间的过渡效果。

4、添加图元,绘图基元为四边形

//数据解析,向Geometry类添加几何体,并使用Geode类的addDrawable方法将Geometry类加入场景图形的某个叶节点。
//geometry->addPrimitiveSet(new osg::DeawArray(osg::PrimitiveSet::POINTS,vecarray->size()));
geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS,0,vecarray->size()));  //设置渲染方式geode->addDrawable(geometry.get());
root->addChild(geode.get());

说明:几何体的形状参数:

POINTS   //绘制点。绘制用户指定的所有顶点。
LINES   //绘制直线。直线的起点、终点由数组中先后相邻的两个点决定;用户提供的点不止两个时,将尝试继续绘制新的直线。
LINE_STRIP  //绘制多段直线。多段直线的第一段由数组中的前两个点决定;其余段的起点位置为上一段的终点坐标,而终点位置由数组中随后的点决定。
LINE_LOOP  //绘制封闭直线绘图方式与多段直线相同,但是最后将自动封闭该直线。
TRIANGLES   //绘制三角形。三角形的三个顶点由数组中相邻的三个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止三个时,将尝试继续绘制新的三角形。
TRIANGLE_STRIP  //绘制多段三角形。第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由上一段三角形的后两个点决定,第三点由数组中随后的一点决定。
TRIANGLE_FAN    //绘制三角扇面。第一段三角形的由数组中的前三个点决定;其余段三角形的绘制,起始边由整个数组的第一点和上一段三角形的最后一个点决定,第三点由数组中随后的一点决定。
QUADS   //绘制四边形。四边形的四个顶点由数组中相邻的四个点决定,并按照逆时针的顺序进行绘制;用户提供的点不止四个时,将尝试继续绘制新的四边形。
QUAD_STRIP  //绘制多段四边形。第一段四边形的起始边由数组中的前两个点决定,边的矢量方向由这两点的延伸方向决定;起始边的对边由其后的两个点决定,如果起始边和对边的矢量方向不同,那么四边形将会扭曲;其余段四边形的绘制,起始边由上一段决定,其对边由随后的两点及其延伸方向决定。
POLYGON //绘制任意多边形。根据用户提供的顶点的数量,绘制多边形。

OSG中的几何体绘制(一)相关推荐

  1. OSG三维渲染引擎编程学习之三十六:“第四章:OSG几何体绘制” 之 “4.1 OSG基础绘图类”

    目录 第四章 OSG几何体绘制 4.1 OSG基础绘图类 4.1.1 Drawable可绘制类 4.1.2 PrimitiveSet图元集 第四章 OSG几何体绘制

  2. UE4中三维几何总结——几何体

    UE4中三维几何总结--几何体 1.简述 2.基本图元 3.几何图元类型 3.1 凸面网格Convex Mesh 3.2 三角形网格Triangle Mesh 3.3 高度场Height Field ...

  3. 【D3D11游戏编程】学习笔记十一:基本几何体绘制

    (注:[D3D11游戏编程]学习笔记系列由CSDN作者BonChoix所写,转载请注明出处:http://blog.csdn.net/BonChoix,谢谢~) 这次我们来学习几种常见的基本几何体的绘 ...

  4. 使用Blender中的几何节点创建程序对象

    大小解压后:2.4G 持续时间3h 30m 1280X720 MP4 语言:英语+中英文字幕(根据原英文字幕机译更准确) 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几 ...

  5. osg中运用Shader(osg初级篇2)

    关于shader的概念,可以参见我的另一篇博客<opengl版本发展史及各种概念的厘清>,这里列举一个例子,用来实现一个特效,屏幕的左半部显示为红色.首先我们准备好两个shader程序: ...

  6. ArcObjects中的几何对象简介(一)

    几何对象是ArcObjects中使用最广泛的对象之一,用户在新建.删除.编辑何进行地理分析的时候,就是在处理一个包含几何形体的矢量对象.几何对象用于表达要素(Feature)或图形元素(Graphic ...

  7. osg中三维模型的位置变换

    对模型的平移和旋转等操作是我们在做三维软件开发时必然会解决的事情.但是由于基本变换默认是以世界坐标系的原点为变换中心,所以我们在进行平移旋转等操作时往往会发现其并非如我们想象的那样去执行.举个简单的例 ...

  8. cacheinterceptor第二次访问没被调用_访问者设计模式在OSG中的应用

    为什么要谈谈访问者设计模式呢?因为OSG整个引擎就是用访问者设计模式建立起来的,不论是遍历节点图,还是做各种实用的功能,都需要大量的用到访问者设计模式. 先谈谈访问者设计模式的定义. 1:什么是访问者 ...

  9. 3DMAX文件导入到OSG中。

    插件地址在 http://sourceforge.net/projects/osgmaxexp/files/OpenSceneGraph%20Max%20Exporter/1.0.2/ 有win2版本 ...

最新文章

  1. 官宣!VS Code Python 全新功能在 PyCon China 全球首发!
  2. 用文件fw读写链表_用FORTRAN95写的sgy文件读写程序
  3. Python PIL | Image.resize() 裁剪 缩放图片
  4. JAVA——RSA加密与解密
  5. python datatime 平均值_python-熊猫时间序列:时间戳列的平均值
  6. bootstrap php 多行,使用PHP循环将Bootstrap行和正确的列号添加到元素
  7. 曼秀雷敦搜索引擎营销方案_搜索引擎营销——被严重低估的互联网营销途径
  8. 把矩阵变为0,1矩阵
  9. 大图书馆 #2 大教堂与集市
  10. 树莓派-11-3又1/2位数字万用表使用说明书
  11. ai面试的优缺点_被AI程序面试是一种怎样的体验?该如何准备!!!
  12. Ubuntu 20.04 搭建hadoop 集群
  13. linux切换中文拼音快捷键,Fedora 16下调出中文拼音输入法
  14. 使用D3渲染中国地图
  15. 阿里云sms短信服务
  16. 个人邮箱Outlook登录入口在哪,遇到登录邮箱服务器配置错误的解决办法
  17. 打印机在不同操作系统的打印区别
  18. 安装Chrome Restlet Client插件
  19. 产业集群理论及其生态学特性
  20. STM32开发实例 基于STM32单片机的智能机房系统

热门文章

  1. SM4、AES,RSA,DES等加解密,以及一些其他常用工具方法整理
  2. Unity中的shadows(二)cast shadows
  3. NOIP2011 统计单词数(通俗易懂版本)
  4. android adb命令 抓取系统各种 log
  5. 女性茶友可以喝普洱熟茶吗?
  6. 高通安卓msm8909适配gt1xx系列的TP
  7. c语言课程设计图书管理系统报告,C语言图书管理系统课程设计报告[1]
  8. vue中监视$route
  9. DEBUG命令详解——计算机系统基础
  10. vue 的 this.$refs 为undefined