简单osg图形绘制

更新时间:2023-11-13 18:20:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

使用vc++ 9.0建立简单的场景图形

一、创建vc++工程

打开vc++应用程序,在菜单栏中选择“文件”->“新建”->“项目”。出现新建项目对话框。在左侧的“项目类型”中,选择“Visual C++”->“win 32”,在右侧选择“win32 控制台应用程序”,在下面的“名称”编辑框内输入工程名,选择工程的位置,点击“确定”。如图所示:

在跳出的“win32 应用程序向导”中点击“完成”。

二、Osg源码的建立及分析

2.1 代码分析

此时生成的工程中,stdafx.h 、targetver.h、 stdafx.cpp均是vc++程序自己创建的,我们自己的代码的主函数则是写在工程名同名的cpp文件中。 例程:绘制直线

#include \

#include #include #include

#include

#include

int _tmain(int argc, _TCHAR* argv[]) {

1 osg::ref_ptr root = new osg::Group;

2 osg::ref_ptr pa1 = new osg::PositionAttitudeTransform; 3 root->addChild(pa1.get());

4 osg::Vec3 pStart = osg::Vec3(0,0,0); 5 osg::Vec3 pEnd = osg::Vec3(0.5,0,0); 6 pa1->setPosition(pStart);//节点pa1的位置

7 osg::Vec3Array* coords = new osg::Vec3Array; 8 coords->push_back(pStart); 9 coords->push_back(pEnd);

10 osg::Vec3Array* normals = new osg::Vec3Array; 11 normals->push_back(osg::Vec3(0.0f,0.0f,1.0f));

12 osg::Vec4Array* colors = new osg::Vec4Array;

13 colors->push_back(osg::Vec4(1.0f,0.0f,0.0f,1.0f));

14 osg::ref_ptr geom = new osg::Geometry; 15 geom->setVertexArray(coords); 16 geom->setNormalArray(normals);

17 geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 18 geom->setColorArray(colors);

19 geom->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE); 20 geom->addPrimitiveSet(new

osg::DrawArrays(osg::PrimitiveSet::LINES,0,2));

21 osg::ref_ptr geode = new osg::Geode; 22 geode->addDrawable(geom.get()); 23 pa1->addChild(geode.get());

24 osg::Vec3 yawAxis(1.f, 0.f, 0.f ); //x轴 25 osg::Vec3 pitchAxis(0.f, 1.f, 0.f ); //y轴 26 osg::Vec3 rollAxis( 0.f, 0.f, 1.f ); //z轴

//旋转四元数,绕y轴逆时针(从正方向看)旋转°

27 osg::Quat q1(0, yawAxis, osg::PI/2.0,pitchAxis, 0, rollAxis); 28 //pa1->setAttitude(q1);//对节点pa1进行旋转

29 osg::ref_ptr viewer = new osgViewer::Viewer; 30 viewer->setSceneData(root.get()); 31 viewer->realize(); 32 viewer->run();

}

这个程序主要包括以下几个部分: (1) 建立根节点;

(2) 建立位置属性变换节点,对其进行设置,并将其加到根节点上;

(3) 建立几何节点,即线段。对其属性进行设置,并将其加到属性变换节点上。 (4) 将根节点加到场景图形中,并将其显示出来。

下面对代码的每一步进行解析: 1.建立根节点root,该根节点由于有子节点,因此是group类型。模板类ref_ptr<>是OSG 提供的一种自动的“废弃物”收集系统,它使用一种名为内存引用计数器(referencecounted memory)的方式工作。所有的OSG 场景图形节点均采用引用计数(reference count)的方式,当引用计数值减为0 时,此对象将被自动释放。详细内容参看OpenSceneGraph_Quick_Start_Guide(《OpenSceneGraph快速入门指导》)一书的相关章节。 2.创建位置属性变换类对象,osg::PositionAttitudeTransform继承自osg::Group类。 3.将位置属性变换节点设置为根节点的子节点,get()函数返回该节点的指针。 4. osg::Vec3是由osg::Vec3f类转换而来,即typedef osg::Vec3f osg::Vec3。该类存储了三个float类型的数据,这里用来保存点在三维空间中的坐标。这里设置开始点在局部坐标系下的坐标为(0,0,0)。

5.点在局部坐标系下的坐标为(0.5,0,0)。 6.设置位置变换节点的位置。

7. osg::Vec3Array类是数组,该数组的每一项保存的都是一个有三个float数据的点。这里用来保存要绘制图形的点的坐标。 8.将线段的开始点放入该数组中。 9.将线段的结束点放入该数组中。

10.这个数组保存的是图形的法线数据。

