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

Direct3D粒子系统

粒子和点精灵

粒子(是种微小的物体,在数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由
D3 DPRIMITIVETYPE类型的D3 DPT POINTLIST枚举常量表示)是一个很好的选择。但是光栅化时,点图元将被映射为一个单个像素。这样就无法为我们提供很大的灵活性,因为实际应用中我们可能需要各种尺寸的粒子甚至希望能够对这些粒子进行纹理映射。在Direct3D8.0之前,要想摆脱点图元的这个限制,只能是不去使用它。那时,程序员都愿意用广告牌(billboard)技术来显示一个粒子。广告牌就是一个四边形,通过对其自身世界变换矩阵的控制,使其总是面向摄像机。
Direct3D8.0引入了.-种特别的点图元一点精灵(Point Sprite),该图元极适合应用于粒子系统中。与
普通的点图元不同,点精灵可进行纹理映射且其尺寸可变。点精灵也不同于广告牌,描述点精灵时仅需要一个单点即可。由于我们只需要存储和处理一个顶点而非4个(广告牌要用4个顶点描述),这样就节省了内存和宝贵的运算时间。

粒子结构格式

struct Particle
{D3DXVECTOR3	m_position;        //粒子位置D3DCOLOR		m_color;           //粒子颜色//float			m_size;            //粒子尺寸static const DWORD FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE /*| D3DFVF_PSIZE*/;
};

_size来表示其尺寸。为了反映该变化,我们必须为灵活顶点格式FVF增加D3DFVF_PSIZE标记。让每个粒子对象维护其自身的尺寸十分有用,因为这就允许我们单独指定或改变某个粒子的尺寸。但由于大多数图形卡都不支持按照这种方式控制粒子的尺寸,所以我们将不采用这种做法。(可检查结构D3DCAPS9种的成员FVFCaps中的D3DFVFCAPS_PSIZE位来验证),我们将通过绘制状态来控制粒子的尺寸,即使硬件不支持D3DFVFCAPS_PSIZE,借助像素着色器(vertex shader)我们也有可能控制每个粒子的尺寸。

需要注意的是粒子结构参数如果定义了,就需要赋值为正确的值,不然可能会绘制不出来粒子,例如加了粒子尺寸字段,但是没有给该字段赋值。

点精灵绘制状态

点精灵的行为大部分由渲染状态来控制

D3DRS_POINTSPRITEENABLE
默认为false,若指定为tue,则规定整个当前纹理被映射到点精灵上。若指定为false,则规定点精灵的纹理坐标所指定的纹理元应被映射到点精灵上。

D3DRS_POINTSCALEENABLE
默认值为false,若指定为true,则规定点的尺寸将用观察坐标系的单位来度量。观察坐标系的单位是仅用来描述摄像机坐标系中的3D点。点精灵的尺寸将依据近大远小的原则进行相应的比例变换。若指定为false,则规定点的尺寸将用屏幕坐标系的单位(即像素)来度量。如果您将该绘制状态指定为false,而且您想将点精灵的尺寸设为3,则点精灵将变为屏幕上一个3×3的像素区域。

D3DRS_POINTSIZE
用于指定点精灵的尺寸。该值可被解释为观察坐标系中的点精灵尺寸,也可被解释为屏幕坐标系中的点精灵尺寸,这主要取决于绘制状态D3DRS_POINTSCALEENABLE的设置。下面的代码将点的尺寸设为2.5个单位。

Device->SetRenderState(D3DRS_POINTSIZE, d3d::FtoDw(2.5f));

D3DRS_POINTSIZE_MIND3DRS_POINTSIZE_MAX
指定点精灵可取的最小/最大尺寸

