OSG粒子系统与阴影-自定义粒子系统示例<2>(5)
自定义粒子系统示例(二)
目前自定义粒子的方法有很多,在OSG 中使用的是 Billboard 技术与色彩融合技术。色彩融合是一种高级的渲染技术,如果读者有兴趣,可参看 OSG 粒子系统实现的源代码。这里采用简单的布告牌技术(osg::Billboard)与动画来实现。这种方法也可以生成比较好的粒子系统的效果。最好使用同名的贴图,示例中并没有对这些贴图进行处理,它只是向读者展示如何模拟一个自定义的粒子系统,读者可仔细体会。
自定义粒子系统示例(二)的代码如程序清单11-6所示。
/* 自定义粒子系统示例2 */
void particleSystem_11_6(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();// 向场景中添加帧动画osg::ref_ptr<osg::Sequence>sq = new osg::Sequence();sq = createSequence(strDataFolder);root->addChild(sq.get());// 优化场景数据osgUtil::Optimizer optimize;optimize.optimize(root.get());viewer->setSceneData(root.get());viewer->realize();viewer->run();
}osg::ref_ptr<osg::Node> createBillBoard(osg::ref_ptr<osg::Image> image)
{// 创建四边形osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry();// 设置顶点osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array();v->push_back(osg::Vec3(-0.5, 0.0, -0.5));v->push_back(osg::Vec3(0.5, 0.0, -0.5));v->push_back(osg::Vec3(0.5, 0.0, 0.5));v->push_back(osg::Vec3(-0.5, 0.0, 0.5));geometry->setVertexArray(v.get());// 设置法线osg::ref_ptr<osg::Vec3Array> normal = new osg::Vec3Array();normal->push_back(osg::Vec3(1.0, 0.0, 0.0) ^ osg::Vec3(0.0, 0.0, 1.0));geometry->setNormalArray(normal.get());geometry->setNormalBinding(osg::Geometry::BIND_OVERALL);// 设置纹理坐标osg::ref_ptr<osg::Vec2Array> vt = new osg::Vec2Array();vt->push_back(osg::Vec2(0.0, 0.0));vt->push_back(osg::Vec2(1.0, 0.0));vt->push_back(osg::Vec2(1.0, 1.0));vt->push_back(osg::Vec2(0.0, 1.0));geometry->setTexCoordArray(0, vt.get());// 绘制四边形geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));if (image.get()){// 属性对象osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();// 创建一个Texture2D属性对象osg::ref_ptr<osg::Texture2D> texture = new osg::Texture2D();// 关联imagetexture->setImage(image.get());// 关联Texture2D纹理对象,第三个参数默认为ONstateset->setTextureAttributeAndModes(0, texture.get(), osg::StateAttribute::ON);// 启用混合stateset->setMode(GL_BLEND, osg::StateAttribute::ON);// 关闭光照stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);geometry->setStateSet(stateset.get());}// 创建BillBoard对象1osg::ref_ptr<osg::Billboard> billboard1 = new osg::Billboard();// 设置旋转模式为绕视点billboard1->setMode(osg::Billboard::POINT_ROT_EYE);// 添加Drawable,并设置其位置,默认位置为osg::Vec3(0,0,0)billboard1->addDrawable(geometry.get(), osg::Vec3(5.0, 0.0, 0.0));//osg::ref_ptr<osg::Billboard> billboard2 = new osg::Billboard();osg::ref_ptr<osg::Group> billboard = new osg::Group();billboard->addChild(billboard1.get());return billboard.get();
}// 创建帧动画
osg::ref_ptr<osg::Sequence> createSequence(const string &strDataFolder)
{// 创建帧动画对象osg::ref_ptr<osg::Sequence> seq = new osg::Sequence();// 文件名向量对象typedef std::vector<string> Filenames;Filenames filenames;char name_count[256];for (int i = 0; i < 60; ++i){sprintf_s(name_count, "%sosgVR\\bz%d.jpg", strDataFolder.c_str(),i);filenames.push_back(name_count);}for (Filenames::iterator itr = filenames.begin(); itr != filenames.end(); ++itr){// 加载模型osg::Image *image = osgDB::readImageFile(*itr);if (image){// 添加子节点seq->addChild(createBillBoard(image));// 设定节点的持续时间seq->setTime(seq->getNumChildren() - 1, 0.1);}}// 设置帧动画持续的时间seq->setInterval(osg::Sequence::LOOP, 0, -1);// 设置播放的速度及重复的次数seq->setDuration(1.0, -1);// 开始播放seq->setMode(osg::Sequence::START);return seq.get();
}
运行程序,截图如图 11-8 所示

