Learning OSG programing---osgShape

本例示范了osg中Shape ---- 基本几何元素的绘制过程。参照osg官方文档,Shape 类包含以下子类:

在示例程序中,函数createShapes函数用于生成需要绘制的几何形状。

 1 osg::Geode* createShapes(osg::ArgumentParser& arguments)
 2 {
 3     osg::Geode* geode = new osg::Geode();
 4
 5
 6     // ---------------------------------------
 7     // Set up a StateSet to texture the objects
 8     // ---------------------------------------
 9     osg::StateSet* stateset = new osg::StateSet();
10   //设置材质图片
11     osg::ref_ptr<osg::Image> image = osgDB::readRefImageFile( "Images/lz.rgb" );
12     if (image)
13     {
14         osg::Texture2D* texture = new osg::Texture2D;
15         texture->setImage(image);
16         texture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
17         stateset->setTextureAttributeAndModes(0,texture, osg::StateAttribute::ON);
18     }
19
20     stateset->setMode(GL_LIGHTING, osg::StateAttribute::ON);
21
22     geode->setStateSet( stateset );
23
24
25     float radius = 0.8f;
26     float height = 1.0f;
27
28     osg::TessellationHints* hints = new osg::TessellationHints;
29     hints->setDetailRatio(0.5f);
30   //建立各种几何实体
31     geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f,0.0f,0.0f),radius),hints));
32     geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(2.0f,0.0f,0.0f),2*radius),hints));
33     geode->addDrawable(new osg::ShapeDrawable(new osg::Cone(osg::Vec3(4.0f,0.0f,0.0f),radius,height),hints));
34     geode->addDrawable(new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(6.0f,0.0f,0.0f),radius,height),hints));
35     geode->addDrawable(new osg::ShapeDrawable(new osg::Capsule(osg::Vec3(8.0f,0.0f,0.0f),radius,height),hints));
36   //用于控制平面的高程起伏
37     osg::HeightField* grid = new osg::HeightField;
38     if (arguments.read("--large"))      //大范围
39     {
40         unsigned int numX = 512;
41         unsigned int numY = 512;
42         double sizeX = 10.0;
43         double sizeY = 10.0;
44         grid->allocate(numX,numY);
45         grid->setXInterval(sizeX/float(numX));
46         grid->setYInterval(sizeY/float(numY));
47
48         for(unsigned int r=0;r<numY;++r)
49         {
50             for(unsigned int c=0;c<numX;++c)
51             {
52                 double rx = double(c)/double(numX-1);
53                 double ry = double(r)/double(numY-1);
54
55                 grid->setHeight(c, r, 2.0*sin(rx*ry*4.0*osg::PI));
56             }
57         }
58     }
59     else              //小范围
60     {
61         grid->allocate(38,39);
62         grid->setXInterval(0.28f);
63         grid->setYInterval(0.28f);
64
65         for(unsigned int r=0;r<39;++r)
66         {
67             for(unsigned int c=0;c<38;++c)
68             {
69                 grid->setHeight(c,r,vertex[r+c*39][2]);
70             }
71         }
72     }
73
74     geode->addDrawable(new osg::ShapeDrawable(grid));
75
76     return geode;
77 }

在以上代码中,首先建立了几何节点Geode,加载纹理图像,并将其设置为节点的材质。

之后向节点中加入各种Shape模型,设置它们的集合参数。之后建立了高程域模型osg::HeightField* grid,根据运行程序时提供的命令行参数,设置其为不同的点密度。若运行命令中提供有--large选项,则建立高密度高程集,两层for循环中嵌套的语句,即为计算高程网格中各点的高程值方程。对于large情形,其在点(x,y)处的高程值为2*sin(x*y*4π)。而在普通情况下,点的高程值取决与vertex向量的第三个分量,因为在文件的开始,包含了地形坐标数据:

#include "../osghangglide/terrain_coords.h"

最后,将定义的地形平面添加到节点中去。

