没有合适的资源?快使用搜索试试~ 我知道了~
美国海军(NPS)的OSG教程
5星 · 超过95%的资源 需积分: 0 57 下载量 51 浏览量
2008-09-12
14:49:45
上传
评论 2
收藏 1.01MB PDF 举报
温馨提示
试读
80页
NPS的OSG教程由美国海军研究生学校(Naval Postgraduate School)的军事教员Joseph Sullivan编写,最早用于该校计算机专业和模型虚拟环境与仿真专业(MOVES)的课程,深入浅出,反响十分热烈。对于OSG的初学者是一份不可多得的网络教程。Joseph Sullivan同时还是Delta3D引擎(http://www.delta3d.org)的开发成员之一。
资源推荐
资源详情
资源评论
1 / 80
美国海军(NPS)的 OSG 教程
第一课 OpenSceneGraph 几何体的绘制 ........................................................................................................................... 2
第二课 使用 StateSet 创建带有纹理的几何体 ............................................................................................................... 5
第三课 使用内嵌几何形状(Shape)对象,改变渲染状态 ........................................................................................ 8
第四课 StateSet 的工作流程 ......................................................................................................................................... 10
第五课 从文件加载模型并放置在场景中 .................................................................................................................... 11
第六课 osgText,抬头显示(HUD),渲染元(RenderBin) ................................................................................... 13
第七课 搜索并控制开关节点和 DOF(自由度)节点 ................................................................................................ 17
第八课 使用更新回调来更改模型 ................................................................................................................................ 23
第九课第一节 处理键盘输入 ........................................................................................................................................ 26
第九课第二节 处理键盘输入实现更新回调 ................................................................................................................ 29
第十课第一节 使用自定义矩阵来放置相机 ................................................................................................................ 32
第十课第二节 实现跟随节点的相机 ............................................................................................................................ 34
第十课第三节 环绕(始终指向)场景中节点的相机 ................................................................................................ 38
第十课第四节 如何获取节点在世界坐标的位置 ........................................................................................................ 40
第十一课第一节 使用两个独立的摄像机浏览场景 .................................................................................................... 42
第十一课第二节 使用多个独立的摄像机观察场景(基于 OSG 1.2 版本)............................................................ 47
第十二课第一节 使用 OpenGL 顶点着色器和片元着色器 ....................................................................................... 52
第十二课第二节 向着色器传递变量数据 .................................................................................................................... 54
第十二课第三节 更新着色器 ...................................................................................................................................... 56
第十二课第四节 如何快速实现渐灰效果 .................................................................................................................... 59
第十四课 交集测试 ........................................................................................................................................................ 65
第十五课第一节 向场景中添加 osgParticle 粒子效果 ................................................................................................ 69
第十五课第二节 粒子系统的保存以及读取 ................................................................................................................ 74
第十六课第一节 节点遮掩概述(基于 OSG 1.2 版本) ............................................................................................. 75
第十六课第二节 节点遮掩示例(基于 OSG 1.2 版本) ............................................................................................. 76
2 / 80
第一课 OpenSceneGraph 几何体的绘制
本章将介绍一些创建几何体元素的方法。通常我们有这样几种处理几何体的手段:底层手段是使用松散封装的
OpenGL 基元;中级手段是使用 OpenSceneGraph 的基本几何体;高级手段是从文件读入模型。本章教程将主要
介绍底层手段的实现方法。这种实现具有很强的灵活性,相应的工作量 也比较大。应用于场景图形级别的几何
体通常是从文件读入的,因而顶点的跟踪和处理工作将由文件读取插件完成。
背景 ¶
下面将对几个常用的类作简要的介绍:
Geode 类
Geode 类派生自 Node 节点类。节点类(包括 Geode)可以作为场景图形的叶节点添加。Geode 类的实例可以与任
意多个可绘制对象 Drawable 类相关联。
Drawable 类
作为可绘制对象基类的 Drawable 类是一个纯虚类,它有六个派生类。其中 Geometry 类中可以直接指定顶点数据,或者指定任意数
目的几何基元 PrimitiveSet 类与其关联。
顶点和顶点属性数据(颜色,法线,纹理坐标)是保存在数组中的。多个顶点可以共享同一种颜色,法线和纹理坐标,同时我们还
可以使用索引将顶点数组映射给颜色,法线或纹理坐标的数组。
PrimitiveSet 类
这个类松散地封装了 OpenGL 的绘图基元,包括点(POINTS),线(LINES),多段线(LINE_STRIP),封闭线
(LINE_LOOP),四边形(QUADS),多边形(POLYGON)等。
代码 ¶
下面的代码将设置一个用于显示场景的视窗,一个作为场景图形根节点的 Group 类实例,一个用于记录可绘制
对象(Drawable)的几何体节点(Geode),以及一个记录顶点和顶点相关数据的 Geometry 类实例。本例中我们
将渲染一个金字塔的形状。
...
int main()
{
...
osg::Group* root = new osg::Group();
osg::Geode* pyramidGeode = new osg::Geode();
osg::Geometry* pyramidGeometry = new osg::Geometry();
现在我们将金字塔几何体与 Geode 关联,并将 Geode 叶节点添加到场景图形的根节点。
pyramidGeode->addDrawable(pyramidGeometry);
root->addChild(pyramidGeode);
3 / 80
声明一个顶点数组。每个顶点有三个坐标值,也就是一个 Vec3 类的实例。osg::Vec3Array 类的实例可以用来保
存顶点数组。它派生自 STL 库的 vector 模板,因此我们可以使用 push_back 方法向其中追加数组元素。该方法
的作用是在向量数组的末尾添加一个元素,因此数组中第一 个元素的索引值为 0,紧随其后的第二个元素为
1,以此类推。
我们使用 Z 轴向上的右手坐标系作为参照,数组元素 0-4 用于表达金字塔形体的五个顶点。
osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
pyramidVertices->push_back( osg::Vec3( 0, 0, 0) ); // 左前
pyramidVertices->push_back( osg::Vec3(10, 0, 0) ); // 右前
pyramidVertices->push_back( osg::Vec3(10,10, 0) ); // 右后
pyramidVertices->push_back( osg::Vec3( 0,10, 0) ); // 左后
pyramidVertices->push_back( osg::Vec3( 5, 5,10) ); // 塔尖
将这一顶点集合关联到 Geometry 实例上,后者已经与场景的 Geode 叶节点相关联。
pyramidGeometry->setVertexArray( pyramidVertices );
现在我们创建几何基元类 PrimitiveSet 的实例并添加到金字塔几何体上。金字塔底部的四个点组成一个基面,
可以使用 DrawElementsUint 类来实现。这个类同样继承自 STL 库的 vector 模板,我们可以使用 push_back 顺
序向其中添加元素。为了保证 背面剔除(backface cullling)的正确,我们需要按照逆时针的顺序添加顶点数
据。类的构造函数使用几何基元枚举类型(与 OpenGL 的几何基元枚举类型相同)作为输入 参数,另一个输入参
数是作为起始点的顶点索引值。
osg::DrawElementsUInt* pyramidBase =
new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);
pyramidBase->push_back(3);
pyramidBase->push_back(2);
pyramidBase->push_back(1);
pyramidBase->push_back(0);
pyramidGeometry->addPrimitiveSet(pyramidBase);
重复这一过程,添加金字塔的每个面。再次注意,顶点是以逆时针为顺序添加的。
osg::DrawElementsUInt* pyramidFaceOne =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
pyramidFaceOne->push_back(0);
pyramidFaceOne->push_back(1);
pyramidFaceOne->push_back(4);
pyramidGeometry->addPrimitiveSet(pyramidFaceOne);
osg::DrawElementsUInt* pyramidFaceTwo =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
pyramidFaceTwo->push_back(1);
pyramidFaceTwo->push_back(2);
pyramidFaceTwo->push_back(4);
pyramidGeometry->addPrimitiveSet(pyramidFaceTwo);
4 / 80
osg::DrawElementsUInt* pyramidFaceThree =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
pyramidFaceThree->push_back(2);
pyramidFaceThree->push_back(3);
pyramidFaceThree->push_back(4);
pyramidGeometry->addPrimitiveSet(pyramidFaceThree);
osg::DrawElementsUInt* pyramidFaceFour =
new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
pyramidFaceFour->push_back(3);
pyramidFaceFour->push_back(0);
pyramidFaceFour->push_back(4);
pyramidGeometry->addPrimitiveSet(pyramidFaceFour)
定义一个 Vec4 的数组,用于保存颜色值。
osg::Vec4Array* colors = new osg::Vec4Array;
colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //索引 0 红色
colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); //索引 1 绿色
colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); //索引 2 蓝色
colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //索引 3 白色
下一步要将顶点数组的元素与颜色数组的元素对应起来。我们将声明一个与顶点数组有相同个数元素的向量
组。它将负责连接各个顶点与颜色。该向量组的索 引对应顶点数组的元素,其取值对应颜色数组的索引。如果
需要将顶点数组与法线数组或者纹理坐标数组一一对应,那么还需重复这一步骤。
注意在本例中,我们需要将 5 个顶点对应到 4 种颜色上。因此顶点数组的元素 0(左下)和元素 4(塔尖)都需
要对应到颜色数组元素 0(红色)上。
osg::TemplateIndexArray
<unsigned int, osg::Array::UIntArrayType,4,4> *colorIndexArray;
colorIndexArray =
new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4>;
colorIndexArray->push_back(0); // vertex 0 assigned color array element 0
colorIndexArray->push_back(1); // vertex 1 assigned color array element 1
colorIndexArray->push_back(2); // vertex 2 assigned color array element 2
colorIndexArray->push_back(3); // vertex 3 assigned color array element 3
colorIndexArray->push_back(0); // vertex 4 assigned color array element 0
下一步,我们将颜色数组以及刚才创建的颜色索引数组与几何体相关联,并设置绑定模式为“按顶点绑定”。
pyramidGeometry->setColorArray(colors);
pyramidGeometry->setColorIndices(colorIndexArray);
pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
osg::Vec2Array* texcoords = new osg::Vec2Array(5);
(*texcoords)[0].set(0.00f,0.0f);
(*texcoords)[1].set(0.25f,0.0f);
5 / 80
(*texcoords)[2].set(0.50f,0.0f);
(*texcoords)[3].set(0.75f,0.0f);
(*texcoords)[4].set(0.50f,1.0f);
pyramidGeometry->setTexCoordArray(0,texcoords);
现在我们已经创建了一个几何体节点,并将其添加到场景中。其中的几何体是可以复用的,例如,如果我们希
望在第一个金字塔右侧 15 个单位再放置第二个金字塔,那么我们可以将这个 Geode 节点作为位置变换节点的子
节点,并再次添加到场景当中。
//初始化位置变换节点
osg::PositionAttitudeTransform* pyramidTwoXForm =
new osg::PositionAttitudeTransform();
//使用 osg::Group 的 addChild 方法,将位置变换节点添加到根节点的子节点上,并将金字塔节点作为变换节点
的子节点
root->addChild(pyramidTwoXForm);
pyramidTwoXForm->addChild(pyramidGeode);
// 初始化一个 Vec3 实例,用于改变模型在场景中的位置
osg::Vec3 pyramidTwoPosition(15,0,0);
pyramidTwoXForm->setPosition( pyramidTwoPosition );
最后,设置视窗类并进入仿真循环。
osgViewer::Viewer viewer;
viewer.setSceneData( root );
viewer.run();
第二课 使用 StateSet 创建带有纹理的几何体
目标:
向使用 OpenGL 基元绘制的基本几何体添加纹理。
背景 ¶
上一个教程介绍了使用 OpenGL 基元创建基本几何体并在视窗中浏览的方法。本章将介绍如何向几何体添加纹
理。为了使代码易于阅读,我们将有关金字塔绘制的代码封装到一个函数中,并返回一个 Geode 指针。代码如
下所示:
osg::Geode* createPyramid()
{
osg::Geode* pyramidGeode = new osg::Geode();
osg::Geometry* pyramidGeometry = new osg::Geometry();
pyramidGeode->addDrawable(pyramidGeometry);
// 指定顶点
osg::Vec3Array* pyramidVertices = new osg::Vec3Array;
pyramidVertices->push_back( osg::Vec3(0, 0, 0) ); // 左前
剩余79页未读,继续阅读
资源评论
- oucC2292020-07-12osg入门初级教程,入门必备
butlerqq
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- python-leetcode面试题解之第157题用Read4读取N个字符-题解.zip
- python-leetcode面试题解之第156题上下翻转二叉树-题解.zip
- python-leetcode面试题解之第155题最小栈-题解.zip
- python-leetcode面试题解之第153题寻找旋转排序数组中的最小值-题解.zip
- python-leetcode面试题解之第152题乘积最大子数组-题解.zip
- python-leetcode面试题解之第151题反转字符串中的单词-题解.zip
- python-leetcode面试题解之第150题逆波兰表达式求值-题解.zip
- python-leetcode面试题解之第149题直线上最多的点数-题解.zip
- python-leetcode面试题解之第148题排序链表-题解.zip
- python-leetcode面试题解之第147题对链表进行插入排序-题解.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功