简单osg图形绘制
更新时间:2023-11-13 18:20:01 阅读量: 教育文库 文档下载
- osg图形引擎推荐度:
- 相关推荐
使用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
int _tmain(int argc, _TCHAR* argv[]) {
1 osg::ref_ptr
2 osg::ref_ptr
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
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
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
}
这个程序主要包括以下几个部分: (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爱好者的讨论。
正在阅读:
简单osg图形绘制11-13
中医方剂学02-19
火电厂中特种设备的定期检验及金属监督中存在的问题分析12-15
高校大学生心理健康教育队伍建设研究06-07
新形势下如何做好单位的财务管理工作02-26
state命令09-21
英国文凭认证材料03-28
WGS84坐标方法 - 图文05-25
描写金鱼的作文600字07-06
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 绘制
- 图形
- 简单
- osg
- 体外诊断试剂研制情况现场核查要求
- ××公司年度全面风险管理报告2014
- 内蒙古自治区安全生产条例(2017新规)
- 分析化学答案 - 上册 - 第四版 - 高等教育出版社
- 4章:类图与对象图习题
- 有机化工习题集
- 《送法下乡》苏力――读书笔记摘抄概况
- 南林高速公路施工标准化实施方案
- 2014年芜湖市中学数学论文评选结果 - 图文
- 第2章 数据类型、运算符和表达式
- 《秦风·蒹葭》的企慕情境及其审美意蕴
- 县委书记在全县解放思想大讨论动员会上的讲话
- 浅析诈骗罪中受骗者的范围
- 多相平衡习题答案
- 老梁节目主持风格
- 2016-2022年中国氯碱市场深度研究与投资战略咨询报告(目录) - 图文
- 超材料发展现状及应用前景分析 - 图文
- 人教版高中生物 选修1 专题2课题1微生物的实验室培养(学案)(学生版)
- 汉之殇:全面战争各类宝物的秘籍
- comsol操作技巧