osg初级教程

合集下载

OSG(美国海军NPS)教程学习加实践(2)

OSG(美国海军NPS)教程学习加实践(2)

在编程开始前要认识一下*.tga后缀的文件:TGA格式(Tagged Graphics)是由美国Truevision公司为其显示卡开发的一种图像文件格式,文件后缀为“.tga”,已被国际上的图形、图像工业所接受。

TGA的结构比较简单,属于一种图形、图像数据的通用格式,在多媒体领域有很大影响,是计算机生成图像向电视转换的一种首选格式。

TGA图像格式最大的特点是可以做出不规则形状的图形、图像文件,一般图形、图像文件都为四方形,若需要有圆形、菱形甚至是缕空的图像文件时,TGA可就派上用场了!TGA格式支持压缩,使用不失真的压缩算法。

在工业设计领域,使用三维软件制作出来的图像可以利用TGA格式的优势,在图像内部生成一个Alpha(通道),这个功能方便了在平面软件中的工作。

==================================================================================#include <osgViewer/Viewer>#include <osgDB/ReadFile>#include <osg/ref_ptr>#include <osg/Geometry>#include <osg/PositionAttitudeTransform>#include <osg/Geode>#include <osg/Group>#include <osg/Texture2D>#include <iostream>using namespace std;osg::Geode* createPyramid(){osg::Geode* pyramidGeode = new osg::Geode();osg::Geometry* pyramidGeometry = new osg::Geometry();pyramidGeode->addDrawable(pyramidGeometry);// 指定顶点osg::Vec3Array* pyramidVertices = new osg::Vec3Array;pyramidVertices->push_back( osg::Vec3(0, 0, 0) ); // 左前pyramidVertices->push_back( osg::Vec3(2, 0, 0) ); // 右前pyramidVertices->push_back( osg::Vec3(2, 2, 0) ); // 右后pyramidVertices->push_back( osg::Vec3( 0,2, 0) ); // 左后pyramidVertices->push_back( osg::Vec3( 1, 1,2) ); // 塔尖// 将顶点数组关联给几何体pyramidGeometry->setVertexArray( pyramidVertices );// 根据底面的四个顶点创建底面四边形(QUAD)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);// 创建其他面的代码从略osg::Vec4Array* colors = new osg::Vec4Array;colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //索引0 红色colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); //索引1 绿色colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); //索引2 蓝色colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //索引3 白色osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4> *colorIndexArray;colorIndexArray =new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4>;colorIndexArray->push_back(0); // 顶点0对应颜色元素0colorIndexArray->push_back(1); // 顶点1对应颜色元素1colorIndexArray->push_back(2); // 顶点2对应颜色元素2colorIndexArray->push_back(3); // 顶点3对应颜色元素3colorIndexArray->push_back(0); // 顶点4对应颜色元素0pyramidGeometry->setColorArray(colors);pyramidGeometry->setColorIndices(colorIndexArray); pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);osg::Vec2Array* texcoords = new osg::Vec2Array(5);(*texcoords)[0].set(0.00f,0.0f); // 顶点0的纹理坐标(*texcoords)[1].set(0.25f,0.0f); // 顶点1的纹理坐标(*texcoords)[2].set(0.50f,0.0f); // 顶点2的纹理坐标(*texcoords)[3].set(0.75f,0.0f); // 顶点3的纹理坐标(*texcoords)[4].set(0.50f,1.0f); // 顶点4的纹理坐标pyramidGeometry->setTexCoordArray(0,texcoords);return pyramidGeode;}int main(){// 声明场景的根节点osg::Group* root = new osg::Group();osg::Geode* pyramidGeode = createPyramid();root->addChild(pyramidGeode);osg::Texture2D* KLN89FaceTexture = new osg::Texture2D;//避免在优化过程中出错KLN89FaceTexture->setDataVariance(osg::Object::DYNAMIC);// 从文件读取图片osg::Image* klnFace = osgDB::readImageFile("KLN89FaceB.tga");if (!klnFace){printf(" couldn't find texture, quiting.");//输出错误system("pause");return -1;}// 将图片关联到纹理KLN89FaceTexture->setImage(klnFace);// 创建StateSetosg::StateSet* stateOne = new osg::StateSet();// 将纹理关联给StateSet的纹理单元0stateOne->setTextureAttributeAndModes(0,KLN89FaceTexture,osg::StateAttribute::ON);// 将渲染状态关联给金字塔节点pyramidGeode->setStateSet(stateOne);osgViewer::Viewer viewer;//最后我们进入仿真循环:viewer.setSceneData( root );return viewer.run();}。

OSG开源教程

OSG开源教程

OSG开源教程整理:荣明、王伟北京2008年4月序第一次接触OSG是在2001年,当时开源社区刚刚兴起,还没有现在这么火。

下载了OSG源码,但是在看了几个Demo之后,感觉没有什么特别之处。

时隔七年之后,我再次将目光投向OSG,发现OSG确实有其独到之处,很多3D效果已经不弱于甚至超过商业软件,有感于开源力量的巨大。

但是,与当前主流3D商业软件如Vega、VegaPrime、VTree、Performer等相比,开源软件的缺点也很明显,其中文档缺乏可谓其致命弱点之一。

开发者只能从浩瀚的源码中,进行编程的学习,效率不高。

OSG组织也意识到这一点,不断推出一些官方教程,网络上有很多OSG 爱好者发布的心得和教程。

我收集、整理了许多学习资料,其中美国海军研究生院发布的OSG教程非常好,可作为OSG的官方教程的一个很好补充。

它共有十一个专题,结合例子程序,一步步教你如何进行OSG的开发。

我将其编辑成一个较为完善的教材,供大家学习。

