当前位置:文档之家› 动画与游戏设计-课程设计报告

动画与游戏设计-课程设计报告

《动画与游戏开发》课程报告学号:*************名:**专业班级:11级计科本01班日期:2013-12-9电子信息工程学院目录一、课程内容及应用领域1.1基于DirectX的粒子系统 (3)1.1.1 粒子系统简介 (3)1.1.2广告板技术 (3)1.1.3粒子系统的基本原理 (3)1.2粒子系统的应用领域 (3)二、课程内容的难点、疑点2.1课程要点 (4)2.2课程难点 (4)2.3课程疑点 (4)三、实例开发3.1实例题目及说明 (4)3.2关键技术 (5)3.2.1系统完成的四部曲 (5)3.2.2星光粒子结构构成技术 (5)3.2.3 MyPaint()绘图函数 (5)3.3开发过程 (9)3.3.1案例所需背景图 (10)3.3.2程序部分代码 (10)3.3.3运行结果截图 (15)3.4总结..........................................................17四、谈谈自己对课程内容的掌握程度一、课程内容及应用领域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 flystar{int x; //星光所在的x坐标int y; //星光所在的y坐标int vx; //星光x方向的速度int vy; //星光y方向的速度int lasted; //星光存在的时间BOOL exist; //星光是否存在}flystar[50];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 flystar{int x; //星光所在的x坐标int y; //星光所在的y坐标int vx; //星光x方向的速度int vy; //星光y方向的速度int lasted; //星光存在的时间BOOL exist; //星光是否存在}flystar[50];2.3主要函数之一——MyPaint()绘图函数://全局变量声明HINSTANCE hInst;HBITMAP bg,star,mask; //用于贴图的三个HBITMAP变量HDC hdc,mdc,bufdc;HWND hWnd;RECT rect;int i,count; //定义count用于计数struct flystar{int x; //星光所在的x坐标int y; //星光所在的y坐标int vx; //星光x方向的速度int vy; //星光y方向的速度int lasted; //星光存在的时间BOOL exist; //星光是否存在}flystar[50];//全局函数声明ATOM MyRegisterClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); void MyPaint(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_LO ADFROMFILE);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) //随机设置爆炸点{int x=rand()%rect.right;int y=rand()%rect.bottom;for(i=0;i<50;i++) //产生星光粒子{flystar[i].x = x;flystar[i].y = y;flystar[i].lasted = 0; //设定该粒子存在的时间为零if(i%2==0)//按粒子编号i来决定粒子在哪个象限运动,且x,y方向的移动速度随机为1—15之间的一个值,由1+rand()%15来完成。

相关主题