在主函数中,调用上面定义的createShapes函数,在进行一些其他准备工作即可:

int main(int argc, char **argv)
{
    osg::ArgumentParser arguments(&argc,argv);

    // construct the viewer.
    osgViewer::Viewer viewer(arguments);

    // add model to viewer.
    viewer.setSceneData( createShapes(arguments) );

    // add the state manipulator
    viewer.addEventHandler( new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()) );

    return viewer.run();
}

按不同模式运行程序,得到不同的效果:

--large模式:

正常模式:

由此程序受到启发,可利用osg高程域,建立DEM(数字高程模型)浏览或仿真、编辑工具,达到学以致用的目的。

Enjoy!

原文地址:https://www.cnblogs.com/SupremeGIS-Developer/p/10665574.html

时间: 2024-11-04 20:28:54

Learning OSG programing---osgShape的相关文章

Java Machine Learning Tools &amp; Libraries--转载

原文地址:http://www.demnag.com/b/java-machine-learning-tools-libraries-cm570/?ref=dzone This is a list of 25 Java Machine learning tools & libraries. Weka has a collection of machine learning algorithms for data mining tasks. The algorithms can either be

[C3] Andrew Ng - Neural Networks and Deep Learning

About this Course If you want to break into cutting-edge AI, this course will help you do so. Deep learning engineers are highly sought after, and mastering deep learning will give you numerous new career opportunities. Deep learning is also a new "s

【机器学习实战】Machine Learning in Action 代码 视频 项目案例

MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apache中文网) 视频每周更新:如果你觉得有价值,请帮忙点 Star[后续组织学习活动:sklearn + tensorflow] ApacheCN - 学习机器学习群[629470233] 第一部分 分类 1.) 机器学习基础 2.) k-近邻算法 3.) 决策树 4.) 基于概率论的分类方法:朴素

Neural Networks and Deep Learning学习笔记ch1 - 神经网络

近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的.从最主要的感知机開始讲起.到后来使用logistic函数作为激活函数的sigmoid neuron,和非常多其它如今深度学习中常使用的trick. 把深度学习的一个发展过程讲得非常清楚,并且还有非常多源代码和实验帮助理解.看完了整个tutorial后打算再又一次梳理一遍,来写点总结.以后再看其它资料

Deep Learning Enables You to Hide Screen when Your Boss is Approaching

https://github.com/Hironsan/BossSensor/ 背景介绍 学生时代,老师站在窗外的阴影挥之不去.大家在玩手机,看漫画,看小说的时候,总是会找同桌帮忙看着班主任有没有来. 一转眼,曾经的翩翩少年毕业了,新的烦恼来了,在你刷知乎,看视频,玩手机的时候,老板来了! 不用担心,不用着急,基于最新的人脸识别+手机推送做出的BossComing.老板站起来的时候,BossComing会通过人脸识别发现老板已经站起来,然后通过手机推送发送通知“BossComing”,并且震动告

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

repost: Deep Reinforcement Learning

From: http://wanghaitao8118.blog.163.com/blog/static/13986977220153811210319/ accessed 2016-03-10 深度强化学习(Deep Reinforcement Learning)的资源 Google的Deep Mind团队2013年在NIPS上发表了一篇牛x闪闪的文章,亮瞎了好多人眼睛,不幸的是我也在其中.前一段时间收集了好多关于这方面的资料,一直躺在收藏夹中,目前正在做一些相关的工作(希望有小伙伴一起交流)

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 Spark MLlib Deep Learning工具箱,是根据现有深度学习教程<UFLDL教程>中的算法,在SparkMLlib中的实现.具体Spark MLlib Deep Learning(深度学习)目录结构: 第一章Neural Net(NN) 1.源码 2.源码解析 3.实例 第二章D

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 2基础及源码解析 2.1 Convolution Neural Network卷积神经网络基础知识 1)基础知识: 自行google,百度,基础方面的非常多,随便看看就可以,只是很多没有把细节说得清楚和明白: 能把细节说清