在教材整理过程中,王伟调试了源程序,对该书编辑和修订做了大量的工作;实验室的学生杨宇蒙、冯锐、章仕锋、李永川和李益强阅读了本书,并提出了宝贵的修改意见,在此一并表示感谢。

希望这本小册子能对大家学习OSG编程起到一定的帮助作用。

谢谢大家阅读本书!荣明二OO八年四月于崔春园Email:rong_ming@ (本书的资料全部来自互联网,仅供个人学习交流使用。

感谢竹林小舍、array翻译了Navy的教程。

)目录1.使用Open Scene Graph几何 (1)1.1背景 (1)1.2代码 (1)2.使用StateSet产生有纹理的几何体 (4)2.1本章目标 (4)2.2背景 (4)2.3加载纹理,生成状态集合并将他们附加到节点上 (6)3.使用Shape,改变state (8)3.1本章目标 (8)3.2使用Shape类 (8)3.3设置状态 (9)4.更多的StateSet (10)4.1StateSet如何工作 (10)4.2例子及代码 (10)5.从文件中加载模型并放入到场景中 (12)5.1本章目标 (12)5.2加载几何模型并加入到场景中 (12)6.osg Text、HUD、RenderBins (15)6.1本章目标 (15)6.2摘要 (15)6.3代码 (15)7.搜索并控制开关和DOF(自由度)节点(Finding and Manipulating a Switch and DOF Node) . 207.1搜索场景图形中的一个有名节点 (20)7.2按照“访问器”模式搜索有名节点 (22)8.使用更新回调来更改模型 (26)8.1本章目标 (26)8.2回调概览 (26)8.3创建一个更新回调 (26)9.处理键盘输入 (29)9.1本章目标 (29)9.2 GUI(图形用户接口)事件处理器: (29)9.3简单的键盘接口类 (30)9.4使用键盘接口类 (31)9.5处理键盘输入实现更新回调 (32)9.5.1本节目标 (32)9.5.2问题的提出 (32)9.5.3解决方案 (33)10.使用自定义矩阵来放置相机(Positioning a Camera with a User-Defined Matrix) (36)10.1本章目标 (36)10.2设置矩阵的方向和位置 (36)10.3声明一个用于设置相机的矩阵 (37)10.4使用矩阵设置视口摄相机 (38)11. 实现跟随节点的相机 (38)11.1本章目标 (38)11.2概述 (38)11.3实现 (39)11.4环绕(始终指向)场景中节点的相机 (42)11.4.1本节目标 (42)11.4.2实现 (42)1.使用Open Scene Graph几何本节涵盖了生成基本几何形状的一些方法。

OSG学习

OSG学习

OSG学习 GraphicsContext与窗⼝建⽴所谓的GraphicsContext 我这么翻译它吧:图形设备上下⽂?..就像在使⽤OpenGL在win32的窗⼝⾥绘制的时候.曾使⽤的hrc = wglCreateContext(hdc)⼀样.创建⼀个图形设备上下⽂ ,然后使⽤wglMakeCurrent(hdc,hrc)设置当前使⽤的图形设备⼀样.在这之后我们就可以使⽤OGL绘制图形⼀样.osg中的GraphicsContext 就是跟hrc⼀样的.只是它将所有需要的内容集成在GraphicsContext这个类当中.这就是⾯向对象的封装性>_<.在打开osg/GraphicsContext的头⽂件当中.我们可以找到这么⼀些函数 swapBuffers() makeCurrent() 等与我们之前所说的可以说⼗分相同的.因此对于在OSG当中需要最终显⽰图形的地⽅就是这个GraphicsContext .这个时候我们得到的是⼀个全屏的窗⼝.这是默认的创建的⼀个GraphicsContext.( 通常情况下只有⼀个).它是通过执⾏Viewer::realize()函数创建的. 最后执⾏View::setUpViewAcrossAllScreens() 创建全屏的GraphicsContext你可详看源码就可以发现它就是创建⼀个GraphicsContext..并把它附加到viewer 的主摄像机上..因此我们最后看到的结果就是在全屏上显⽰⼀头⽜...假设没有这个GraphicsContext 就会看不到.在后⾯我会⽤⼀副图来说明摄像机与GraphicsContext得关系.这是⾄关重要的.因为.每个摄像机若需要显⽰场景.则必须要有⼀个GraphicsContext.来负责显⽰.不管是主摄像机还是从摄像机.(Viewer可以有多个摄像机).在我们了解了GraphicsContext之后.其实上⾯这个图已经给我们⼀个很⼤的启发了.其实最后的GraphicsContext应当是GraphicsWindowWIN32或者GraphicsWindowX11等三个中的⼀个.这是⾯向对象多态性的体现.. 因此.我们现在就要开始创建⼀个GraphicsContext了.在创建之前.我也许需要说明⼀个.static GraphicsContext* GraphicsContext::createGraphicsContext(Traits _traits) 需要传⼊⼀个Traits的变量.因此我们需要了解这个Traits.Traits.是什么呢?它GraphicsContext⼀些特征.我罗列⼀些能够表⽰这些特征的属性就能够⾮常直⽩的说明这个对象了._traits->x //x偏移_traits->y //y偏移_traits->width //宽度_traits->height //⾼度_traits->doubleBuffer //是否⽀持双缓存_traits->sharedContext //共享GraphicsContext_traits->windowName //窗⼝名称_traits->windowDecoration //是否⽀持窗⼝⼀些装饰属性..如最⼤化最⼩化等_traits->inheritedWindowData //继承⾃某个窗⼝句柄? 这个可以⽤于嵌⼊到QT.MFC等GUI系统中.因此只要设置这些内容.并调⽤上⾯的⽅法则会创建⼀个GraphicsContext. .⽽如上那个函数关于创建GraphicsContext实则应当是调⽤了窗⼝系统API 来创建的.当你去详细阅读 GraphicsWindowWIN32.cpp ⽂件和GraphicsWindow 头⽂件时.你会发觉设计的⾮常巧妙. ⽤static全局静态变量和宏定义实现这个⾮常宏伟的API获得...因此假设我们使⽤的是Window系统那么所创建的GraphicsContext 则win32模式的.那么具体的窗⼝创建或者说嵌⼊等.请详细看GraphicsWindowWIN32.cpp 我们可以⾮常熟悉的看到开头部分所叙述的wgl等函数..很熟悉吧..说了这么多.我们是否应当创建⼀个窗⼝来实践⼀下呢? 这将在之后的代码当中详细说出..为了渲染与显⽰图形.. 我们需要⼀个视景器.osgViewer::Viewer ..Viewer当中包含⼀个主摄像机.因此我们不必在创建⼀个摄像机了.好了.开始代码的叙述.由于我们只是创建⼀个简单的WIN32窗⼝并没有嵌⼊MFC.只需设置⼀些相关的值即可.。

