最近在学习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::ShapeDrawablesetShape()方法,这个方法通常就是来设置形状的。

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学习之几何图形相关推荐

  1. osg学习(十一)osg与osgre

    OGRE和OSG本身被定位为一个纯粹的图形引擎. 其中OpenSceneGraph(简称OSG)使用OpenGL技术开发,是一套基于C++平台的应用程序接口(API).OSG开发的主要意义在于,将3D ...

  2. java osg_java,osg学习心得

    早就要写这篇总结了,一直没时间,拖到今天,趁着java课设一起给写了,希望对大家可以有一点帮助.可能有些繁琐,所以划线部分是我觉得可能比较有用的吧. 语言课程设计不但是对自己专业知识的巩固,使自己更好 ...

  3. OSG三维渲染引擎编程学习(全系列开展OSG学习)

    目录 第一章:OpenSceneGraph介绍 第二章:OSG数学基础 第三章:OSG场景组织 第四章:OSG几何体绘制 第五章:OSG场景渲染 第六章:OSG场景工作机制 第七章:OSG场景图形交互 ...

  4. 命令行参数tail c语言,osg学习笔记2, 命令行参数解析器ArgumentParser

    php简单实现socket通信 socket通信的原理在这里就不说了,它的用途还是比较广泛的,我们可以使用socket来做一个API接口出来,也可以使用socket来实现两个程序之间的通信,我们来研究 ...

  5. osg学习笔记(一)

    场景图形采用一种自顶向下的,分层的树状数据结构来组织空间数据集,以提高渲染的效率 场景图形树结构的顶部是一个根节点,从根节点向下延伸,各个组节点中均包含了几何信息和用于控制其外观的渲染状态信息.根节点 ...

  6. OSG学习:OSG组成(二)——渲染状态和纹理映射

    以下内容来自: 1.<OpenSceneGraph三维渲染引擎编程指南>肖鹏 刘更代 徐明亮 清华大学出版社  2.<OpenSceneGraph三维渲染引擎设计与实践>王锐 ...

  7. osg学习(四十八)Windows Error #2000

    Windows Error #2000: Win32WindowingSystem::OpenGLContext() - Unable to restore current OpenGL render ...

  8. osg学习(三十一)osg、Qt的image

    1.格式转换 osg::Image* CommonTools::covertImage(QImage image) {QImage glImage = QGLWidget::convertToGLFo ...

  9. 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 ...

  10. OSG学习之路(一)osg各个库的用途

    介绍一下osg各个库的用途 组件 Osg核心库 提供了基本的场景图形和渲染功能,以及3d图形程序所需的某些特定功能实现.包括: osg库 包含了用于创建场景图形的场景图形节点类,用作向量和矩阵运算的类 ...

最新文章

  1. 英语和数学不好可以学python-Day2 怎么学 Python?
  2. 【机器学习基础】太棒了!这里有385篇自然语言处理和机器学习领域的综述总结...
  3. Python3 闭包函数及nonlocal
  4. 《MySQL 8.0.22执行器源码分析(3.1)关于RowIterator》
  5. 信用卡号校验java_ES reduce 一行代码解决信用卡号验证问题
  6. stm32f407 spi3 mosi没有输出_入门篇 | STM32F407寄存器开发点灯
  7. Android基础知识、四大组件(转)
  8. RS-232协议和RS-485协议
  9. WIN7下恼人的AppData——删除无用的缓存文件
  10. 使用TCP/IP协议栈指纹进行远程操作系统辨识
  11. OAF: 怎样创建 DFF
  12. win10 锁屏界面自动更换壁纸的办法,亲测有效
  13. 上计算机课为什么戴鞋套,为什么当年进电脑机房要戴鞋套!
  14. 究竟新买的手机电池第一次要充多久的电
  15. 联想笔记本更换固态硬盘和重装系统
  16. 《阿凡达2》上映在即,3D渲染如何突破想象?
  17. Java集合是什么?
  18. 计算机网络第一节课笔记
  19. Spring是什么?IOC和DI详细介绍。
  20. PTA 5 动物发声模拟器(多态)分数 10

热门文章

  1. Android UI控件大全
  2. container_of()宏
  3. Android 视频播放 界面变形处理
  4. 比Gmail更强悍:超大3GB免费邮箱申请!
  5. Anomaly Detection with partially Observed Anomalies论文笔记
  6. 安全专业委员会发言_安全专业委员会发言稿
  7. 如何保存在线文档html代码,html代码怎样保存和使用
  8. 全国计算机二级ms备考,全国计算机二级MS office经验分享
  9. 小米手机qq不读取相册照片_【qq影像读取不了照片】qq影像读取不到相册_qq影像读取不了相册...
  10. 学员管理系统(完整版)