OSG学习之几何图形
最近在学习OpenSceneGraph,先从几何图形实现开始入手学习。使用两种方法来构建一个正方体。
首先来介绍osg::ShapeDrawable 类,其中是osg::Drawable的子类。一般使用来快速构建基础的几何图形。
先来看看代码
osg::ref_ptr<osg::ShapeDrawable> shape_box = new osg::ShapeDrawable;shape_box->setShape( new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f),2.0f, 2.0f, 2.0f) );shape_box->setColor( osg::Vec4(3.0f, 1.0f, 1.0f, 1.0f) );osg::ref_ptr<osg::Geode> root = new osg::Geode;root->addDrawable( shape_box.get() );osgViewer::Viewer viewer;viewer.setSceneData( root.get() );return viewer.run();
osg::ShapeDrawable 下setShape()方法,这个方法通常就是来设置形状的。
shape_box->setShape( new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f),2.0f, 2.0f, 2.0f) );
其中osg::Vec3(0.0f, 0.0f, 0.0f)设置的是中心坐标,2.0f, 2.0f, 2.0f设置的是宽度、高度、深度。
shape_box->setColor( osg::Vec4(3.0f, 1.0f, 1.0f, 1.0f) );
其中3.0f, 1.0f, 1.0f 是RGB值 ; 1.0f对应的是alpha值(范围0~1)。
osg::ref_ptr<osg::Geode> root = new osg::Geode;
root->addDrawable( shape_box.get() );
Geode存放的是叶子节点的信息,这些信息包括几何信息。osg::Drawable是由Geode来管理的。
[注意!!!] :osg::ShapeDrawable可以用来画几何图形,但是在效率上面还是不算太高。下面将使用osg::Geometry来进行画图形!
效果如下:
使用Geometry来实现高效的绘图。
先直接来看代码:主要是要注意顶点数据,以及索引数据的添加
osg::ref_ptr<osg::Geode> geode = new osg::Geode;//创建一个geode对象osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;//创建一个几何体对象osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;//创建顶点数组,逆时针顺序v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));v->push_back(osg::Vec3(1.0f, -1.0f, 0.0f));v->push_back(osg::Vec3(1.0f, -1.0f, 1.0f));v->push_back(osg::Vec3(0.0f, -1.0f, 1.0f));v->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));geometry->setVertexArray(v);//设置几何体顶点数据osg::ref_ptr<osg::DrawElementsUInt> quad = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);//指定绘图基元为四边形quad->push_back(0);quad->push_back(1);quad->push_back(2);quad->push_back(3); //添加四边形的索引数据quad->push_back(0);quad->push_back(3);quad->push_back(6);quad->push_back(7);quad->push_back(0);quad->push_back(7);quad->push_back(4);quad->push_back(1);quad->push_back(1);quad->push_back(2);quad->push_back(5);quad->push_back(4);quad->push_back(2);quad->push_back(3);quad->push_back(6);quad->push_back(5);quad->push_back(4);quad->push_back(5);quad->push_back(6);quad->push_back(7);geometry->addPrimitiveSet(quad);//添加到几何体osg::ref_ptr<osg::Vec4Array> vc = new osg::Vec4Array;//创建颜色数组vc->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f));vc->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));vc->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 1.0f));vc->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f));geometry->setColorArray(vc);geometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);//设置颜色绑定模式osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array;normal->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));//设置法线geometry->setNormalArray(normal);geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);geode->addChild(geometry);//添加到叶子节点中osgViewer::Viewer viewer;viewer.setSceneData( geode.get() );return viewer.run();
其中最重要的是就是坐标轴是如何的呢?我们来看看下面这个一张图就能明白了
x轴正方向 向右 ; y轴正方向 向里 ; z轴正方向 向上
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;//创建顶点数组,逆时针顺序v->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(1.0f, 0.0f, 0.0f));v->push_back(osg::Vec3(1.0f, 0.0f, 1.0f));v->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));v->push_back(osg::Vec3(1.0f, -1.0f, 0.0f));v->push_back(osg::Vec3(1.0f, -1.0f, 1.0f));v->push_back(osg::Vec3(0.0f, -1.0f, 1.0f));v->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
这段代码有2个需要值得注意的点:
第一:输入的八个坐标就是正方体的八个顶点坐标,要根据osg的坐标系来填写坐标值。
第二:填写坐标值一定要按照逆时针方向来写,8个顶点,4个在一个面上。那么就是要从任意一个面开始,选择一个点,逆时针来填写。一个面上的四个点写完了之后再去写另一个面的点,同样要求逆时针。
osg::ref_ptr<osg::DrawElementsUInt> quad_box = new osg::DrawElementsUInt(osg::PrimitiveSet::QUADS, 0);//指定绘图基元为四边形quad_box->push_back(0);quad_box->push_back(1);quad_box->push_back(2);quad_box->push_back(3); //添加四边形的索引数据quad_box->push_back(0);quad_box->push_back(3);quad_box->push_back(6);quad_box->push_back(7);quad_box->push_back(0);quad_box->push_back(7);quad_box->push_back(4);quad_box->push_back(1);quad_box->push_back(1);quad_box->push_back(2);quad_box->push_back(5);quad_box->push_back(4);quad_box->push_back(2);quad_box->push_back(3);quad_box->push_back(6);quad_box->push_back(5);quad_box->push_back(4);quad_box->push_back(5);quad_box->push_back(6);quad_box->push_back(7);
这段代码里面的数据是怎么填进去的呢?
选定一个点,遍历包含这个点的所有的面,将面上所包含顶点的编号写进去,直到将所有的面都包含到。
举个例子:
根据上面那副图,
我首先选定0,那么与0有关的面就是(0,1,2,3)(0,4,5,1)(0,3,7,4)那么就将这3组数据一次push_back进去。
quad_box->push_back(0);quad_box->push_back(1);quad_box->push_back(2);quad_box->push_back(3);
quad_box->push_back(0);quad_box->push_back(4);quad_box->push_back(5);quad_box->push_back(1);
quad_box->push_back(0);quad_box->push_back(3);quad_box->push_back(7);quad_box->push_back(4);
然后选定1,那么与1有关且还没有被选中的面是(1,2,6,5)
接着选定2,那么与2有关且还没有被选中的面是(2,3,7,6)
接着选定3,选定4以此类推,一直把六个面都选过一遍即可。
运行效果如下:
初学OSG,欢迎各位指导。
OSG学习之几何图形相关推荐
- osg学习(十一)osg与osgre
OGRE和OSG本身被定位为一个纯粹的图形引擎. 其中OpenSceneGraph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API).OSG开发的主要意义在于,将3D ...
- java osg_java,osg学习心得
早就要写这篇总结了,一直没时间,拖到今天,趁着java课设一起给写了,希望对大家可以有一点帮助.可能有些繁琐,所以划线部分是我觉得可能比较有用的吧. 语言课程设计不但是对自己专业知识的巩固,使自己更好 ...
- OSG三维渲染引擎编程学习(全系列开展OSG学习)
目录 第一章:OpenSceneGraph介绍 第二章:OSG数学基础 第三章:OSG场景组织 第四章:OSG几何体绘制 第五章:OSG场景渲染 第六章:OSG场景工作机制 第七章:OSG场景图形交互 ...
- 命令行参数tail c语言,osg学习笔记2, 命令行参数解析器ArgumentParser
php简单实现socket通信 socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究 ...
- osg学习笔记(一)
场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息.根节点 ...
- OSG学习:OSG组成(二)——渲染状态和纹理映射
以下内容来自: 1.<OpenSceneGraph三维渲染引擎编程指南>肖鹏 刘更代 徐明亮 清华大学出版社 2.<OpenSceneGraph三维渲染引擎设计与实践>王锐 ...
- osg学习(四十八)Windows Error #2000
Windows Error #2000: Win32WindowingSystem::OpenGLContext() - Unable to restore current OpenGL render ...
- osg学习(三十一)osg、Qt的image
1.格式转换 osg::Image* CommonTools::covertImage(QImage image) {QImage glImage = QGLWidget::convertToGLFo ...
- osg学习(五十四)PNG lib warning : Interlace handling should be turned on when using png_read_image
应打开隔行处理.用PS打开png图片后在保存时,把交错选项勾选"无". PNG lib warning : Interlace handling should be turned ...
- OSG学习之路(一)osg各个库的用途
介绍一下osg各个库的用途 组件 Osg核心库 提供了基本的场景图形和渲染功能,以及3d图形程序所需的某些特定功能实现.包括: osg库 包含了用于创建场景图形的场景图形节点类,用作向量和矩阵运算的类 ...
最新文章
- 英语和数学不好可以学python-Day2 怎么学 Python?
- 【机器学习基础】太棒了!这里有385篇自然语言处理和机器学习领域的综述总结...
- Python3 闭包函数及nonlocal
- 《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》
- 信用卡号校验java_ES reduce 一行代码解决信用卡号验证问题
- stm32f407 spi3 mosi没有输出_入门篇 | STM32F407寄存器开发点灯
- Android基础知识、四大组件(转)
- RS-232协议和RS-485协议
- WIN7下恼人的AppData——删除无用的缓存文件
- 使用TCP/IP协议栈指纹进行远程操作系统辨识
- OAF: 怎样创建 DFF
- win10 锁屏界面自动更换壁纸的办法,亲测有效
- 上计算机课为什么戴鞋套,为什么当年进电脑机房要戴鞋套!
- 究竟新买的手机电池第一次要充多久的电
- 联想笔记本更换固态硬盘和重装系统
- 《阿凡达2》上映在即,3D渲染如何突破想象?
- Java集合是什么?
- 计算机网络第一节课笔记
- Spring是什么?IOC和DI详细介绍。
- PTA 5 动物发声模拟器(多态)分数 10
热门文章
- Android UI控件大全
- container_of()宏
- Android 视频播放 界面变形处理
- 比Gmail更强悍:超大3GB免费邮箱申请!
- Anomaly Detection with partially Observed Anomalies论文笔记
- 安全专业委员会发言_安全专业委员会发言稿
- 如何保存在线文档html代码,html代码怎样保存和使用
- 全国计算机二级ms备考,全国计算机二级MS office经验分享
- 小米手机qq不读取相册照片_【qq影像读取不了照片】qq影像读取不到相册_qq影像读取不了相册...
- 学员管理系统(完整版)