openscenegraph快速入门指导

openscenegraph快速入门指导

《OpenSceneGraph 快速入门指导》一、什么是 OpenSceneGraph?OpenSceneGraph(OSG)是一个开放源代码的三维图形渲染引擎,它由C++语言编写而成,广泛应用于虚拟现实、仿真、游戏开发等领域。

OpenSceneGraph 提供了丰富的功能和高效的性能,使得开发者能够快速构建复杂的三维场景,并实现高质量的渲染效果。

二、为什么选择 OpenSceneGraph?1. 开源免费:OpenSceneGraph 是开源的软件,完全免费使用和修改,这大大降低了开发成本,同时也保证了技术的开放性和灵活性。

2. 高性能:OpenSceneGraph 基于先进的图形渲染技术,具有优异的性能表现,能够在处理大规模三维场景时保持流畅的渲染效果。

3. 多评台支持:OpenSceneGraph 支持 Windows、Linux、macOS 等多个主流操作系统,同时也支持多种图形API,包括 OpenGL、DirectX 等。

4. 应用广泛:OpenSceneGraph 已经被广泛应用于航空航天、军事仿真、医疗影像、游戏开发等多个领域,并且得到了业内的广泛认可和好评。

5. 社区支持:OpenSceneGraph 拥有一个活跃的开发者社区,提供了丰富的文档和示例代码,同时也有众多的开发者和用户在社区中共享经验和解决方案。

三、如何快速入门 OpenSceneGraph?1. 理解基本概念:在学习任何新的技术之前,首先需要理解其基本概念和工作原理。

在 OpenSceneGraph 中,你需要了解场景图(Scene Graph)、节点(Node)、状态集合(State Set)等基本概念。

2. 安装和配置:在开始实际开发之前,你需要安装和配置OpenSceneGraph 开发环境。

这包括下载源代码、编译安装库文件、配置开发工具等步骤。

在官方全球信息湾和开发者社区中都可以找到详细的安装指南和教程。

OSG安装方法

OSG安装方法

一.安装需要:1. 3rdparty——第三方库。

2. OpenSceneGraph源码包,我用的是OpenSceneGraph-2.4.0。

3. 实例模型数据包。

4. Cmake工具——如果用的是VS2008,请使用cmake-2.8.0-win32-x86以上版本。

1,2,3都可以在OSG的官网上找到下载。

Cmake也很容易在网上下载到。

二.注意事项:1. 就不要使用VC6.0了,OSG已经不支持它了。

2. 如果你用的是VISTA,甚至WIN7,为了防止未来出现很多不可预知且难以解决的问题,还是换成XP吧。

我曾经在VISTA下安装成功,但任意一个程序都必须报一个“DLL文件BUG”的错误,然后重新生成才可以成功。

三.安装准备:1. 安装CMAKE。

2. 找一个空间较大的盘,建立一个名为OSG的文件夹。

将第三方库文件夹复制进去,命名为3rdparty。

OpenSceneGraph-2.4.0文件夹也复制进去。

再新建一个名为OSG的文件夹,将实例模型数据包取名data,复制到该文件夹下。

3. 打开CMAKE程序。

打开OpenSceneGraph-2.4.0文件夹,将其中CMakeLists.txt直接拖到CMAKE的程序界面中。

这时你会发现,界面上方自动填入了两个地址。

上面那行地址是OpenSceneGraph源码所在的文件夹,也就是我们的OpenSceneGraph-2.4.0文件夹。

下面那行是生成项目的输出文件夹,我们将其改为“盘符:\OSG\OSG”。

点击左下方的“configure”。

这是第一次配置。

在跳出的对话框中选择你所用的VS版本。

4. 这时下方列表中会出现非常多项目。

它比较不智能,所以需要我们自己动手将需要改的项目改过来。

首先将界面中的“simple view”下拉列表改成“Advanced view”。

然后修改列表中以下值:1) ACTUAL_3DPARTY_DIR。

这一项填写的是我们第三方库所在的文件夹。

osg教程

osg教程

osg教程osg是一种开源的三维图形引擎,可以用于创建各种虚拟现实(VR)和增强现实(AR)应用程序。

它提供了一系列功能强大的工具和库,用于处理3D渲染、触摸输入、模型加载、光照效果等等。

osg的安装非常简单,只需将其添加到您的项目依赖中即可。

然后,您可以使用osg命令集创建和管理您的3D场景。

osg提供了一个多功能的视图器窗口,用于显示您的场景。

您可以使用该窗口的各种方法和属性来控制场景的呈现方式。

例如,您可以设置相机的位置和旋转,调整场景的光照效果和材质属性等等。

