osg初级教程

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

几何体的绘制

概述

本章将介绍一些创建几何体元素的方法。通常我们有这样几种处理几何体的手段:底层手段是使用松散封装的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);

声明一个顶点数组。每个顶点有三个坐标值,也就是一个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);

相关文档
最新文档