OSG 学习第二天(几何体的绘制)
OSG 几何体的绘制
前言:今天按照书上撸了大部分绘制几何体的代码,感觉这样学习一点用都没有,这两天就当练手了吧,明天开始总结各个函数的使用和渲染的方法。
1.基本几何体绘制示例 基本几何体绘制(osg::Geometry)示例演示了创建一个几何体的过程,示例中创建了最简单的四边形。 代码如下:
//2017.8.2
//绘制基本几何体
#include #include
#include
#include #include
#include #include //创建一个四边形节点
osg::ref_ptr createQuad()
{
//创建一个叶节点对象
osg::ref_ptr geode = new osg::Geode();
//创建一个几何体对象
osg::ref_ptr geom = new osg::Geometry();
//创建顶点数组,注意顶点的添加顺序是逆时针的
osg::ref_ptr 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));
//设置顶点数据
geom->setVertexArray(v.get());
//创建纹理坐标
osg::ref_ptr vt = new osg::Vec2Array();
//添加数据
vt->push_back(osg::Vec2(0.0f,0.0f));
vt->push_back(osg::Vec2(1.0f,0.0f));
vt->push_back(osg::Vec2(1.0f,1.0f));
vt->push_back(osg::Vec2(0.0f,1.0f));
//设置纹理坐标
//geom->setTexCoordArray(0,vt.get());
//创建颜色数组
osg::ref_ptr 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));
//设置颜色数组
geom->setColorArray(vc.get());
//设置颜色的绑定方式为单个顶点
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
//创建法线数组
osg::ref_ptr nc = new osg::Vec3Array();
//创建法线数组
geom->setNormalArray(nc.get());
//添加法线
nc->push_back(osg::Vec3(0.0f, -1.0f, 0.0f));
//设置法线数组
geom->setNormalArray(nc.get());
//设置法线绑定方式为全部为顶点
geom->setNormalBinding(osg::Geometry::BIND_OVERALL);
//添加图元,绘图基元为四边形
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));
//添加到叶节点
geode->addDrawable(geom.get());
return geode.get();
}int main()
{
osg::ref_ptr viewer = new osgViewer::Viewer();
osg::ref_ptr root = new osg::Group();
//添加到场景
root->addChild(createQuad());
//优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
//设置场景数据
viewer->setSceneData(root.get());
//初始化并创建窗口
viewer->realize();
//开始渲染
viewer->run();
return 0;
}
程序运行截图:
文章图片
2.预定义几何体示例
代码如下:
//2017.8.2
//预定义几何体示例#include #include
#include
#include
#include #include
#include #include //绘制多个预定义的几何体
osg::ref_ptr createShape()
{
//创建一个叶节点
osg::ref_ptr geode = new osg::Geode();
//设置半径和高度
float radius = 0.8f;
float height= 1.0f;
//创建精细度对象,精细度越高,细分就越多
osg::ref_ptr hints = new osg::TessellationHints();
//设置精细度为0.5f
hints->setDetailRatio(0.5f);
//添加一个球体,第一个参数是预定义几何体对象,第二个参数是精细度,默认为0
geode->addDrawable(new osg::ShapeDrawable(new osg::Sphere(osg::Vec3(0.0f, 0.0f, 0.0f),radius),hints.get()));
//添加一个正方体
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(2.0f, 0.0f, 0.0f),2*radius),hints.get()));
//圆锥
geode->addDrawable(new osg::ShapeDrawable(new osg::Cone(osg::Vec3(4.0f, 0.0f, 0.0f),radius,height),hints.get()));
//圆柱体
geode->addDrawable(new osg::ShapeDrawable(new osg::Cylinder(osg::Vec3(6.0f, 0.0f, 0.0f),radius,height),hints.get()));
//太空舱
geode->addDrawable(new osg::ShapeDrawable(new osg::Capsule(osg::Vec3(8.0f, 0.0f, 0.0f),radius,height),hints.get()));
return geode.get();
}int main()
{
//创建Viewer对象
osg::ref_ptr viewer = new osgViewer::Viewer();
osg::ref_ptr root = new osg::Group();
//添加到场景
root->addChild(createShape());
//优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());
//设置场景数据
viewer->setSceneData(root.get());
//初始化并创建窗口
viewer->realize();
//开始渲染
viewer->run();
return 0;
}
程序运行截图:
文章图片
推荐阅读
- 由浅入深理解AOP
- 继续努力,自主学习家庭Day135(20181015)
- python学习之|python学习之 实现QQ自动发送消息
- 以读攻“毒”唤新活动曹彦斌打卡第二天
- 一起来学习C语言的字符串转换函数
- 定制一套英文学习方案
- 漫画初学者如何学习漫画背景的透视画法(这篇教程请收藏好了!)
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 如何更好的去学习
- 【韩语学习】(韩语随堂笔记整理)