osg还支持多种文件格式的模型加载,包括OBJ、3DS、FBX 等等。

您可以使用osg的加载器来加载这些模型,并将其添加到您的场景中。

osg还提供了一系列的节点类,用于创建和管理3D对象。

您可以使用这些节点类来创建几何体、粒子效果、动画和碰撞检测等等。

osg还支持多种光照效果,包括点光源、方向光源、聚光灯等等。

您可以使用osg的光照类来创建和管理这些光源,并将它们应用于您的场景中。

osg还支持触摸输入,可以实现用户的交互操作。

您可以使用osg的事件处理器来处理用户的触摸动作,并根据用户的输入进行相应的操作。

osg还支持虚拟现实和增强现实技术。

您可以使用osg的VR和AR接口来创建和管理VR和AR应用程序,包括头显、手柄、虚拟物体等等。

osg是一个非常强大和灵活的三维图形引擎,非常适合创建各种虚拟现实和增强现实应用程序。

它提供了丰富的功能和工具,使您能够轻松地创建和管理3D场景。

无论您是初学者还是专业开发者,osg都可以满足您的需求,并帮助您实现您的创意。

简单osg图形绘制

简单osg图形绘制

使用vc++ 9.0建立简单的场景图形一、创建vc++工程打开vc++应用程序,在菜单栏中选择“文件”->“新建”->“项目”。

出现新建项目对话框。

在左侧的“项目类型”中,选择“Visual C++”->“win 32”,在右侧选择“win32 控制台应用程序”,在下面的“名称”编辑框内输入工程名,选择工程的位置,点击“确定”。

如图所示:在跳出的“win32 应用程序向导”中点击“完成”。

二、Osg源码的建立及分析2.1 代码分析此时生成的工程中,stdafx.h 、targetver.h、stdafx.cpp均是vc++程序自己创建的,我们自己的代码的主函数则是写在工程名同名的cpp文件中。

例程:绘制直线#include "stdafx.h"#include <osg/Group>#include <osg/Geode>#include <osg/Geometry>#include <osgViewer/Viewer>#include <osg/PositionAttitudeTransform>int _tmain(int argc, _TCHAR* argv[]){1 osg::ref_ptr<osg::Group> root = new osg::Group;2 osg::ref_ptr<osg::PositionAttitudeTransform> pa1 = newosg::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<osg::Geometry> 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(newosg::DrawArrays(osg::PrimitiveSet::LINES,0,2));21 osg::ref_ptr<osg::Geode> 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<osgViewer::Viewer> viewer = new osgViewer::Viewer;30 viewer->setSceneData(root.get());31 viewer->realize();32 viewer->run();}这个程序主要包括以下几个部分:(1)建立根节点;(2)建立位置属性变换节点,对其进行设置,并将其加到根节点上;(3)建立几何节点,即线段。

OSG+VS2015入门教程---环境搭建

OSG+VS2015入门教程---环境搭建

OSG+VS2015⼊门教程---环境搭建因为⼯作的需要,需要学习osg,在此记录⼀下osg环境搭建的教程。

⼀、下载进⼊官⽹,点击下载,选择稳定版本,我们下载最新的3.6.5源码通过git下载,⽹速⽐较慢,耐⼼等待。

2.下载第三⽅库osgchina⾥⾯已经编译好了第三⽅库,但他是⽤vs2013,但我的是vs2015,因此不能使⽤,我到osg官⽅⽹站下载对应vs版本的第三⽅库。

这⾥⽐较齐全,最新的vs2017也有,但唯独vs2015没有编译好的,但给了第三⽅库的git地址,只能⾃⼰动⼿了。

如果git下载下来,发现第三⽅库是空的,没有源码。

别急,看到⽬录下download_dependencies.bat这个脚本⽂件,⾥⾯是第三放库的具体下载地址,挨个下载吧,vs2015真的好⿇烦。

但是往下看,有重⼤发现有vs2015的x86和x64版本,不想编译的下载编译好的吧3.下载数据源4.使⽤cmake⽣成vs解决⽅案(在此忽略安装CMake的过程)打开CMake,将源码OpenSceneGraph⽂件夹⾥头的CmakeLists.txt,拖到Cmake界⾯点击Configure,选择Visual Studio 2015 (Win32)点击Finish之后点击generate5.编译⼯程打开OpenSceneGraph.sln⼯程⽣成--->批⽣成,选中ALL_BUILD的debug和release两个x64版本⼤概要编译两个⼩时,这和电脑配置有关,耐⼼等待吧。

接着再次点击:⽣成-->批⽣成这个不到⼀分钟就好了。

6.整理可以在放源码的同级⽬录下新建⼀个⽂件夹名为OSG ,把刚刚⽣成的bin、include、lib三个⽂件夹拷贝到OSG下⾯,并在OSG⽬录下⾯新建⽂件夹名为data,将之前下载好的数据拷贝过来。

最后的结果7.设置环境变量系统变量path下添加:G:\project\OSGProject\OSG\bin 主要⽤于dll的调⽤系统变量:8.测试环境变量是否设置正确打开cmd,输⼊osgversion命令⾏再输⼊://指定窗⼝⼤⼩osgviewer --window 200200800600 cow.osg//全屏显⽰osgviewer cow.osg那个⽜出来了。

osgqt的使用方式

osgqt的使用方式

osgqt的使用方式
使用OSGQt,您需要遵循以下步骤:
1. 安装OpenSceneGraph和Qt。

确保您的系统上已经安装了这两个库。

2. 创建一个Qt项目,并在项目中包含OpenSceneGraph的头文件和库文件。

3. 在Qt项目中创建一个窗口,并在窗口中添加一个渲染器。

渲染器是用于渲染3D场景的组件。

4. 加载3D模型并将其添加到场景中。

