当前位置: 首页 > news >正文

OSG粒子系统与阴影-自定义粒子系统示例<1>(4)

自定义粒子系统示例(一)

        自定义粒子系统示例(一)的代码如程序清单11-5所示:

/* 自定义粒子系统示例1 */
void particleSystem_11_5(const string &strDataFolder)
{osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;traits->x = 40;traits->y = 40;traits->width = 600;traits->height = 480;traits->windowDecoration = true;traits->doubleBuffer = true;traits->sharedContext = 0;osg::ref_ptr<osg::GraphicsContext> gc = osg::GraphicsContext::createGraphicsContext(traits.get());osg::ref_ptr<osg::Camera> camera = viewer->getCamera();camera->setGraphicsContext(gc.get());camera->setViewport(new osg::Viewport(0, 0, traits->width, traits->height));GLenum buffer = traits->doubleBuffer ? GL_BACK : GL_FRONT;camera->setDrawBuffer(buffer);camera->setReadBuffer(buffer);osg::ref_ptr<osg::Group> root = new osg::Group();// 自定义粒子系统加入场景root->addChild(createParticleScene(strDataFolder));// 优化场景数据osgUtil::Optimizer optimize;optimize.optimize(root.get());viewer->setSceneData(root.get());viewer->realize();viewer->run();
}// 创建自定义粒子系统
osg::ref_ptr<osg::Group> createParticleScene(const string &strDataFolder)
{osg::ref_ptr<osg::Group> root = new osg::Group();// 创建粒子系统模板osgParticle::Particle ptemplate;	ptemplate.setLifeTime(2);// 设置声明周期ptemplate.setSizeRange(osgParticle::rangef(0.75, 3.0));// 设置粒子大小变化范围	ptemplate.setAlphaRange(osgParticle::rangef(0.0, 1.0));// 设置粒子Alpha变化范围ptemplate.setColorRange(osgParticle::rangev4(osg::Vec4(1.0, 0.5, 0.3, 1.0),osg::Vec4(0.0, 0.7, 1.0, 0.0)));// 设置粒子颜色变化范围	ptemplate.setRadius(0.05);// 设置半径	ptemplate.setMass(0.05);// 设置重量// 创建粒子系统osg::ref_ptr<osgParticle::ParticleSystem> ps = new osgParticle::ParticleSystem();string strClrPath = strDataFolder + "Images\\smoke.rgb";ps->setDefaultAttributes(strClrPath, false, false);// 设置材质,是否放射粒子,是否添加光照	ps->setDefaultParticleTemplate(ptemplate);// 加入模板// 创建发射器和计数器,调整每一帧增加的粒子的数目osg::ref_ptr<osgParticle::RandomRateCounter> counter = new osgParticle::RandomRateCounter();counter->setRateRange(100.0,100.0);// 设置每秒增加的粒子的个数// 设置一个点放置器osg::ref_ptr<osgParticle::PointPlacer> placer = new osgParticle::PointPlacer();placer->setCenter(osg::Vec3(0.0, 0.0, 0.0));// 设置位置// 创建弧度发射器osg::ref_ptr<osgParticle::RadialShooter> shooter = new osgParticle::RadialShooter();shooter->setInitialSpeedRange(100, 0);// 设置发射器速度变化范围// 创建粒子放射器(包括计数器、放射器和发射器)osg::ref_ptr<osgParticle::ModularEmitter> emitter = new osgParticle::ModularEmitter();emitter->setParticleSystem(ps.get());// 关联粒子系统emitter->setCounter(counter.get());// 关联计数器emitter->setPlacer(placer.get());// 关联点放置器emitter->setShooter(shooter.get());// 关联发射器root->addChild(emitter.get());// 加入场景// 创建重力模拟对象osg::ref_ptr<osgParticle::AccelOperator> ap = new osgParticle::AccelOperator();ap->setToGravity(-1.0);// 设置重力加速度,默认值为9.80665// 创建空气阻力模拟osg::ref_ptr<osgParticle::FluidFrictionOperator> ffo = new osgParticle::FluidFrictionOperator();	// FluidViscosity为1.8e-5,FluidDensity为1.2929ffo->setFluidToAir();// 设置空气属性// 创建标准编程器对象,控制粒子在生命周期中的更新osg::ref_ptr<osgParticle::ModularProgram> program = new osgParticle::ModularProgram();program->setParticleSystem(ps.get());// 关联粒子系统program->addOperator(ap.get());// 关联重力	program->addOperator(ffo.get());// 关联空气阻力root->addChild(program.get());// 添加到场景// 添加更新器,实现每帧粒子的管理osg::ref_ptr<osgParticle::ParticleSystemUpdater> psu = new osgParticle::ParticleSystemUpdater();	psu->addParticleSystem(ps.get());// 关联粒子系统osg::ref_ptr<osg::Geode> geode = new osg::Geode;geode->addDrawable(ps.get());	root->addChild(geode.get());// 加入到场景中root->addChild(psu.get());return root.get();
}

        运行程序,截图如图11-7所示。

图11-7自定义粒子系统示例(一)截图

http://www.lryc.cn/news/243002.html

相关文章:

  • 激活函数与其导数:神经网络中的关键元素
  • 微信公众号对接获取用户openid预约项目心路全历程
  • 大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节
  • ElasticSearch之Health API
  • 图的建立基本操作
  • 影响语音芯片识别率的因素概述
  • 操作系统的主要功能--处理机、存储器、设备、文件
  • PDF 批量处理软件BatchOutput PDF mac中文版介绍
  • oracle安装的肘腋之疾小合集
  • django(千锋教育)
  • Python 前后端分离项目Vue部署应用
  • Linux中安装MySQ-合集
  • elk 简单操作手册
  • CSS画一条线
  • 分享常用设计模式之单例模式(懒汉模式和饿汉模式)和几种关于设计模式的面试题
  • python每日一题——6三数之和
  • 黑马点评笔记 分布式锁
  • java---抽象类 用abstract修饰
  • JVM 之 javac、java、javap 命令详解
  • 市场被套牢,没有了解积累和分配,昂首资本一一介绍
  • notion 3.0.0 版本最新桌面端汉化教程,支持MAC和WIN版本
  • mysql union 和 union all区别?
  • uni-app小程序 swiper 分页器样式修改
  • 2023.11.23使用flask实现在指定路径生成文件夹操作
  • 【Unity入门】Input.GetAxis(““)控制物体移动、旋转
  • 【C++ 设计模式】面向对象设计原则 Template Method 模式 Strategy 策略模式
  • Flink-简介与基础
  • mobiusp 正在创作乐曲
  • Jensen不等式
  • 北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(2)设计一个24秒倒计时器