11.将法线(0,0,1)压入数组。法线不同会影响光照的效果。

12.osg::Vec4Array与osg::Vec3Array相似,数组的每一项保存的是有四个float数据的点,这里用来保存颜色的值。

13.将颜色数据(1.0f,0.0f,0.0f,1.0f)压入数组。前三个值是红绿蓝三个颜色的值,第四个是透明度,四个数据均在0~1之间。这里设置的是红色。更加详细的内容参看opengl关于颜色的说明。

14.建立几何节点。

15.设置该几何体的顶点数据。 16.设置该几何体的法线数据。

17.设置法线的绑定方式。osg::Geometry::BIND_OVERALL即整个Geometry 几何体对应唯一的一个法线数据。除此之外,还有osg::Geometry::BIND_PER_VERTEX是对于每个顶点绑定一个数据。BIND_OFF是不绑定。BIND_PER_PRIMITIVE 绑定逐个几何体,此时,颜色数组或者法线坐标数组中保存的数据数量应当与用户将要绘制的几何体数量相同。这些枚举量用于设置Geometry 类中颜色和法线数据的绑定方式。

18.设置几何体的颜色数组。

19.设置几何体颜色的绑定类型,这里是每一个几何数据一个颜色。

20.addPrimitiveSet函数用来设置绘制的几何图形。DrawArrays 类的构造函数为osg::DrawArrays::DrawArrays ( GLenum mode, GLint first, GLsizei count ) ,mode是几何图形的类型,有:osg::Box[盒子],osg::Capsule[胶囊形],osg::CompositeShape[组合型],osg::Cone[圆锥形],osg::Cylinder[圆柱形],osg::HeightField[高程形],osg::InfinitePlane[有限面],osg::Sphere[球形],osg::TriangleMesh[三角蒙皮]等;first是顶点数组中的起始数据的数组下标,count是数据的个数。

21.建立叶节点,将几何数据放入其中。 22.设置叶节点的绘制内容为上述几何图形。 23.将叶节点加入到位置转换节点中去。 24.设置yaw轴的方向向量 25.设置pitch轴的方向向量 26.设置roll轴的方向向量

27.设置旋转的四元数,即这里设置其绕pitch(y)轴旋转90度。

28. 将位置转换节点设置为按照该四元数的角位移,即该节点及其子节点均有这样的角位移。

29.这里申请了一个观察器viewer。

30.将根节点的指针传给viewer,以便进行绘制。 31. 这个语句表达的意思非常多,事实上可以定位到Viewer.cpp的第377行,会发现里面的操作非常多,可以理解为这是在渲染前的最后一步,会检查和设置图形上下文,屏幕啊什么的,会让你以前的设置,对Viewer的设置都生效。

32.这一句的意思就是渲染了,如果要解释它的意思的话,可以用下面的几个语句来替代:while(!viewer.done()){viewer.frame();}。意思也就是说,只要viewer没有结束,那么就绘制它的每一个帧[frame]。

2.2OSG中的最基本的绘制路数:

在OSG当中所有的加入到场景的数据都会加入到一个Group当中,而几何图元做为一种需要绘制的对象而非模型也有一个类专门组织,这个类就是osg::Geode,该类的作用就是组织一些绘制的对象,然后传给Group。

对于简单几何体的绘制路数:

2.3代码运行及结果

需要注意的是,在程序运行前,在工程中添加所需的库。方法如下:在工程名上点击右键,选择属性。此时出现属性页窗口。在左侧的树形选项中,选择“配置属性”->“链接器”->“输入”。这时右侧的附加依赖项中添加osgd.lib osgViewerd.lib osgGAd.lib osgTextd.lib,如图所示:

点击“确定”,完成设置。

运行后出现的结果如图所示(y轴为垂直于纸面向里,x轴为平行于纸面向右,z轴为平行于纸面向下,左手坐标系):

如果将第28行注释去掉,即绕pitch轴旋转90度则结果为:

看起来是黑色的线,是因为其法线设置的方向是背对光源的。左键拖动,转动即可看到红色的线。

2.4 说明

这只是简单的osg代码,除此之外还有光照、渲染、纹理等其他内容,这里不详细介绍,具体可参考《OpenSceneGraph快速入门指导》等入门书籍。

三、osg相关网站

1、 http://www.openscenegraph.org/projects/osg

osg的官方网站

2、 http://wiki.osgchina.org osg中国的网站,这里集中了一些OSG开发者以及OSG的典型案例和为初学者所准备的教程。

3、 http://www.osgchina.org/bbs/index.php

osg中国的论坛,集中了一些osg爱好者的讨论。

本文来源:https://www.bwwdw.com/article/q6ev.html

Top