您可以使用OSG的模型加载器来加载3D模型文件,例如.osg、.osgt或.osgb文件。

5. 配置渲染器以使用OSG进行渲染。

您需要设置渲染器以使用OSG的渲染器实现,例如osgViewer::Viewer或osg::DisplayStyle。

6. 运行您的应用程序,并在窗口中查看3D模型。

这只是一般的指导步骤,具体的使用方式可能会因您的项目需求和环境而有所不同。

请参考OSGQt的文档和示例代码,以获取更详细的信息和示例代码。

osg初级教程

osg初级教程

几何体的绘制概述本章将介绍一些创建几何体元素的方法。

通常我们有这样几种处理几何体的手段:底层手段是使用松散封装的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叶节点添加到场景图形的根节点。

OSG基础教程:官方的四程序

OSG基础教程:官方的四程序

OSG基础教程:官⽅的四程序这两天⼩组任务完成,时间充⾜,预备再次温故下osg的内容:选⾃《OSG程序设计教程》第⼆章第⼆节第⼀个先来看看刚才我们编的osgViewer.1 osgViewer模型查看⼯具osgViewer是这四个程序当中⽤的最多的OSG程序,代码也⾮常⼊门与浅显易懂,在开始->运⾏->CMD中就可以直接启动osgViewer,因为path中添加了它的路径。

下⾯来看⼀下osgViewer的功能,如表1:表1 osgViewer的功能表命令:注意有的双杠功能--image <filename> 读取纹理⽂件,⽐如:osgViewer--image Images/skymap.jpg--dem <filename> 以⾼程图的形式渲染⼀个镜像/DEM ⽐如osgViewer --dem a.img--h或--help 命令⾏参数功能帮助--help-env 所有可⽤的环境变量帮助--help-keys 所有可⽤键帮助--help-all 展⽰所有帮助信息--SingleThreaded 为viewer选择单线程模式--CullDrawThreadPerContext 为viewer选择CullDrawThreadPerContext线程模式--DrawThreadPerContext 为viewer选择DrawThreadPerContext线程模式--CullThreadPerCameraDrawThr eadPerContext 为viewer选择—CullThreadPerCameraDrawThreadPerContext线程模式除此外,当osgViewer在渲染的过程当中,也会有⼀些基本的操作,同样列表如表2。

表2按键功能1 选择TrackBall操作器2 选择Flight操作器3 选择Driver操作器4 选择Terrain操作器< 在窗⼝模式下减少分辨率> 在窗⼝模式下增⼤分辨率Driver:Down 在Driver操作器下,光标向下移代表向下看Driver:Space 空格代表重置视⼝,回到原点Driver:Up 在Driver操作器下,光标向上移代表向上看Driver:a ⽤⿏标中键和右键加速Driver:q ⽤⿏标Y键控制速度S 输出状态到控制台Z 切换播放与否视⼝录像b 切换背⾯锡除与否e 切换是否限制帧速与否,⼀般60帧就够了,最少30也差不多f 在全屏与不全屏之间切换h 输出帮助信息l 在打开与关闭灯光之间切换m 切换线程模式s 在显⽰帧速,显⽰场景时间信息与什么都不显⽰之间来回切换t 在有⽆纹理之间切换w 在实体模式,多边形模式,点集模式之间来回切换z 在记录路径与否之间切换2 osgVersion库版本检测osgVersion应该是这四个程序当中⽤的最少的⼀个,它的功能很简单,就是查阅相关的版本信息。

osgEarth基础入门

osgEarth基础入门

osgEarth基础⼊门osgEarth基础⼊门2015年3⽉21⽇16:19osgEarth是基于三维引擎osg开发的三维数字地球引擎库,在osg基础上实现了⽡⽚调度插件,可选的四叉树调度插件,更多的地理数据加载插件(包括GDAL,ogr,WMS,TMS,VPB,filesystem等),再结合⼀套地理投影转换插件,这样就能够实现⾼效处理加载调度地理数据在三维地球上的显⽰,实现三维虚拟地球。

想要实现⼀个简单的基于osgEarth的三维地球,有两种⽅式,这两种⽅式是互通的。

⼀种基于XML标签的earth⽂件加载,另外⼀种是采⽤C++代码,本质是⼀样的,osgEarth内部⽀持直接解析XML标签⽂件,转换为代码实现,具体参考tests⽂件夹例⼦,代码则参考application 下⾯例⼦。

但是⼤多数情况下,你需要更灵活掌控性更强的代码来实现功能,因为只有⼀个加载了基础数据的三维地球是只能看,不能解决实际问题的,需要界⾯通常采⽤QT,更多的三维渲染和仿真业务则由osg来完成。

因此学好osg是做这⼀切的基础。

osgEarth的特点:⽀持加载常见的栅格数据(影像和DEM),但是⼤数据必须建⽴⾦字塔,设置为地理投影,想要⾼效率最好处理为⽡⽚,这样也便于部署在服务端。

⽮量数据,最好尽可能的简化,因为⼤的⽮量会⼗分影响渲染速度,当然也可以对⽮量栅格化处理加快速度,对于模型的话,⼤数据量⼀定要做LOD或者pageLod。

osgEarth程序的常规流程:创建osgViewer---->创建MapNode---->设置Earth操作器---->设置场景参数----->runMapNode是继承⾃osg的Node,是osgEarth中地球节点,你所添加的影像,DEM,模型都包含在MapNode中,因为它们都加⼊到Map中,Map则类似⼆维中的Map可以添加各种图层。

剩余的不管是模型节点Node,或者是标注Node,还是其他的都是可以直接添加到MapNode中或者另外的Group中。

OSG安装过程(VS2013+Win10+OSG3.4)

