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

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)

自定义粒子系统示例(二) 目前自定义粒子的方法有很多&#xff0c;在OSG 中使用的是 Billboard 技术与色彩融合技术。色彩融合是一种高级的渲染技术&#xff0c;如果读者有兴趣&#xff0c;可参看 OSG 粒子系统实现的源代码。这里采用简单的布告牌技术(osg::Billboard)与动画来实…...

微软 Edge 浏览器目前无法支持 avif 格式

avif 格式在微软 Edge 浏览器中还是没有办法支持。 如果你希望能够查看 avif 格式&#xff0c;那么只能通过浏览器打开&#xff0c;然后浏览器将会把这个文件格式下载到本地。 avif 格式已经在其他的浏览器上得到了广泛的支持&#xff0c;目前不支持的可能就只有 Edge 浏览器。…...

用python实现文字转语音的5个较好用的模块

文章目录 一. 用 gtts 模块二. 用pyttsx3模块基本使用直接朗读更改语音、速率和音量 三. baidu-aip四. pywin32五. speech 一. 用 gtts 模块 参考文档&#xff1a;https://gtts.readthedocs.io/en/latest/ 使用前需要先安装&#xff1a;pip3 install gtts &#xff0c;样例如…...

Windows Server 2012R2 修复CVE-2016-2183(SSL/TLS)漏洞的办法

一、漏洞说明 Windows server 2012R2远程桌面服务SSL加密默认是开启的,且有默认的CA证书。由于SSL/ TLS自身存在漏洞缺陷,当开启远程桌面服务,使用漏洞扫描工具扫描,发现存在SSL/TSL漏洞。远程主机支持的SSL加密算法提供了中等强度的加密算法,目前,使用密钥长度大于等于5…...

python统计字符串中大小写字符个数的性能实测与分析

给定一个字符串&#xff0c;统计字符串中大写字符个数&#xff0c;有如下三种方法&#xff1a; # 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模型了&#xff0c;但是呢官方的预测功能开发的很简陋只能设定固定长度去预测未…...

[PyTorch][chapter 64][强化学习-DQN]

前言&#xff1a; DQN 就是结合了深度学习和强化学习的一种算法&#xff0c;最初是 DeepMind 在 NIPS 2013年提出&#xff0c;它的核心利润包括马尔科夫决策链以及贝尔曼公式。 Q-learning的核心在于Q表格&#xff0c;通过建立Q表格来为行动提供指引&#xff0c;但这适用于状态…...

用好语言模型:temperature、top-p等核心参数解析

编者按&#xff1a;我们如何才能更好地控制大模型的输出? 本文将介绍几个关键参数&#xff0c;帮助读者更好地理解和运用 temperature、top-p、top-k、frequency penalty 和 presence penalty 等常见参数&#xff0c;以优化语言模型的生成效果。 文章详细解释了这些参数的作用…...

python之pycryptodome模块,加密算法库

一、简介 PyCryptodome是PyCrypto库的一个分支&#xff0c;它是Python中最受欢迎的密码学库之一。PyCryptodome提供了许多密码学算法和协议的实现&#xff0c;包括对称加密、非对称加密、消息摘要、密码哈希、数字签名等。它还提供了一些其他功能&#xff0c;如密码学安全随机…...

IDEA如何将本地项目推送到GitHub上?

大家好&#xff0c;我是G探险者。 IntelliJ IDEA 是一个强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它支持多种编程语言和工具。它也内置了对Git和GitHub的支持&#xff0c;让开发者可以轻松地将本地项目推送到GitHub上。以下是一个操作手册&#xff0c;描述了…...

Leetcode—45.跳跃游戏II【中等】

2023每日刷题&#xff08;四十&#xff09; 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的木马文件检测系统

项目编号&#xff1a; S 041 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S041&#xff0c;文末获取源码。} 项目编号&#xff1a;S041&#xff0c;文末获取源码。 目录 一、摘要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 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…...

Transformer——decoder

上一篇文章&#xff0c;我们介绍了encoder&#xff0c;这篇文章我们将要介绍decoder Transformer-encoder decoder结构&#xff1a; 如果看过上一篇文章的同学&#xff0c;肯定对decoder的结构不陌生&#xff0c;从上面框中可以明显的看出&#xff1a; 每个Decoder Block有两个…...

基于 STM32 的温度测量与控制系统设计

本文介绍了如何基于 STM32 微控制器设计一款温度测量与控制系统。首先&#xff0c;我们将简要介绍 STM32 微控制器的特点和能力。接下来&#xff0c;我们将详细讨论温度传感器的选择与接口。然后&#xff0c;我们将介绍如何使用 STM32 提供的开发工具和相关库来进行温度测量和控…...

python之pyqt专栏3-QT Designer

从前面两篇文章python之pyqt专栏1-环境搭建与python之pyqt专栏2-项目文件解析&#xff0c;我们对QT Designer有基础的认识。 QT Designer用来创建UI界面&#xff0c;保存的文件是"xxx.ui"文件&#xff0c;"xxx.ui"可以被pyuic转换为"xxx.py",而&…...

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(下)

文章目录 概述端云调用流程端侧集成AGC SDK端侧省市地区联动的地址选择器组件开发创建省市数据模型创建省市地区视图UI子组件创建页面UI视图Page文件 打包测试总结 概述 我们在前面的课程&#xff0c;对云开发的入门做了介绍&#xff0c;以及使用一个省市地区联动的地址选择器…...

