#osg的第一次邂逅
今天写一点感言,毕竟刚刚学着写博客,恰好刚刚学习osg,所多说点感想算是给我未来程序员生涯立下一个flag。
放假遇上疫情,却很偶然的收到一份offer,就是关于osg的,于是不要命的匆匆赶来了,自然按流程就要在家呆14天,可实习还是要学习的,干我们这行,遇到了不都要学嘛,难道不都这样吗,反正我已经习惯了,小组长在群里发了很多资料,今天跟我说做一条俯角30*,与x轴相交的直线,本以为现实纸张上中随手一笔在osg里面对我这样的小白如此艰难,因为前面我也说过,以前我学了些C++,但对osg却一无所知,只能迎着头皮一点一点的试,最后忙了一天是蓝屏。。。我不甘心的改了些参数,它出现了一条又丑又黑的线段,但我无比激动,这就是计算机带给我的的快乐和激动,哈哈哈,毕竟自己一天查了那么多资料一个字母一个字母的敲出来的,谁会嫌弃自己的孩子丑呢,这也是自己深爱编程的原因,任何行业无法比拟的,言归正传,我发现网上一搜osg做的几何体的源码例子很多很经典,但我发现写一条线段的代码真的很少,可能太简单了吧,但对初学者来说真的挺难的。下面我会记下今天的心得。
#include <osgUtil/SmoothingVisitor>
#include <osg/Geometry>
#include <osg/Matrixd>
#include <osg/MatrixTransform>
#include <osgViewer/Viewer>
#include <osg/LineWidth>
int main()
{//创建相应的节点和对象
osg::ref_ptr<osg::Geode> geo = new osg::Geode; //创建子节点
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; //创建绘画对象
osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array; //创建线段数据数组
osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array; //法线数据数组
//设置线段定点数据
point->push_back(osg::Vec3(10.0,30.0,0.0)); //线段起点,组长给的起点是10,30
point->push_back(osg::Vec3(100.0, 0.0, 0.0));
normal->push_back(osg::Vec3(0.0, 0.0, 0.0)); //坐标原点
normal->push_back(osg::Vec3(40.0, 0.0, 0.0));
geom->setVertexArray(point.get()); //将设置好的数据传入图元
geom->setNormalArray(normal.get());
osg::ref_ptr<osg::LineWidth> lw = new osg::LineWidth(6.0); //设置线条宽度
geom->getOrCreateStateSet()->setAttribute(lw, osg::StateAttribute::ON);
geom->setNormalBinding(osg::Geometry::BIND_OVERALL); //与法线的绑定方式,这里我选择的旋转
geom->addPrimitiveSet(new osg::DrawArrays(osg::DrawArrays::LINES, 0, 2)); //???后面两个参数不明白
geo->addDrawable(geom); //调用函数画图元
osgViewer::Viewer viewr; //建立view对象在屏幕中显示
viewr.setSceneData(geo.get());
return viewr.run();
}
![这就是我费劲巴力的丑丑线,花了我这么多行代码,哈哈](https://img-blog.csdnimg.cn/20200306002718500.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDQ1NzM1MQ==,size_16,color_FFFFFF,t_70)
#总结
osg画图都会有几个步骤
1、生成子节点: osg::ref_ptr<osg::Geode> geo = new osg::Geode; 你可以将这个节点的效果加到别的节点
2、创建绘图类的对象 osg::ref_ptr<osg::Geometry> geom = new osg::Geometry; 这就好像画画一样你要现在脑海中拿一些注意力来先想象。
3、创建相关的数据数组 osg::ref_ptr<osg::Vec3Array> point = new osg::Vec3Array; osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array; 接着去想画什么,怎么画,画哪里,然后对这些数据初始化
4、将想好的东西组合起来,osg::setvertex(xxx.get)........
5、最后把所有的全部整合起来组成一幅完美的画卷,尽管在脑子里。 geo->addDrawable(geom);
6、最后的组后把你脑海中的画面从脑子中展现出来就要用sogviewer::viewer了
尽管今天的东西相差甚远,但总算有了收获,明天还会继续的,把他完善。