OSG安装过程(VS2013+Win10+OSG3.4)

一、文档信息创建于2015-08-04二、安装过程(一)安装虚拟光驱说明:虚拟光驱是一种模拟(CD/DVD-ROM)工作的工具软件,可以生成和你电脑上所安装的光驱功能一模一样的光盘镜像,安装包:Daemon_Tools_Lite_10.4.0.190.exe(二)安装Visual Studio 2013 Ultimate1、准备以下两个安装内容安装包:1)vs2013.2_ult_chs.iso 软件大小5.78GB2)vc_mbcsmfc.exe2、使用虚拟光驱加载ISO镜像3、双击光驱H,执行安装安装过程没有什么异常情况,只是时间很久,约莫3个小时。

安装过程没有什么异常情况,只是时间很久,约莫3个小时。

4、安装完之后,记得安装vc_mbcsmfc.exe这个是为了防止编译OSG的时候出现异常(三)安装OpenSceneGraph1、在D盘中新建文件夹OpenSceneGraph,并准备好编译材料。

根据下图说明,将压缩包解压成文字标识对应的目录。

这些文件是为了编译并生成Osg 相关的exe、dll、lib等内容。

(可以尝试直接使用共享文件夹的OSG文件夹,然后直接跳过第二步,进入第三步。

以减少编译的痛苦,第二步约莫合计要8个小时。

)2、编译生成Osg相关文件(1)使用CMake工具生成sln解决方案打开CMake-gui.exe将source中的CMakeLists.txt文件拖曳进入CMake,然后修改输出目录点击Configue按钮,然后设置C++ Compiler进行如下设置ACTUAL_3RDPARTY_DIR:D:\OpenSceneGraph\3rdPartyBUILD_OSG_EXAMPLES :勾上CMAKE_INSTALL_PREFIX:D:\OpenSceneGraph\source 点击Configure后,再将BUILD_MFC_EXAMPLE勾上。

最后点击Generate。

OSG基础教程官方的四程序

OSG基础教程官方的四程序

OSG基础教程官方的四程序OSG(OpenSceneGraph)是一个开源的3D图形渲染库,被广泛应用于虚拟现实、游戏开发、模拟仿真等领域。

本文将介绍OSG的四个基础程序。

1. osgviewerosgviewer是OSG的基本浏览器程序,它可以加载、渲染和交互显示3D模型。

它支持多种文件格式,如3DS、OBJ、STL等。

使用osgviewer,你可以通过命令行参数加载和显示3D模型,或使用交互式操作来浏览模型。

2. osganimateosganimate是一个用于播放和控制动画的程序。

它可以对加载的3D模型进行动画效果的展示,例如旋转、缩放、平移等。

osganimate还提供了控制动画播放速度、循环播放等功能,使你可以更好地展示模型的动态效果。

3. osgwidgetosgwidget是一个在Qt应用程序中嵌入OSG场景的控件。

借助osgwidget,你可以将OSG场景嵌入到Qt的窗口中,实现更复杂的交互和界面设计。

osgwidget还提供了与OSG场景的交互能力,允许用户在嵌入的OSG场景中进行操作。

4. osgviewerQTosgviewerQT是一个结合了osgviewer和osgwidget的程序。

它集成了osgviewer的3D场景渲染能力和osgwidget的界面嵌入特性。

osgviewerQT可以在Qt应用程序中直接加载和显示3D模型,同时提供了类似于osgviewer的命令行参数和交互功能,让你能够更方便地在Qt应用程序中展示和操作3D模型。

这四个程序提供了基本的功能和示例,帮助你快速了解和上手OSG。

通过osgviewer,你可以直接查看和操作3D模型;通过osganimate,你可以展示模型的动态效果;通过osgwidget和osgviewerQT,你可以将OSG场景嵌入到Qt应用程序中,实现更复杂的界面和交互。

除了这些官方的程序,OSG还有更多的功能和扩展库可以使用,例如osgText(用于显示文本)、osgGA(用于处理用户交互)、osgUtil(提供各种实用工具)、osgDB(用于读取和写入3D模型文件)、osgFX(提供各种特效)等。

OSG库导入的详细步骤

OSG库导入的详细步骤

实验一得详细步骤1.打开VS,操作如下:新建项目2.建立win32控制台应用程序,命名为test3.在应用程序设置中选择附加选项中的空项目如下图:4.右键test项目选择属性如图所示:5.选择配置属性->链接器->输入,附加依存项添加opengl32.lib glu32.lib glut32.lib如下图6.VS中选择菜单项中工具->选项如图所示:7.项目和解决方案->VC++ 目录,在包含文件中添加所需包含文件和库文件如下图:8.在源文件中添加cpp文件如图所示:9.将lesson1-1中的代码拷贝到main.cpp中,选择生成->编译(快捷键ctrl+F7),然后选择调试->启动调试(快捷键F5)10.选择是11.将lesson1-2中bool wireframeSwitch = FALSE;加到如图所示位置:12.将以下代码加到函数int DrawGLScene(GLvoid)中if (wireframeSwitch)glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);elseglPolygonMode(GL_FRONT_AND_BACK, GL_LINE);glPushMatrix();glTranslatef(-2.0f, 0.0f, 0.0f);glBegin(GL_QUADS);glColor3f(1.0f, 0.0f, 0.0f);glVertex3f(-1.0f,-1.0f,-10.0f);glVertex3f( 1.0f,-1.0f,-10.0f);glVertex3f( 1.0f, 1.0f,-10.0f);glVertex3f(-1.0f, 1.0f,-10.0f);glEnd();glPopMatrix();如图所示:运行结果:13.将if和else中的语句交换,就会出现不同的结果将如下代码拷贝到int DrawGLScene(GLvoid)if (wireframeSwitch)glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);elseglPolygonMode(GL_FRONT_AND_BACK, GL_FILL);glPushMatrix();glTranslatef(2.0f, 0.0f, 0.0f); glBegin(GL_QUADS);glColor3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f,-1.0f,-10.0f); glVertex3f( 1.0f,-1.0f,-10.0f); glVertex3f( 1.0f, 1.0f,-10.0f); glVertex3f(-1.0f, 1.0f,-10.0f); glEnd();glPopMatrix();如图所示:结果如图所示:将如下代码拷贝到程序中case WM_KEYDOWN:if (wParam == VK_F1){wireframeSwitch = !wireframeSwitch;}return 0;如下图所示:按F1键,将会看到两个矩形的变化,实现了交互。