HCIA题目解析(1)

1、【多选题】关于动态 MAC 地址表说法正确的是&#xff1f; A、通过报文中的源MAC地址学习获得的动态MAC表项会老化 B、通过查看指定动态MAC地址表项的个数&#xff0c;可以获取接口下通信的用户数 C、在设备重启后&#xff0c;之前的动态表项会丢失 D、在设备重启后&…...

运维高级-day02

一、编写系统服务启动脚本 RHEL6风格 1、Linux运行级别 Linux运行有七个级别 级别 描述 0 停机状态&#xff0c;系统默认运行级别不能设置为0&#xff0c;否则系统不能正常启动。使用init0命令&#xff0c;可关闭系统 1 单用户状态&#xff0c;此状态仅root用户可登录。用…...

在 ADT 里把当前焦点对象直接做成可点击清单,基于 HTML 结果的 Focused Objects Display IDE Action 实战

你在 Eclipse 版 ADT 里写代码时,真正高频的动作往往不是再新建一个对象,而是快速看清楚当前到底选中了什么。编辑器里盯着一个类,Project Explorer 里又顺手多选了几个对象,或者传输组织器里正在核对一个请求里的条目,这时候如果能有一个小动作,把当前焦点里的对象直接读…...

酷安UWP:在Windows电脑上体验完整酷安社区的终极指南

酷安UWP&#xff1a;在Windows电脑上体验完整酷安社区的终极指南 【免费下载链接】Coolapk-UWP 一个基于 UWP 平台的第三方酷安客户端 项目地址: https://gitcode.com/gh_mirrors/co/Coolapk-UWP 还在为手机小屏幕刷酷安而感到眼睛酸痛吗&#xff1f;想在大屏幕上舒适地…...

多模态大模型混沌测试四大禁区(含图像噪声注入、音频时序扰动、文本语义漂移、跨模态对齐断连)

第一章&#xff1a;多模态大模型混沌工程实践 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在真实生产环境中面临图像、文本、语音、视频等异构输入的动态组合与不确定性扰动&#xff0c;传统可靠性验证手段难以覆盖其跨模态语义坍塌、注意力漂移与隐式模态冲突…...

AI元人文之哲学阐释(2025—2026)

AI元人文之哲学阐释&#xff08;2025—2026&#xff09;摘要AI元人文是独立研究者岐金兰&#xff08;李湖北&#xff09;于2025至2026年间以人机协作方式建构的一套体系化哲学&#xff0c;旨在回应人工智能引发的根本性存在论、认识论与伦理学挑战。本文系统阐释该理论的演进脉…...

ENSP模拟器外网访问全攻略:从环境搭建到成功ping通8.8.8.8

ENSP模拟器外网访问实战指南&#xff1a;从零搭建到稳定连通 网络工程师和IT技术人员经常需要在隔离环境中测试网络设备的连通性&#xff0c;华为ENSP模拟器提供了完美的解决方案。但让模拟器中的设备访问真实外网却是一个充满技术细节的过程。本文将带你一步步突破虚拟与现实的…...

云服务器:构建未来企业数字化的基石

云服务器:构建未来企业数字化的基石 引言 随着信息技术的飞速发展,云计算已经成为推动企业数字化转型的重要力量。云服务器作为云计算的核心组成部分,正逐渐成为企业构建高效、灵活、安全的信息化基础设施的关键。本文将深入探讨云服务器的定义、优势、应用场景以及未来发…...

HCPL-2533-000E,双通道高速逻辑接口光耦合器

简介今天我要向大家介绍的是 Broadcom 的光耦合器——HCPL-2533-000E。它是一款双通道、专为 LSTTL-to-LSTTL 和 TTL-to-LSTTL 逻辑接口设计的高速光耦器件。该器件内部包含一对发光二极管和集成光子探测器&#xff0c;输入与输出之间具备 3000Vdc 的耐压测试标准。通过为光电二…...

【会议征稿通知 | 华东交通大学主办 | IEEE出版 | EI 、Scopus稳定检索】第二届智慧综合能源系统工程国际学术会议(IIESE 2026)

第二届智慧综合能源系统工程国际学术会议&#xff08;IIESE 2026&#xff09; 2026 2nd International Conference on Intelligent Integrated Energy Systems Engineering 2026年5月15-17日 | 中国南昌 会议官网&#xff1a;www.iiese.net 截稿时间&#xff1a;见官网&…...

生成式AI数据飞轮构建全链路拆解(从标注→反馈→迭代→跃迁的工业级路径)

第一章&#xff1a;生成式AI数据飞轮构建全链路拆解&#xff08;从标注→反馈→迭代→跃迁的工业级路径&#xff09; 2026奇点智能技术大会(https://ml-summit.org) 生成式AI的数据飞轮并非线性流水线&#xff0c;而是以闭环反馈驱动持续能力跃迁的动态系统。其核心在于将用户…...

【多模态大模型容灾备份黄金标准】:20年AI基础设施专家亲授3层异构备份架构与RTO<2分钟实战方案

第一章&#xff1a;多模态大模型容灾备份策略 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型&#xff08;如融合视觉、语音、文本与结构化数据的统一架构&#xff09;在训练与推理过程中对存储一致性、状态可恢复性及跨模态特征对齐提出了远超单模态模型的容灾要…...