查看: 3035|回复: 10

无用教程第(一)集 sky1811

[复制链接]

该用户从未签到

发表于 2011-9-3 02:43:35 | 显示全部楼层 |阅读模式
本帖最后由 sky11811 于 2011-9-3 02:48 编辑

前一段时间,发表了过激言论,遭到了猛烈的抨击,被指有腐败公务员做派,呵呵,那些腐败的公务员被你们低估啦,
他们说话极为圆滑,绝不激怒大众,像我这样说话有棱角的根本没有腐败的资格,混得凄惨无比,在家还被老婆指责没出息,“人家吃吃喝喝,从不加班,都科长了,你天天加班写你的狗屁程序,没给家里创造一分收入,一次没有升迁,一直是个科员,人家都有车了,你就好好骑你的电动车吧”。
作为一个30岁的人,我郁闷无比,喜欢实时渲染技术,但只能等老婆睡觉了再看文档学习,上班倒是可以看,但是成果很难和大家分享,办公室不能上网且绝不允许使用u盘。
所以只有凌晨3点以后才有时间给大家贡献点东西啦,见谅。


--------------------------------废话完毕开始正事----------------------------------------------

这个例子的效果是顶点在z方向抖动,要展示的是顶点数组的访问修改,其他数组如:纹理坐标数组、法线数组等均可参考。这个例子新手觉得没意思,老手也觉得没意思,适合
有图形基础,但不熟悉osg的同志参考。我学习osg有一个月了,但学习openGL有接近10年了,我知道熟悉OpenGL的同志最希望看到什么样的osg文档。通过近一个月的集中学习,我的感触是OSG真是太好了,我爱不释手,我对osg的源代码做了一些改动,完成了FirstPersonManipulator中的未实现部分,达到了和cs一样的操作效果,修改了osgearth的skynode源代码,实现了地球和大气的散射效果共存(skynode原本只有大气有散射效果而地球本身没有)。熟悉了osgDEM命令,发现现有书籍里对“--xx --xt --yy --yt --zz --zt 指定每个像素所指的大小” 的解释都是残缺或者错误的。



  1. #include <osg/Geode>
  2. #include <osg/Geometry>
  3. #include <osg/Point>
  4. #include <osg/StateSet>
  5. #include <osgViewer/Viewer>
  6. #ifdef _DEBUG
  7. #pragma comment(lib,"osgd.lib")
  8. #pragma comment(lib,"osgDBd.lib")
  9. #pragma comment(lib,"osgViewerd.lib")
  10. #endif
  11. #ifdef NDEBUG
  12. #pragma comment(lib,"osg.lib")
  13. #pragma comment(lib,"osgDB.lib")
  14. #pragma comment(lib,"osgViewer.lib")
  15. #endif

  16. class ChangeVertex : public osg::NodeCallback
  17. {
  18. public:
  19. ChangeVertex()
  20. {
  21.   haveStored = false;
  22.   v = new osg::Vec3Array;
  23. }
  24. virtual void operator()( osg::Node* node,
  25.   osg::NodeVisitor* nv )
  26. {
  27.   // 这个node本来就是osg::Geode,所以下面的代码可以轻松的转换node为osg::Geode类型。
  28.   osg::Geode * geode = node->asGeode();
  29.   // 我们只添加了一个几何体所以getDrawable(0)就可以了,不用
  30.   // for( unsigned int i=0; i < geode.getNumDrawables(); ++i ) getDrawable(i);
  31.   // 要是你愿意也没人拦你。
  32.   osg::Geometry* geom = dynamic_cast<osg::Geometry*>(geode->getDrawable(0));
  33.   // 接下来这一句是所有图形基础较好的同志最关心的问题了,基础较好者往往关心底层的
  34.   // 东西,希望有更多的控制。这一句获取顶点存储容器的指针,极易犯错。在下面的for循环
  35.   // 里我会解释为什么容易犯错。
  36.   osg::Vec3Array* _vertices = dynamic_cast<osg::Vec3Array*>(geom->getVertexArray());
  37.   if(haveStored)
  38.   {
  39.    for(unsigned int i = 0;i<_vertices->size();i++)
  40.    {
  41.     // 这里C++功夫不过关的同志容易犯错,常见错误如下: _vertices[i],_vertices[i].getDataPointer
  42.     // 这样的书写没有语法错误,但是概念错误,如果运行将导致程序崩溃。这样的使用方法只有_vertices[0]
  43.     // 不会导致指针越界。_vertices是指向容器的
  44.     // 指针,数据在容器中,而不在_vertices中,所以要(*_vertices)[i]。
  45.    
  46.     (*_vertices)[i]._v[2] = (*v)[i]._v[2] + sin(((rand()%314)-157)/314.0)*0.6;
  47.    }
  48.   }
  49.   else
  50.   {
  51.    // 这段代码存储几何体顶点数据,用来参考,呵呵
  52.    // 这个例子的效果是顶点在z方向抖动所以需要存储原始位置。
  53.    for(unsigned int i = 0;i<_vertices->size();i++)
  54.    {
  55.     v->push_back((*_vertices)[i]);
  56.    }
  57.    haveStored = true;
  58.   }
  59.   traverse( node, nv );
  60. }
  61. private:
  62. osg::ref_ptr<osg::Vec3Array> v;
  63. bool haveStored;
  64. };

  65. osg::ref_ptr<osg::Geode>
  66. createPoints()
  67. {
  68. // 创建几何体类,该类用于绘制几何体,并存储几何体的相关数据。
  69. // 例如:顶点数组、法线数组、纹理坐标数组等等。要访问修改几
  70. // 何体数据就要找这个类。注意这个类和osg::Geode的关系,osg::Geode
  71. // 用来管理osg::Geometry,一个osg::Geode可以有多个osg::Geometry。
  72. osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
  73. osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
  74. geom->setVertexArray( v.get() );
  75. v->push_back( osg::Vec3( 0.f, 0.f, 0.f ) );
  76. v->push_back( osg::Vec3( 0.f, 0.f, 4.f ) );
  77. v->push_back( osg::Vec3( -1.f, 0.f, 0.f ) );
  78. v->push_back( osg::Vec3( 1.f, 0.f, 0.f ) );
  79. v->push_back( osg::Vec3( 1.f, 0.f, 4.f ) );
  80. v->push_back( osg::Vec3( -1.f, 0.f, 4.f ) );
  81. v->push_back( osg::Vec3( 0.f, -1.f, 0.f ) );
  82. v->push_back( osg::Vec3( 0.f, 1.f, 0.f ) );
  83. v->push_back( osg::Vec3( 0.f, 1.f, 4.f ) );
  84. v->push_back( osg::Vec3( 0.f, -1.f, 4.f ) );
  85.     // 这个例子中我们需要动态的修改顶点数组的数据,所以不希望使用显示列表来加速。
  86. geom->setUseDisplayList(false);
  87. // 指定绘制图元的类型及数量,对OpenGL熟悉的同志应该对这个十分有感情。
  88. geom->addPrimitiveSet( new osg::DrawArrays( GL_POINTS, 0, 10 ) );
  89.     // 创建叶节点,准备收容几何体类
  90. osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  91. // 收容几何体。
  92. geode->addDrawable( geom.get() );
  93.     // 下面一段代码关闭光照,指定点尺寸。
  94. osg::StateSet* state = geode->getOrCreateStateSet();
  95. state->setMode( GL_LIGHTING, osg::StateAttribute::OFF |
  96.   osg::StateAttribute::PROTECTED );
  97. osg::ref_ptr<osg::Point> pt = new osg::Point;
  98. pt->setSize( 10.f );
  99. state->setAttribute( pt.get() );

  100. geode->setUpdateCallback(new ChangeVertex());
  101. return geode.get();
  102. }
  103. int
  104. main( int, char ** )
  105. {
  106. osgViewer::Viewer viewer;
  107. viewer.setSceneData( createPoints().get() );
  108. return viewer.run();
  109. }