OSG平台搭建教程

OSG平台搭建教程

OSG+VS2010+win7环境搭建Win7下osg+vs2010环境搭建一.相关准备a) Osg源码当前最新版:OpenSceneGraph的3.0.0.zip下载链接:/downloads/stable_releases/OpenSceneGraph-3.0/source/OpenSceneGraph-3.0.0.zipb) Osg第三方库3rdParty_VC10_x86_x64.zip.au/~bchrist/3rdParty_VC10_x86_x64.zipc) 数据包当前最新版:OpenSceneGraph-Data-3.0.0.zip下载链接:/downloads/stable_releases/OpenSceneGraph-3.0/data/OpenSceneGraph-Data-3.0.0.zipd) 安装源码工具cmake-2.8.4-win32-x86.exe至于这个文件的下载需要翻墙或者VPN代理,我使用的就是VPN代理的,如果不方便下载的话我传一个吧http://119.147.99.9/gdown_group255/M00/17/0A/d5NjCU-aQJMAAAAAAIssvk3uq Wk5209449/cmake-2.8.8-win32-x86.exe?k=61GUEkJXX2Buzr15ZSgafA&t=13466 93036&u=244400084-9477243-e7vfww1u&s=307200&file=cmake-2.8.8-win32-x 86.exe。

二、编译准备为了编译的顺利进行,将下载的文件组织如下:在E盘建立一个OSG的文件夹,然后其他文件如下放置:E:\OSG\OpenSceneGraph:源码解压后放于此E:\OSG\3rdParty:第三方依赖库解压后放于此注意这个里面的第三方库一般包含x64和x86的两个版本的,这里要根据你自己的电脑需要选择一个然后把里面的文件复制到3rdParty文件夹中。

osg源码编译

osg源码编译

OSG(OpenSceneGraph)是一个开源的高性能3D图形工具包,广泛应用于可视化、游戏、虚拟现实等领域。

以下是OSG源码编译的一般步骤:获取OSG源码:可以从OSG 的官方网站或代码仓库下载最新的源码。

准备编译环境:确保你的系统中已经安装了CMake和编译器(如GCC或Visual Studio)。

解压源码:将下载的OSG源码解压到一个合适的目录。

创建构建目录:在源码目录外创建一个新的目录,用于存放编译过程中生成的中间文件和最终的可执行文件。

配置CMake:打开CMake工具,指定源码目录和构建目录。

根据你的需求,可以选择合适的配置选项,如安装路径、编译选项等。

生成构建文件:点击CMake工具中的“Configure”按钮,等待配置完成后,再点击“Generate”按钮生成构建文件。

编译源码:打开你选择的编译器,加载生成的构建文件,然后开始编译。

编译完成后,你将在构建目录中找到生成的可执行文件和库文件。

请注意,具体的编译步骤可能因你使用的操作系统和编译器而有所不同。

因此,在编译OSG源码之前,建议仔细阅读OSG的官方文档和相关资源,以确保你了解适用于你的环境的详细步骤和要求。

osg入门指导

osg入门指导
一直以来,OSG 都是以源代码作为可阅读的文档资料。OSG 的发布版本中 包含了一些示例程序,用于介绍各种不同渲染效果的实现,以及 OSG 与终端用 户软件的集成方法。有相当部分的开发者可以通过这些示例程序,以及使用调试 工具深入了解 OSG 的核心,成长为熟练的 OSG API 程序员。
尽管根据以往的经验,源代码足可起到编程文档的作用,但是它仍然不能替 代正式格式的编程文档。图形和表格是编程手册中常见的易于理解的教学工具, 但是它们在源代码中几乎无法体现。正因为 OSG 的迅速发展和愈发复杂的体系, 对于它的新用户来说,在缺乏参考文档的情况下学习 OSG 所需的时间也就越长, 这是我们所不愿看到的。事实上,在这本书面世以前,由于编程文档的匮乏,一 部分开发者已经对 OSG 的成熟性和稳定性产生了疑问,怀疑它是否能胜任专业 级应用程序的开发工作。
本书要求读者有一定的 C++语言基础和数学知识,适合所有对 OSG 编程感 兴趣的读者阅读。
自 Sutherland 在 1965 年提出“Ultimate Display”并设计实现了世界上第一 个交互式图形系统后,计算机图形学及人-机交互技术取得了难以想象的进步。 在过去 20 年当中,随着计算机图形加速技术的快速发展,由计算机实时传输、 处理、可视化亿级比特数据、并为终端用户提供三维交互式场景已经成为现实。 而以虚拟现实为代表的显示技术和图形信息管理技术也取得了很大进步。目前, 全球有数以千计的公司的业务涉及或正在使用三维交互式图形系统,而这些软件 在显示、模拟、仿真、计算机辅助设计、科学数据可视化及分析领域的应用随处 可见。这些应用已成为科研开发、工业生产中的重要工具。
3 在用户程序中使用 OpenSceneGraph …………………… 104 3.1 渲染 …………………………………………………………… 104