D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B、D3DRS_POINTSCALE_C
这3个常量控制了点精灵的尺寸如何随距离发生变化,这里的距离是指点精灵到摄像机的距离
给定距离和这些常量时,Direct3D使用如下公式计算点精灵的最终尺寸:FinalSize=ViewportHeight\cdot Size\cdot \sqrt{\frac{1}{A+B(D)+C(D^{2})}}

  • FinalSize:点精灵的最终尺寸
  • ViewportHeight:视口(viewport)高度
  • Size:对应于由绘制状态D3DRS_POINT_SIZE所指定的值
  • A,B,C:分别对应于绘制状态D3DRS_POINTSCALE_A、D3DRS_POINTSCALE_B、
    D3DRS_POINTSCALE_C所指定的值
  • D:在观察坐标系中点精灵到摄像机的距离。由于在观察坐标系中,摄像机位于坐标原点,所以D=\sqrt{x^{2}+y^{2}+z^{2}},(x,y,z)为点精灵在观察者坐标系中的位置
Device->SetRenderState(D3DRS_POINTSCALE_A, d3d::FtoDw(0.0f));
Device->SetRenderState(D3DRS_POINTSCALE_B, d3d::FtoDw(0.0f));
Device->SetRenderState(D3DRS_POINTSCALE_C, d3d::FtoDw(1.0f));

粒子及其属性

一个粒除了位置和颜色外往往还具有许多其他的属性。例如粒子可县有一定的速度。但是绘制粒子时并不需要这些附加属性。所以我们将用于绘制粒子的数据与粒子的属性分别存储在两个不同的结
构中。当我们要创建、销毁或更新粒子时,需要涉及粒子的属性,当我们准备绘制粒子时,可将粒子的位置和颜色信息复制到Particle结构中
粒子的属性与所要模拟的粒子系统的特定类型相关。通过指定些常用属性可以使这些属性结构变得通用些。下面是一个包舍了些通用的粒子属性的结构。大多数系统并不需要如此众多的属性,但是有些系统可能还需要附加些其他属性。

struct Attribute
{D3DXVECTOR3 _position;        //粒子在世界坐标系中的位置D3DXVECTOR3 _velocity;        //粒子的速度,单位/秒D3DXVECTOR3 _acceleration;    //粒子的加速度       float _lifeTime;              //粒子自诞生到消亡所需的时间float _age;                   //粒子当前的年龄D3DXCOLOR _color;             //粒子的颜色D3DXCOLOR _colorFade;         //粒子颜色如何随时间渐弱bool _isAlive;                //粒子是否处于活动状态
}

粒子系统的组成

粒子系统是众多粒子的集合,并负责对这些粒了进行维护和显示。粒子系统跟踪系统中影响所有粒子状态的全局属性,例如粒子的尺小、粒子的粒子源、将要映射到粒子的纹理等。按照功能来说,粒子系统主要负责史新(updating)、显示(displaying)、杀死(kil)以及创建(creating)粒子。