复制代码

该用户从未签到

 楼主| 发表于 2011-9-3 02:49:49 | 显示全部楼层
本帖最后由 sky11811 于 2011-9-3 03:02 编辑

贴的代码格式乱了,不知如何修改,影响阅读请见谅。要看着舒服复制代码至剪贴板,然后粘贴到vc里看吧。

该用户从未签到

发表于 2011-9-3 09:22:35 | 显示全部楼层
先顶个!

该用户从未签到

发表于 2011-9-3 10:29:40 | 显示全部楼层
多谢楼主了。。

该用户从未签到

发表于 2011-9-4 09:25:12 | 显示全部楼层
本帖最后由 CWorld 于 2011-9-4 12:52 编辑

下载了,可以运行,看的出来lz写的很认真。看看编辑的时间也颇为敬佩!觉得lz有机会可以考虑兼职和参与开源的工程,这样就可以更加深入理解工业和行业的需求。

1   有个问题,如果没有设置VBO

   setUseVertexBufferObjects( true );这种情况下,关闭了显示列表。会调用VBO模式吗?

   我也很喜欢实时渲染技术,每天工作也是一堆琐事。据说osg的一部分核心功能是在Robert没有薪酬的情况下完成的,不知道他是怎么过来的。

该用户从未签到

发表于 2011-9-5 08:24:24 | 显示全部楼层
先顶起!

该用户从未签到

发表于 2011-9-6 11:31:45 | 显示全部楼层
我真是感动与楼主的精神啊,惭愧!

该用户从未签到

发表于 2011-11-11 21:52:22 | 显示全部楼层
支持,支持,不管怎么样,写出来了都值得我们学习

该用户从未签到

发表于 2011-11-21 15:46:34 | 显示全部楼层
顶, 第二集呢?

该用户从未签到

发表于 2012-2-20 12:49:02 | 显示全部楼层
真男人,追求生命的真正价值,追求内在的极致大道,有朝一日定能飞黄腾达!

该用户从未签到

发表于 2012-4-13 10:47:15 | 显示全部楼层
支持楼主,真是令人感动啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表