OSG基础虚拟现实仿真软件编程技术讲解与实战

OSG基础虚拟现实仿真软件编程技术讲解与实战

总结:要想实现自己的功能,加入自己的代码,就要定义自己 的节点类,由于OSG使用了组合设计模式,我们自己定义的类在 OSG看来和它自己的类是一样的,OSG的这种场景图结构,基本上 是业界的一种标准,很多程序都实现了类似的结构。
6、Delta3d虚拟现实仿真工具编程技术讲 解与实战
最简单的Delta3D程序
viewer.frame(); } viewer.sync(); return 0; } 编译运行后,就能看到一个飞机的模型。 NOTE:如果看不到模型,检查OSG1.0是否正确安装,即 OSG_FILE_PATH是否设置正确。 这个程序的核心是,osgProducer命名空间的Viewer类实例, 这个类负责管理窗口的创建,控制投影矩阵,控制OpenGL的渲 染,实现程序的主循环。它还具有控制场景渲染状态,查看帧速, 抓图等功能。OsgDB命名空间的readNodeFile函数负责从文件里 读入三维模型及其纹理等数据,它返回读入的节点,可以加到场 景图中。主循环分三步,同步,更新和绘制,当用户按下ESC键 时,osgProducer::Viewer::done()返回true,主循环结束。
class CCessna : public osg::PositionAttitudeTransform { public: CCessna(void); ~CCessna(void); private: osg::ref_ptr<osg::Node> _Model; }; 成员变量_Model是保存模型的指针。 这样,在构造函数里,将_Model加为儿子: CCessna::CCessna(void) { _Model = osgDB::readNodeFile("cessna.osg"); this->addChild(_Model.get()); } 继续使用第一个教程的源码,将这一句:

实习生培训教材OSG基础.pptx

实习生培训教材OSG基础.pptx
<blueprint xmlns="/xmlns/blueprint/v1.0.0"> <reference id="savingsRef" interface="org.fusesource.example.SavingsAccount"/>
<bean id="client" class="org.fusesource.example.client.Client"> <property name="savingsAccount" ref="savingsRef"/> </bean> </blueprint>
TCS Confidential
2020年4月14日星期二
部署OSGi bundle
• 热部署 • 手动部署
– osgi:install -s file:ProjectDir/target/foo-1.0-SNAPSHOT.jar – osgi:uninstall 181
TCS Confidential
<blueprint xmlns="/xmlns/blueprint/v1.0.0"> <bean id="savings" class="org.fusesource.example.SavingsAccountImpl"/>
<service ref="savings" interface="org.fusesource.example.Account"/>
</blueprint>
  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);pyramidGeometry->addPrimitiveSet(pyramidFaceOne);osg::DrawElementsUInt* pyramidFaceTwo =new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);pyramidFaceTwo->push_back(1);pyramidFaceTwo->push_back(2);pyramidFaceTwo->push_back(4);pyramidGeometry->addPrimitiveSet(pyramidFaceTwo);osg::DrawElementsUInt* pyramidFaceThree =new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);pyramidFaceThree->push_back(2);pyramidFaceThree->push_back(3);pyramidFaceThree->push_back(4);pyramidGeometry->addPrimitiveSet(pyramidFaceThree);osg::DrawElementsUInt* pyramidFaceFour =new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);pyramidFaceFour->push_back(3);pyramidFaceFour->push_back(0);pyramidFaceFour->push_back(4);pyramidGeometry->addPrimitiveSet(pyramidFaceFour)定义一个Vec4的数组,用于保存颜色值。

osg::Vec4Array* colors = new osg::Vec4Array;colors->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 1.0f) ); //索引0 红色colors->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f) ); //索引1 绿色colors->push_back(osg::Vec4(0.0f, 0.0f, 1.0f, 1.0f) ); //索引2 蓝色colors->push_back(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f) ); //索引3 白色下一步要将顶点数组的元素与颜色数组的元素对应起来。

我们将声明一个与顶点数组有相同个数元素的向量组。

它将负责连接各个顶点与颜色。

该向量组的索引对应顶点数组的元素,其取值对应颜色数组的索引。

如果需要将顶点数组与法线数组或者纹理坐标数组一一对应,那么还需重复这一步骤。

注意在本例中,我们需要将5个顶点对应到4种颜色上。

因此顶点数组的元素0(左下)和元素4(塔尖)都需要对应到颜色数组元素0(红色)上。

osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4> *colorIndexArray;colorIndexArray =new osg::TemplateIndexArray<unsigned int, osg::Array::UIntArrayType,4,4>; colorIndexArray->push_back(0); // vertex 0 assigned color array element 0colorIndexArray->push_back(1); // vertex 1 assigned color array element 1colorIndexArray->push_back(2); // vertex 2 assigned color array element 2colorIndexArray->push_back(3); // vertex 3 assigned color array element 3colorIndexArray->push_back(0); // vertex 4 assigned color array element 0下一步,我们将颜色数组以及刚才创建的颜色索引数组与几何体相关联,并设置绑定模式为“按顶点绑定”。

pyramidGeometry->setColorArray(colors);pyramidGeometry->setColorIndices(colorIndexArray);pyramidGeometry->setColorBinding(osg::Geometry::BIND_PER_VERTEX);osg::Vec2Array* texcoords = new osg::Vec2Array(5);(*texcoords)[0].set(0.00f,0.0f);(*texcoords)[1].set(0.25f,0.0f);(*texcoords)[2].set(0.50f,0.0f);(*texcoords)[3].set(0.75f,0.0f);(*texcoords)[4].set(0.50f,1.0f);pyramidGeometry->setTexCoordArray(0,texcoords);现在我们已经创建了一个几何体节点,并将其添加到场景中。

相关文档
最新文档