class ParticleSystem
{
protected:IDirect3DDevice9*			m_device;			D3DXVECTOR3					m_origin;			//系统粒子源,所有的粒子都将从系统粒子源产生d3d::BoundingBox			m_boundingbox;		//限制粒子的活动范围,超出该外接体的粒子会杀死float						m_emit_rate;		//粒子的增加率,用粒子数/秒来度量float						m_size;				//系统中所有粒子的尺寸IDirect3DTexture9*			m_tex;			IDirect3DVertexBuffer9* 	m_vb;list<ParticleAttribute>		m_particles;		//系统中粒子的属性列表int							m_maxParticles;		//某个给定时间内,系统所允许拥有的最大粒子数DWORD						m_vbSize;			//在一个给定时间顶点缓存中所存储的顶点个数,该值不依赖于粒子系统中实际粒子个数DWORD						m_vbOffset;DWORD						m_vbBatchSize;public:ParticleSystem();virtual ~ParticleSystem();virtual bool init(IDirect3DDevice9*	device, const char* texture_filename);virtual void reset();//重新设定粒子属性virtual 

相关文章:

Direct3D粒子系统

粒子和点精灵 粒子(是种微小的物体,在数学上通常用点来表示其模型。所以显示粒子时,使用点图元(由 D3 DPRIMITIVETYPE类型的D3 DPT POINTLIST枚举常量表示)是一个很好的选择。但是光栅化时,点图元将被映射为一个单个像素。这样就无法为我们提供很大的灵活性,因为实际应用…...

第24章_mysql性能分析工具的使用

文章目录 1. 数据库服务器的优化步骤2.查看系统性能参数3. 统计SQL的查询成本&#xff1a;last_query_cost4. 定位执行慢的 SQL&#xff1a;慢查询日志4.1 开启慢查询日志参数4.2 查看慢查询数目4.3 测试慢sql语句&#xff0c;查看慢日志4.4 系统变量 log_output&#xff0c; l…...

【Git】Merge/Rebase/Cherriy-Pick的区别

Git Merge/Rebase/Cherriy-Pick的区别 Git merge、Git Rebase、Git Cherry-pick是Git 常用的三个命令,可以用于分支合并、纳入提交等。 那么它们三个的区别以及共同点是什么? 了解这些可以帮我们更好理解Git的工作原理,进而学习它的一些设计思想。 git merge xxx-branch g…...

Python复习:序列(列表元组字符串)

Python复习 Python复习序列&#xff08;列表元组字符串&#xff09;列表定义列表增删改查列表的切片列表的一些常用操作符元组字符串 Python复习 序列&#xff08;列表元组字符串&#xff09; 列表元组字符串有一些同样的特点&#xff0c;所以放在一起复习。例如切片操作 列…...

DevChat助力成为软件开发的“钢铁侠”

一、背景介绍&#xff1a; 随着人工智能ChatGPT的发展&#xff0c;ChatGPT 的开放将推动人工智能在各个行业的应用&#xff0c;带来诸多的变革和提高&#xff0c;曾经一段时间也是担心对软件行业的影响&#xff0c;会不会以后就不需要这么多程序员了&#xff0c;实际上在当下&…...

c: struct sort descending and ascending in windows and Ubuntu

/*** file StudentStructSort.h* author geovindu,Geovin Du,涂聚文 (geovindu163.com)* ide: vscode c11,c17 Ubuntu 22.4* brief 结构体排序示例* date 2023-11-05* version 0.1* copyright geovindu 站在巨人的肩膀上 Standing on the Shoulders of Giants**/#ifnd…...

Python - 利用 OCR 技术提取视频台词、字幕

目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 一.引言 视频经常会配套对应的台词或者字幕&#xff0c…...

VUE页面导出PDF方案

1&#xff0c;技术方案为&#xff1a;html2canvas把页面生成canvas图片&#xff0c;再通过jspdf生成PDF文件&#xff1b; 2&#xff0c;安装依赖&#xff1a; npm i html2canvas -S npm i jspdf -S 3&#xff0c;封装导出pdf方法exportPdf.js: // 页面导出为pdf格式 //titl…...

机器学习笔记 - WGAN生成对抗网络概述和示例

一、简述 Wasserstein GAN或WGAN是一种生成对抗网络,它最小化地球移动器距离 (EM) 的近似值,而不是原始 GAN 公式中的 Jensen-Shannon 散度。与原始 GAN 相比,它的训练更加稳定,模式崩溃的证据更少,并且具有可用于调试和搜索超参数的有意义的曲线。 Wasserstein 生成对抗网…...

HoudiniVex笔记_P0_Houdini中文文档与翻译

1、19.0版本中文说明文档 链接&#xff1a;https://pan.baidu.com/s/1oJcX5pdnBZ_YWWwOSnFB5g?pwdz3tw 提取码&#xff1a;z3tw 2、翻译插件 有上网条件的同学可以试试这个翻译插件&#xff1a;双语网页翻译 - 电子书翻译 - PDF翻译 - 字幕文件翻译浏览器扩展 | 沉浸式翻译…...

基于PowerWord的储能在主动配电网中的仿真研究

摘要 主动配电网是智能配电网技术发展的高级阶段&#xff0c;分布式储能是主动配电网的重要组成部分&#xff0c;分布式储能的应用对主动配电网的规划、运行、网络拓扑、故障处理和保护、可再生能源电源的协调优化等方面带来不容忽视的影响&#xff0c;针对这一现状&#xff0c…...

并查集与最小生成树

并查集 HDOJ-1232 畅通工程 题目&#xff1a; 省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通&#xff0c;输入现有城镇道路统计表&#xff08;表中列出了每条道路直接连通的城镇&#xff09;&#xff0c;求最少还需要建设的道路数量。&#xff08;城镇从1到…...

平面运动机器人的传感器外参标定

简述 对任意两个传感器进行外参标定可以采用手眼标定算法来完成&#xff0c;但是&#xff0c;传统手眼标定算法对于运动具有一定的要求&#xff0c;可以证明&#xff0c;至少需要两个以上轴角方向不同的旋转运动才可以正确估计出外参旋转&#xff0c;因此&#xff0c;如果使用…...

【星海随笔】SDN neutron (二) Neutron-plugin(ML2)

Neutron架构之Neutron-plugin Core-plugin(ML2)篇 Neutron-server接收两种请求&#xff1a; REST API请求&#xff1a;接收REST API请求&#xff0c;并将REST API分发到对应的Plugin&#xff08;L3RouterPlugin&#xff09;。 RPC请求&#xff1a;接收Plugin agent请求&#…...

野火i.MX6ULL开发板检测按键evtest(Linux应用开发)

之前一直查找不到evtest&#xff0c;因为没有下载成功&#xff0c;很可能是网络不好&#xff0c;下次可以软件源可以换成国内大学镜像网站。 重新断开板子电源启动&#xff0c;再次连接网络&#xff0c;下载evtest成功&#xff01;&#xff01;...

k8s存储

nfs 理论上nfs 其实并不是存储设备&#xff0c;它是一种远程共享存储服务。 k8s 存储卷 volume emptyDir&#xff1a;可以实现pod中的容器之间共享数据&#xff0c; 但是存储卷不能持久化数据&#xff0c;且会随着pod的生命周期一起删除。 hostpash&#xff1a;可以实现持久…...

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…...

实用技巧:嵌入式人员使用http服务模拟工具模拟http服务器测试客户端get和post请求

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134305752 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…...

P9836 种树

容易想到分解因数。 对于一个数 p p p 的因数个数&#xff0c;假设它可以被分解质因数成 a 1 i 1 a 2 i 2 a 3 i 3 ⋯ a k c k a_1^{i_1} a_2^{i_2} a_3^{i_3}\cdots a_k^{c_k} a1i1​​a2i2​​a3i3​​⋯akck​​ 的形式&#xff0c;则其因数个数为 ( i 1 1 ) ( i 2 1 )…...

C# 查询腾讯云直播流是否存在的API实现

应用场景 在云考试中&#xff0c;为防止作弊行为的发生&#xff0c;会在考生端部署音视频监控系统&#xff0c;当然还有考官方监控墙系统。在实际应用中&#xff0c;考生一方至少包括两路直播流&#xff1a; &#xff08;1&#xff09;前置摄像头&#xff1a;答题的设备要求使…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

stm32wle5 lpuart DMA数据不接收

配置波特率9600时&#xff0c;需要使用外部低速晶振...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...

绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化

iOS 应用的发布流程一直是开发链路中最“苹果味”的环节&#xff1a;强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说&#xff0c;这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发&#xff08;例如 Flutter、React Na…...

土建施工员考试:建筑施工技术重点知识有哪些?

《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目&#xff0c;核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容&#xff0c;附学习方向和应试技巧&#xff1a; 一、施工组织与进度管理 核心目标&#xff1a; 规…...