网站大量收购独家精品文档,联系QQ:2885784924

粒子系统在2D特效中的应用一.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
粒子系统在2D特效中的应用一

粒子系统在2D特效中的应用一 粒子系统是啥西?小军曰:所谓的粒子系统,就是将我们看到的物体运动和自然现象,用一系列运动的粒子来描述,再将这些粒子运动的轨迹映射到显示屏上,然后呢?就是我们在显屏上看到的物体运动和自然现象的模拟效果了。 利用粒子系统我们可以在屏幕中表现诸多的特殊效果,如:焰火、火苗、落叶、雪花飞舞等。不怕做不到,就怕想不到。只要你的想象力足够丰富,你可以创造出意想不到的奇迹来。 好,开始切入我们这章的主题,粒子系统应用的关键在于如何描述粒子的运动轨迹,也就是构造粒子的运动函数。函数选择的恰当与否,决定效果的逼真程度。其次坐标系的选定(就是视角啦)也有一定的关系,视角不同,看到的效果自然不一样了。在这章里,我会用很多的实例来解释如何应用粒子系统来实现各种特效。接下来我们要实现的第一种特效就是------ 运动图标(一) 图标在这里我们泛指所有的位图,如团体标识、文字等图象。这里要实现的是让图标从远处迎面快速飞来这么一种效果。下面的同学别起哄,我要给你们演示的不是Windows的飞行窗口,它太缺乏速度感了,你们要感受的将是迎面碰撞的效果。下面我们一步一步来实现它: 第一步:构造粒子 一幅位图可看作是现实世界中的一张相片,我们看到的是它(位图)在与我们视线垂直的平面(显屏)上的投影。因此可用{长*宽}个单元的数组来描述,每个单元是一个点的颜色,画到屏幕上之前先计算好每个点在显屏上投影的位置就可以了。但我们凡事都要首先考虑一下效率。因为我们的图标一般都会设一个ColorKey,也就是透明色,位图中与颜色值与ColorKey相同的点都不需要画到显屏上,该颜色在屏幕上看起来就成了透明的。而我们计算各点运动轨迹的计算量可能都不会小,且透明色在整个位图中占的比例也一般较大,大量透明点参与运算势必影响程序的整体效率。所以我们要采取内存换效率的办法,牺牲少量的内存,争取更高的执行效率。具体办法是将数组中的透明点拿走,再给非透明点增加一些位置信息。 粒子系的生成过程是:先计算非透明点总数,再为这些点申请内存,最后读入每个的位置、颜色信息。 第二步:计算粒子在屏幕上的投影位置 我们这里图标是沿视线方向运动的,所以可让坐标系的Z轴沿视线方向,X、Y轴与屏幕的X、Y轴相同即可。目标从远处移近时,眼睛看到是从小到大,不断加速变大的物体形象。所以可用一个比例因子来描述这种变化。将图标的运动分成几个时段,依次在每个时段加大比例因子的增量,粒子的投影坐标就取其实际坐标(也就是其对应于原始位图的点坐标)与比例因子之积就行了。 第三步:画粒子 第四步:重复第二、三步过程 以下代码应该很容易读懂: // Code in Particles.h class CParticles { private: struct PARTICLE{ int X0, Y0; // 点在位图中的坐标 DWORD dwColor; int X, Y; // 点投影到屏幕上的坐标 }; public: CParticles(); virtual ~CParticles(); BOOL Create(CDDSurface *pDds); VOID ServeParticles(); VOID Draw(LPDDSURFACEDESC2 pDdsd, int nX=0, int nY=0); protected: DWORD m_dwCnt; PARTICLE *m_pPtc; int m_nScale; }; // Code in Particles.cpp // 生成粒子系。方便起见,取位图左上角第一个点的颜色值为ColorKey BOOL CParticles::Create(CDDSurface *pDds) { DWORD dwColorKey; DWORD dwBPP; DWORD dwMask; DDSURFACEDESC2 ddsd; ddsd.dwSize = sizeof(DDSURFACEDESC2); if (pDds-Lock(ddsd) != DD_OK) return FALSE; dwBPP = ddsd.ddpfPixelFormat.dwRGBBitCount3; // Bytes per pixel switch (dwBPP) { case 1: dwMask = 0xFF; break; case 2: dwMask = 0xFFFF; break; case 3: dwMask = 0xFFFFFF;

您可能关注的文档

文档评论(0)

qwd513620855 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档