




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
动画与游戏开发课程报告学 号: 3 姓 名: 张慧 专业班级: 11级计科本01班 日 期: 2013-12-9 电子信息工程学院目录一、 课程内容及应用领域1. 1基于DirectX的粒子系统.3 1.1.1 粒子系统简介.3 1.1.2广告板技术. 3 1.1.3粒子系统的基本原理. 31.2粒子系统的应用领域 . 3二、 课程内容的难点、疑点2.1课程要点. 42.2课程难点. 42.3课程疑点. 43、 实例开发3.1实例题目及说明. 43.2关键技术. 5 3.2.1系统完成的四部曲. 5 3.2.2星光粒子结构构成技术. 5 3.2.3 MyPaint()绘图函数.53.3开发过程.9 3.3.1案例所需背景图.10 3.3.2程序部分代码.10 3.3.3运行结果截图.153.4总结.17四、谈谈自己对课程内容的掌握程度18一、课程内容及应用领域1.课程内容:基于DirectX的粒子系统 相关内容简介:(1)粒子系统简介粒子系统是三维图形编程领域中用于实现特殊效果的一种非常重要的技术.该技术是由Reeves于1983年首次提出来的.通过粒子系统可以使用非常简单的粒子来构造复杂的物体,它为模拟动态的不规则物体,提供了强有力的技术手段。一般情况下,粒子的几何特征十分简单,可以用一个像素或一个小的多边形来表示.如果给出了粒子中心点的坐标和粒子大小,不难计算出绘制粒子所需要的四个顶点的位置坐标.(2)广告板技术由于通常使用平面图形而不是立体图形表示一个粒子,所以需要使用的粒子四边形始终面向观察者.这就要使用广告板技术.广告板技术的原理是,在渲染一个多边形时,首先根据观察方向构造一个旋转矩阵,利用该矩阵旋转多边形使其面向观察者,如果观察方向不断变化,就要不断旋转多边形. (3)粒子系统的基本原理 粒子通常都是一个带有纹理的四边形。我们通过这个使用了纹理映射的四边形,可以认为粒子实际上是一个很小的网格模型,只不过是纹理赋予了它特殊的外表罢了。绘制粒子就如果绘制多边形一样简单,因为一个粒子说白了就是一个可改变大小并映射了纹理的四边形罢了。 粒子系统由大量的粒子构成,粒子是一种微小的物体,每个粒子都具有一定的属性,如位置、大小以及纹理,可能还需要颜色、透明度、运动速度、加速度、生命期等属性。我们可以把粒子想象成颗粒状的物体,如雪花,雨滴,沙尘,烟雾等特殊的事物。又比如游戏中的怪物,晶体,材料,在需要的时候,也可以通过粒子来实现。俗话说“不积跬步,无以至千里,不积小流,何以成江海”,单个的粒子是比较平凡的存在,但是如果将大量的粒子聚到一起,就可以实现很多神奇的效果了。在C/C+中,结构体“是用来定义粒子类型的绝佳武器,原则上用“类”也可以实现。2.应用领域: 1983年,奇才Reeves.V.T在它发表的论文Particle Systems A Technique for Modeling a Class of Fuzzy Objects中首次提出了粒子系统的概念。从此,粒子系统就开始广泛运用于计算机中各种模糊景物的模拟。经常使用粒子系统模拟的现象有火焰、爆炸、烟、水流、火花、落叶、云、雾、雪、尘、流星尾迹或者像发光轨迹这样的抽象视觉效果等等。这些物体模型在计算机中往往很难用具体的形状、大小来描述,但是我们可以通过粒子系统的思想,去描述组成这些物体的每个元素和它的变化。 一般情况下,粒子的几何特征都十分的简单,可以采用一个像素或者是一个小的多边形来表示。需要注意的是,粒子系统的最大的缺陷是,当粒子数量达到很大的规模的时候,对运行时机器性能的要求会更加苛刻,如果机器的性能跟不上,就会显得达不到实时的运行效果。 在许多三维建模及渲染包内部就可以创建、修改粒子系统,如 3D Studio Max、Maya 以及 Blender 等。这些编辑程序使艺术家能够立即看到他们设定的特性或者规则下粒子系统的表现,另外还有一些插件能够提供增强的粒子系统效果,例如 AfterBurn 以及用于流体的 RealFlow。而2D的粒子特效软件中particleIllusion最为出色,因为他的渲染比一般的3D软件快较为平面化。Combustion 这样的多用途软件或者只能用于粒子系统的Particle Studio 等都可以用来生成电影或者视频中的粒子系统。而目前,粒子系统技术被广泛用于大型3D游戏地制作中。二、课程内容的难点、疑点1.课程要点:(1)星光粒子的结构构造:struct flystarint x; /星光所在的x坐标int y; /星光所在的y坐标int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的时间BOOL exist; /星光是否存在flystar50;6个成员分别为,粒子坐标两个值,粒子方向两个值,持续时间lasted,和粒子是否存在的标识exist。(2)星光粒子系统的更新 典型的粒子系统更新循环可以分为两个不同的阶段:模拟阶段和渲染阶段.每个循环执行每一帧动画. 成员函数Update负责根据当前运行时间更新整个粒子系统.该函数首先遍历离子链表中的所有粒子,根据当前粒子的存活时间计算粒子的当前位置和速度,从而实现对粒子运动轨迹的控制.然后根据粒子是否已经落到地面上,判断当前例子是否已经死亡,并删除死亡的粒子.(3)星光粒子的运动轨迹2.课程难点: 粒子运动轨迹的实现、粒子的更新渲染等3.课程疑点:(1)并不是所有的粒子都是使用由两个三角形组成的矩形来表示的。例如,在模拟雨景时,可以用两个顶点构成的一条线段来表示一个雨点粒子。同时,即使某个粒子系统中的粒子都是用矩形表示,也并不意味着在渲染粒子时,一定要使用广告板技术。例如,在模拟雪景时,通常是用矩形表示一个雪花粒子,但为了模拟学花在下降过程中随风飘舞的姿态,就不能使用广告板技术。(2)可以不使用点精灵,而完全由程序控制每个粒子的渲染,也可以在初始化时一次性产生所有的粒子。(3)粒子系统的效果与应用,关键在于如何描述粒子的运动轨迹,也就是构造粒子的运动函数.运动函数构造的恰当与否,直接决定仿真效果的逼真程度.三、 实例开发1.实例题目及说明 题目:基于DirectX的星光绽放 说明:本设计的星光绽放相当于是一个模拟爆炸(或者说是烟花)特效的展示,在这个案例之中,绽放点为在窗口中由随机数产生的一个位置,绽放后,会出现很多星光以不同的速度向四方飞散而去,当粒子飞出窗口后或者超出时间后便会消失。每一次爆炸所出现的粒子全部消失后,便会重新出现绽放的画面,以产生不断绽放星光的效果。该设计运用DirectX中的粒子系统等的知识点,可在VC+的环境下进行运行,2.关键技术 2.1粒子系统在宏观和微观上都是随时间不断变化的,一套粒子系统在它生命周期的每一刻,一般都需完成以下的四步曲的工作: (1)产生新的粒子:这一步当中,我们会根据预定的要求,产生一定数目的新粒子。粒子的各项初始属性都可以用rand函数来在一定的范围内赋上随机的值。 (2)更新现有粒子的属性:比如粒子有位置和移动速度,自旋速度等等属性,这就需要在每一帧当中根据原来的粒子的位置移动速度和自旋速度重新进行计算和赋值更新。 (3)删除已经消亡的粒子:这一步是可选的,具体情况具体分析,因为有些粒子系统中粒子是一直都存在的,没有消亡一说。在规定了粒子生命周期的一套粒子系统中,就需要判断每个粒子是否生命走到了尽头,如果是的话,那么它就game over,消亡了,得用相关代码把它从粒子系统中消除。(4) 绘制出粒子:这步没有的话什么都不是,不显示出来叫什么粒子系统啊。人家可不管你在之前做了多少工作,算了多少东西,反正玩家是要看到最终的显示效果的。 2.2 星光粒子的结构构造技术:struct flystarint x; /星光所在的x坐标int y; /星光所在的y坐标int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的时间BOOL exist; /星光是否存在flystar50; 2.3主要函数之一MyPaint()绘图函数:/全局变量声明HINSTANCE hInst;HBITMAP bg,star,mask; /用于贴图的三个HBITMAP变量HDChdc,mdc,bufdc;HWNDhWnd;RECTrect;int i,count; /定义count用于计数struct flystarint x; /星光所在的x坐标int y; /星光所在的y坐标int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的时间BOOL exist; /星光是否存在flystar50;/全局函数声明ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);voidMyPaint(HDC hdc);/WinMain函数,程序入口点函数int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG msg;MyRegisterClass(hInstance);/初始化if (!InitInstance (hInstance, nCmdShow) return FALSE;/消息循环 while (GetMessage(&msg, NULL, 0, 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam;/设计一个窗口类,类似填空题,使用窗口结构体ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= NULL;wcex.hCursor= NULL;wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= NULL;wcex.lpszClassName= maple;wcex.hIconSm= NULL;return RegisterClassEx(&wcex);/初始化函数 / 1.加载位图资源/ 2.取得内部窗口区域信息 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)HBITMAP bmp;hInst = hInstance;hWnd = CreateWindow(maple, 星光绽放展示窗口 , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE;MoveWindow(hWnd,10,10,600,450,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);bg = (HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); star = (HBITMAP)LoadImage(NULL,star.bmp,IMAGE_BITMAP,30,30,LR_LOADFROMFILE); mask = (HBITMAP)LoadImage(NULL,mask.bmp,IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hWnd,&rect);SetTimer(hWnd,1,0,NULL);MyPaint(hdc);return TRUE;/自定义绘图函数/ 1.窗口贴图/ 2.实现星光绽放的效果void MyPaint(HDC hdc)/创建粒子if(count = 0) /随机设置爆炸点intx=rand()%rect.right;inty=rand()%rect.bottom;for(i=0;i50;i+) /产生星光粒子flystari.x = x;flystari.y = y;flystari.lasted = 0; /设定该粒子存在的时间为零if(i%2=0) /按粒子编号i来决定粒子在哪个象限运动,且x,y方向的移动速度随机为115之间的一个值,由1+rand()%15来完成。flystari.vx = -(1+rand()%15);flystari.vy = -(1+rand()%15);if(i%2=1)flystari.vx = 1+rand()%15;flystari.vy = 1+rand()%15; if(i%4=2)flystari.vx = -(1+rand()%15);flystari.vy = 1+rand()%15;if(i%4=3)flystari.vx = 1+rand()%15;flystari.vy = -(1+rand()%15);flystari.exist = true; /设定粒子存在count = 50; /50个粒子由for循环设置完成后,我们将粒子数量设为50,代表目前有50颗星光/先在内存dc中贴上背景图片SelectObject(bufdc,bg);BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);for(i=0;i50;i+)if(flystari.exist) /判断粒子是否还存在,若存在,则根据其坐标(flystari.x,flystari.y)进行贴图操作SelectObject(bufdc,mask);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCAND);SelectObject(bufdc,star);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCPAINT);/计算下一次贴图的坐标flystari.x+=flystari.vx;flystari.y+=flystari.vy;/在每进行一次贴图后,将粒子的存在时间累加1.flystari.lasted+;/进行条件判断,若某粒子跑出窗口区域一定的范围,则将该粒子设为不存在,且粒子数随之递减if(flystari.xrect.right | flystari.yrect.bottom | flystari.lasted50)flystari.exist = false; /删除星光粒子 count-; /递减星光总数/将mdc中的全部内容贴到hdc中BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);3. 开发过程(1) 对案例整体进行选取和分析在之前课堂做过相关案例的基础上,进行修改和创新,添加一些其他的内容.这个案例用到的知识紧扣教材,是对本学期学习程度的一个很好的检测,而且,这个实验也是在自己的能力范围之内的,可以做出来。(2)分析清楚该案例要用到的技术和必要的环境 该案例主要运用DirectX中的粒子系统、纹理映色、点的坐标变换、光照等技术,运行环境为VC+及DirectX.(3) 找出基本的函数及坐标应用,包括所需粒子的形状、大小、颜色和位置(4) 加入所需图片和粒子,如下:背景图:星光粒子图: (5) 案例总体实现的部分程序代码:#include stdafx.h#include /全局变量声明HINSTANCE hInst;HBITMAP bg,star,mask; /用于贴图的三个HBITMAP变量HDChdc,mdc,bufdc;HWNDhWnd;RECTrect;int i,count; /定义count用于计数struct flystarint x; /星光所在的x坐标int y; /星光所在的y坐标int vx; /星光x方向的速度int vy; /星光y方向的速度int lasted; /星光存在的时间BOOL exist; /星光是否存在flystar50;/全局函数声明ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);voidMyPaint(HDC hdc);/WinMain函数,程序入口点函数int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG msg;MyRegisterClass(hInstance);/初始化if (!InitInstance (hInstance, nCmdShow) return FALSE;/消息循环 while (GetMessage(&msg, NULL, 0, 0) TranslateMessage(&msg); DispatchMessage(&msg); return msg.wParam;/设计一个窗口类,类似填空题,使用窗口结构体ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= NULL;wcex.hCursor= NULL;wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= NULL;wcex.lpszClassName= maple;wcex.hIconSm= NULL;return RegisterClassEx(&wcex);/初始化函数 / 1.加载位图资源/ 2.取得内部窗口区域信息 BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)HBITMAP bmp;hInst = hInstance;hWnd = CreateWindow(maple, 星光绽放展示窗口 , WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (!hWnd)return FALSE;MoveWindow(hWnd,10,10,600,450,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);bufdc = CreateCompatibleDC(hdc); bmp = CreateCompatibleBitmap(hdc,640,480);SelectObject(mdc,bmp);bg = (HBITMAP)LoadImage(NULL,bg.bmp,IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE); star = (HBITMAP)LoadImage(NULL,star.bmp,IMAGE_BITMAP,30,30,LR_LOADFROMFILE); mask = (HBITMAP)LoadImage(NULL,mask.bmp,IMAGE_BITMAP,30,30,LR_LOADFROMFILE); GetClientRect(hWnd,&rect);SetTimer(hWnd,1,0,NULL);MyPaint(hdc);return TRUE;/自定义绘图函数/ 1.窗口贴图/ 2.实现星光绽放的效果void MyPaint(HDC hdc)/创建粒子if(count = 0) /随机设置爆炸点intx=rand()%rect.right;inty=rand()%rect.bottom;for(i=0;i50;i+) /产生星光粒子flystari.x = x;flystari.y = y;flystari.lasted = 0; /设定该粒子存在的时间为零if(i%2=0) /按粒子编号i来决定粒子在哪个象限运动,且x,y方向的移动速度随机为115之间的一个值,由1+rand()%15来完成。flystari.vx = -(1+rand()%15);flystari.vy = -(1+rand()%15);if(i%2=1)flystari.vx = 1+rand()%15;flystari.vy = 1+rand()%15; if(i%4=2)flystari.vx = -(1+rand()%15);flystari.vy = 1+rand()%15;if(i%4=3)flystari.vx = 1+rand()%15;flystari.vy = -(1+rand()%15);flystari.exist = true; /设定粒子存在count = 50; /50个粒子由for循环设置完成后,我们将粒子数量设为50,代表目前有50颗星光/先在内存dc中贴上背景图片SelectObject(bufdc,bg);BitBlt(mdc,0,0,rect.right,rect.bottom,bufdc,0,0,SRCCOPY);for(i=0;i50;i+)if(flystari.exist) /判断粒子是否还存在,若存在,则根据其坐标(flystari.x,flystari.y)进行贴图操作SelectObject(bufdc,mask);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCAND);SelectObject(bufdc,star);BitBlt(mdc,flystari.x,flystari.y,30,30,bufdc,0,0,SRCPAINT);/计算下一次贴图的坐标flystari.x+=flystari.vx;flystari.y+=flystari.vy;/在每进行一次贴图后,将粒子的存在时间累加1.flystari.lasted+;/进行条件判断,若某粒子跑出窗口区域一定的范围,则将该粒子设为不存在,且粒子数随之递减if(flystari.xrect.right | flystari.yrect.bottom | flystari.lasted50)flystari.exist = false; /删除星光粒子 count-; /递减星光总数/将mdc中的全部内容贴到hdc中BitBlt(hdc,0,0,640,480,mdc,0,0,SRCCOPY);/消息处理函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_TIMER: /时间消息 MyPaint(hdc); /在消息循环中加入处理WM_TIMER消息,当接收到此消息时便调用MyPaint()函数进行窗口绘图 break; case WM_KEYDOWN: /按键消息 if(wParam=VK_ESCAPE) /按下【Esc】键PostQuitMessage(0);break;case WM_DESTROY: /窗口结束消息 DeleteDC(mdc);DeleteDC(bufdc);DeleteObject(bg);DeleteObject(star);DeleteObject(mask);KillTimer(hWnd,1); /窗口结束时,删除所建立的定时器 ReleaseDC(hWnd,hdc);PostQuitMessage(0);break;default:/其他消息return DefWindowProc(hWnd, message, wParam, lParam); return 0;(6) 运行结果截图:星光左侧绽放星光中间绽放星光绽放到边界 4.总结 此次试验案例是基于DirectX技术构建的粒子系统,能够实粒子系统的基本内容,前面也提到过,本设计的星光绽放相当于是一个模拟爆炸(或者说是烟花)特效的展示,在这个案例之中,绽放点为在窗口中由随机数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高纯银合作协议书
- 2025年核防护材料及装置项目合作计划书
- 2025年船用动力堆及配套产品项目合作计划书
- 2025二手车买卖合同范本购车合同
- 2025电力工程施工内部承包合同 施工合同协议书
- 2025工程项目合作协议合同范本
- 2025年二级稳压装置项目合作计划书
- 2025年车载空气净化器项目建议书
- 2025年镉镍航空蓄电池项目建议书
- 人力资源员工培训沟通技巧
- SL631水利水电工程单元工程施工质量验收标准第2部分:混凝土工程
- GB/T 25413-2010农田地膜残留量限值及测定
- GB/T 13912-2020金属覆盖层钢铁制件热浸镀锌层技术要求及试验方法
- 一例巨大儿分娩的个案护理-课件
- 苏教版三年级科学下册单元测试卷及答案(全册)
- 室内质控-检验科课件
- (完整)人力资源六大模块ppt
- 小学四年级下学期英语阅读理解
- 彩色手绘卡通儿科小儿护理高热惊厥健康宣教教案PPT课件讲义
- DB43∕T 498-2009 博落回叶-行业标准
- 心力衰竭病人的护理查房pptppt(ppt)课件
评论
0/150
提交评论