图11-8自定义粒子系统示例(二)截图
相关文章:
OSG粒子系统与阴影-自定义粒子系统示例<2>(5)
自定义粒子系统示例(二) 目前自定义粒子的方法有很多,在OSG 中使用的是 Billboard 技术与色彩融合技术。色彩融合是一种高级的渲染技术,如果读者有兴趣,可参看 OSG 粒子系统实现的源代码。这里采用简单的布告牌技术(osg::Billboard)与动画来实…...
微软 Edge 浏览器目前无法支持 avif 格式
avif 格式在微软 Edge 浏览器中还是没有办法支持。 如果你希望能够查看 avif 格式,那么只能通过浏览器打开,然后浏览器将会把这个文件格式下载到本地。 avif 格式已经在其他的浏览器上得到了广泛的支持,目前不支持的可能就只有 Edge 浏览器。…...
用python实现文字转语音的5个较好用的模块
文章目录 一. 用 gtts 模块二. 用pyttsx3模块基本使用直接朗读更改语音、速率和音量 三. baidu-aip四. pywin32五. speech 一. 用 gtts 模块 参考文档:https://gtts.readthedocs.io/en/latest/ 使用前需要先安装:pip3 install gtts ,样例如…...
Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法
一、漏洞说明 Windows server 2012R2远程桌面服务SSL加密默认是开启的,且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷,当开启远程桌面服务,使用漏洞扫描工具扫描,发现存在SSL/TSL漏洞。远程主机支持的SSL加密算法提供了中等强度的加密算法,目前,使用密钥长度大于等于5…...
python统计字符串中大小写字符个数的性能实测与分析
给定一个字符串,统计字符串中大写字符个数,有如下三种方法: # method1 s1 len(re.findall(r[A-Z],content)) # method2 s2 sum(1 for c in content if c.isupper()) # method3 s3 0 for c in content:if c.isupper()True:s31经过多次实测…...
时间序列预测实战(十九)魔改Informer模型进行滚动长期预测(科研版本)
论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 个人魔改版本地址-> 文章末尾 一、本文介绍 在之前的文章中我们已经讲过Informer模型了,但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未…...
[PyTorch][chapter 64][强化学习-DQN]
前言: DQN 就是结合了深度学习和强化学习的一种算法,最初是 DeepMind 在 NIPS 2013年提出,它的核心利润包括马尔科夫决策链以及贝尔曼公式。 Q-learning的核心在于Q表格,通过建立Q表格来为行动提供指引,但这适用于状态…...
用好语言模型:temperature、top-p等核心参数解析
编者按:我们如何才能更好地控制大模型的输出? 本文将介绍几个关键参数,帮助读者更好地理解和运用 temperature、top-p、top-k、frequency penalty 和 presence penalty 等常见参数,以优化语言模型的生成效果。 文章详细解释了这些参数的作用…...
python之pycryptodome模块,加密算法库
一、简介 PyCryptodome是PyCrypto库的一个分支,它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现,包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能,如密码学安全随机…...
IDEA如何将本地项目推送到GitHub上?
大家好,我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境(IDE),它支持多种编程语言和工具。它也内置了对Git和GitHub的支持,让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册,描述了…...
Leetcode—45.跳跃游戏II【中等】
2023每日刷题(四十) Leetcode—45.跳跃游戏II 贪心法思想 实现代码 #define MAX(a, b) (a > b ? (a) : (b))int jump(int* nums, int numsSize) {int start 0;int end 1;int ans 0;int maxStride 0;while(end < numsSize) {maxStride 0;fo…...
基于Vue+SpringBoot的木马文件检测系统
项目编号: S 041 ,文末获取源码。 \color{red}{项目编号:S041,文末获取源码。} 项目编号:S041,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 木马分类模块2.3 木…...
springboot内置Tomcat流程
1、org.springframework.boot.SpringApplication#initialize setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));加载了org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext 2、spring refres…...
Android修行手册-溢出父布局的按钮实现点击
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...
Transformer——decoder
上一篇文章,我们介绍了encoder,这篇文章我们将要介绍decoder Transformer-encoder decoder结构: 如果看过上一篇文章的同学,肯定对decoder的结构不陌生,从上面框中可以明显的看出: 每个Decoder Block有两个…...
基于 STM32 的温度测量与控制系统设计
本文介绍了如何基于 STM32 微控制器设计一款温度测量与控制系统。首先,我们将简要介绍 STM32 微控制器的特点和能力。接下来,我们将详细讨论温度传感器的选择与接口。然后,我们将介绍如何使用 STM32 提供的开发工具和相关库来进行温度测量和控…...
python之pyqt专栏3-QT Designer
从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析,我们对QT Designer有基础的认识。 QT Designer用来创建UI界面,保存的文件是"xxx.ui"文件,"xxx.ui"可以被pyuic转换为"xxx.py",而&…...
【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)
文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程,对云开发的入门做了介绍,以及使用一个省市地区联动的地址选择器…...
HCIA题目解析(1)
1、【多选题】关于动态 MAC 地址表说法正确的是? A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数,可以获取接口下通信的用户数 C、在设备重启后,之前的动态表项会丢失 D、在设备重启后&…...
运维高级-day02
一、编写系统服务启动脚本 RHEL6风格 1、Linux运行级别 Linux运行有七个级别 级别 描述 0 停机状态,系统默认运行级别不能设置为0,否则系统不能正常启动。使用init0命令,可关闭系统 1 单用户状态,此状态仅root用户可登录。用…...
智能客服进入“感知智能”分水岭(SITS2026已验证):3个月内未升级多模态能力的团队,将面临首波客户流失预警
第一章:SITS2026案例:智能客服多模态应用 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Smart Interactive Technical Support 2026)是面向金融与电信行业落地的智能客服标杆项目,其核心突破在于构建端到端…...
SimpleFOC源码学习08(v2.3.2) - 霍尔编码器HallSensor.cpp与HallSensor.h,背后的状态机—6个扇区是怎么驱动 FOC 的?
导言github 源码: https://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/HallSensor.hhttps://github.com/simplefoc/Arduino-FOC/blob/v2.3.2/src/sensors/HallSensor.cpp 在第 8 篇分析了增量式编码器 Encoder 之后,这篇来看另一类在 BL…...
专科大二学生的变成学习规划和愿景
自我介绍专科大二学生,主修计算机网络专业,目前处于技术积累与升学准备阶段。对编程充满热情,希望通过系统学习和实践提升技术能力,为未来职业发展或专升本考试打下坚实基础。编程目标以专升本(升学)为核心…...
HCPL-257K,双通道密封高速晶体管输出光耦合器
简介今天我要向大家介绍的是 Broadcom 的光耦合器——HCPL-257K。它是一款双通道、采用气密性密封设计的晶体管输出光耦合器,专为模拟和数字应用设计。通过为光电二极管偏置和输出晶体管集电极提供独立连接,有效减小了基极-集电极电容,使其速…...
5分钟精通Waifu2x-Extension-GUI:便携版与安装版部署全攻略
5分钟精通Waifu2x-Extension-GUI:便携版与安装版部署全攻略 【免费下载链接】Waifu2x-Extension-GUI Video, Image and GIF upscale/enlarge(Super-Resolution) and Video frame interpolation. Achieved with Waifu2x, Real-ESRGAN, Real-CUGAN, RTX Video Super R…...
三菱Q系列PLC与触摸屏报警功能实战指南:从调试到应用
1. 三菱Q系列PLC报警功能基础配置 第一次接触三菱Q系列PLC的报警功能时,我被它强大的可定制性震撼到了。不同于普通继电器的简单通断报警,Q系列PLC可以通过软元件实现多级报警管理。在实际项目中,我习惯先用SM400辅助继电器作为系统启动标志&…...
如何加固SQL通信安全_启用SSL加密确保数据传输安全
启用 require_secure_transportON 后连接被拒,需确保客户端显式启用 SSL(如 --ssl-modeREQUIRED)、服务端 SSL 已正确配置(have_sslYES),并避免 localhost 走 socket;PostgreSQL 需用 hostssl 规…...
从零到一:在uni-app中构建低功耗蓝牙设备通信全流程(微信小程序通用)
1. 低功耗蓝牙开发基础认知 第一次接触低功耗蓝牙开发时,我盯着文档里那些UUID、特征值之类的术语发懵,这感觉就像突然要和一个说外星语的外星人交流。后来才发现,理解蓝牙通信的关键在于建立正确的认知模型。 低功耗蓝牙(BLE&…...
算力普惠时代:当“算力银行”遇上“中小企业”,一场静默的生产力革命
算力正在成为AI时代的水电煤,但如何让中小企业用得起、用得好?工信部近期发布的普惠算力行动,提出了“算力银行”“算力超市”等创新模式。本文尝试从多位实践者的思维框架出发,拆解这场变革背后的逻辑与路径。一、算力爆发&#…...
生成式AI应用安全上线前最后一步:SITS2026强制合规检查清单(含GDPR/等保2.0/内容审核三重校验模板)
第一章:生成式AI应用安全上线前最后一步:SITS2026强制合规检查清单(含GDPR/等保2.0/内容审核三重校验模板) 2026奇点智能技术大会(https://ml-summit.org) SITS2026(Secure Integration & Trustworthiness Standa…...
