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

news2024/12/23 16:31:31

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

        自定义粒子系统示例(一)的代码如程序清单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.2929
	ffo->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.coloradmin.cn/o/1251760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【每日一题】1457. 二叉树中的伪回文路径-2023.11.25

题目&#xff1a; 1457. 二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路…

illuminate/database 使用 四

文档&#xff1a;Hyperf Database: Getting Started - Laravel 10.x - The PHP Framework For Web Artisans 因为hyperf使用illuminate/database&#xff0c;所以按照文章&#xff0c;看illuminate/database代码实现。 一、读写分离 根据文档读写的host可以分开。设置读写分…

【ChatGLM2-6B】Docker下部署及微调

【ChatGLM2-6B】小白入门及Docker下部署 一、简介1、ChatGLM2是什么2、组成部分3、相关地址 二、基于Docker安装部署1、前提2、CentOS7安装NVIDIA显卡驱动1&#xff09;查看服务器版本及显卡信息2&#xff09;相关依赖安装3&#xff09;显卡驱动安装 2、 CentOS7安装NVIDIA-Doc…

Python live-server安装使用

live-server是一个具有实时加载功能的小型服务器&#xff0c;可以使用它来破解html/css/javascript&#xff0c;但是不能用于部署最终站点。也就是说我们可以在项目中实时用live-server作为一个实时服务器实时查看开发的网页或项目效果。&#xff08;1) 安装live-server npm in…

MySQL 批量插入记录报 Error 1390 (HY000)

文章目录 1.背景2.问题3.分批插入4.一次最多能插入多少条记录&#xff1f;参考文献 1.背景 Golang 后台服务使用 GORM 实现与 MySQL 的交互&#xff0c;在实现一个通过 Excel 导入数据的接口时&#xff0c;使用 Save 方法一次性插入大量记录&#xff08;>1w&#xff09;时报…

【机器学习】聚类(二):原型聚类:LVQ聚类(学习向量量化)

文章目录 一、实验介绍1. 算法流程2. 算法解释3. 算法特点4. 应用场景5. 注意事项 二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. LVQ类a. 构造函数b. 闵可夫斯基距离c. LVQ聚类过程e. 聚类结果可视化 2. 辅助函数3. 主函数a. 命令行界面 &#xff…

Diffusion Model: DDIM

本文相关内容只记录看论文过程中一些难点问题&#xff0c;内容间逻辑性不强&#xff0c;甚至有点混乱&#xff0c;因此只作为本人“备忘”&#xff0c;不建议其他人阅读。 DENOISING DIFFUSION IMPLICIT MODELS: https://arxiv.org/abs/2010.02502 前序知识 DDPM&#xff1a;…

装饰者设计模式

package com.jmj.pattern.decorator;/*** 快餐类(抽象构建角色)*/ public abstract class FastFood {private float price;private String desc;public float getPrice() {return price;}public void setPrice(float price) {this.price price;}public String getDesc() {retu…

机器学习之自监督学习(五)MAE翻译与总结(二)

参考&#xff1a;Self-Supervised Learning 超详细解读 (六)&#xff1a;MAE&#xff1a;通向 CV 大模型 - 知乎 (zhihu.com) 仅供个人学习使用&#xff0c;侵权私信删。 自监督学习&#xff1a;MAE.. 1 1.1 self-supervised learning.. 1 1.2 Masked Autoencoders&#xff…

【C】内存函数

目录 1. memcpy 使用和模拟实现 2. memmove 使⽤和模拟实现 3. memset 函数的使用 4. memcmp 函数的使用 1. memcpy 使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到d…

某图app sig、client_session

文章目录 声明目标加密参数定位代码实现声明 本文章中所有内容仅供学习交流,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请私信我立即删除! 目标 这次看一下某图秀秀app 搜索接口: 抓一下包 url参数提取 url = "https://api.x…

springboot项目同时启动web服务和grpc服务

springboot项目同时启动web服务和grpc服务 一. 创建项目二. 引入依赖三. 测试3.1 http服务3.2 grpc服务 四. 整体代码结构 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 创建…

推荐几个比较给力的网站,看看有没有你喜欢的

1、电子书大全 Loading...免翻墙 消除背景 在线抠图软件_图片去除背景 | remove.bg – remove.bg 临时邮箱 http://linshiyouxiang.net/ 在线短信验证码接收码平台 https://www.yinsiduanxin.com/ 图片放大无损失 waifu2x小翻墙 AI 人工智能图片放大 Bigjpg - AI Su…

【Spring源码】Spring Event事件

目录 1、前言 2、什么是Spring Event&#xff1f; 3、基本使用 3.1、定义事件 3.2、发布事件 3.3、监听事件 3.3.1、继承ApplicationListener 3.3.2、使用EventListener注解 4、Spring Event是同步还是异步&#xff1f; 4.1、源码实现 4.2、如何实现异步 4.2.1、使用…

什么是 Jest ? Vue2 如何使用 Jest 进行单元测试?Vue2 使用 Jest 开发单元测试实例

什么是Jest? Jest 是一个流行的 JavaScript 测试框架,由 Facebook 开发并维护,专注于简单性和速度。它通常用于编写 JavaScript 和 TypeScript 应用程序的单元测试、集成测试和端到端测试。 特点: 简单易用: Jest 提供简洁的 API 和易于理解的语法,使得编写测试用例变得…

【Android Gradle】之Gradle入门及 wrapper 生成(一)

&#x1f604;作者简介&#xff1a; 小曾同学.com,一个致力于测试开发的博主⛽️&#xff0c;主要职责&#xff1a;测试开发、CI/CD 如果文章知识点有错误的地方&#xff0c;还请大家指正&#xff0c;让我们一起学习&#xff0c;一起进步。 &#x1f60a; 座右铭&#xff1a;不…

大中小协作 共筑科学梦——华中科技大学附属花城中学举办首届科技节

为普及科学知识&#xff0c;张扬科学精神&#xff0c;创设浓郁的科学氛围&#xff0c;11月24日&#xff0c;华中科技大学附属花城中学举办了以“走近科学&#xff0c;触碰未来”为主题的首届科技节暨科创文化展示周活动。学生们在学习中感受科技的魅力&#xff0c;在“玩”中感…

Vue新手必学:Vue的使用和Vue脚手架详解

文章目录 引言第一部分&#xff1a;Vue的基本使用1.1 安装Vue1.2 创建Vue项目1.3 编写第一个Vue组件1.4 在主页面中使用组件1.5 运行Vue项目 第二部分&#xff1a;Vue脚手架的使用2.1 Vue脚手架是什么2.2 创建Vue项目2.3 项目结构2.4 运行项目2.5 插件和配置 第三部分&#xff…

2023年汉字小达人市级比赛在线模拟题的使用顺序、建议和常见问题

今天是2023年11月25日&#xff0c;星期六&#xff0c;上午举办了2023年第八届上海小学生古诗文大会的复选活动&#xff08;复赛&#xff09;&#xff0c;结束了复选活动&#xff0c;很多学霸孩子们马上就开始投入到第十届汉字小达人的市级活动&#xff08;市级比赛&#xff09;…

使用 PyODPS 采集神策事件数据

文章目录 一、前言二、数据采集、处理和入库2.1 获取神策 token2.2 请求神策数据2.3 数据处理-面向数组2.4 测试阿里云 DataFrame 入库2.5 调度设计与配置2.6 项目代码整合 三、小结四、花絮-避坑指南第一坑&#xff1a;阿里云仅深圳节点支持神策数据第二坑&#xff1a;神策 To…