




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 动画与游戏开发动画与游戏开发 课程报告课程报告 学 号 3 姓 名 张慧 专业班级 11 级计科本 01 班 日 期 2013 12 9 电子信息工程学院 2 目录 一 一 课程内容及应用领域课程内容及应用领域 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 3 实例开发实例开发 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 四 谈谈自己对课程内容的掌握程度四 谈谈自己对课程内容的掌握程度 3 一 课程内容及应用领域一 课程内容及应用领域 1 1 课程内容课程内容 基于基于 DirectXDirectX 的粒子系统的粒子系统 相关内容简介相关内容简介 1 1 粒子系统简介粒子系统简介 粒子系统是三维图形编程领域中用于实现特殊效果的一种非常重要的技术 该技术是由 Reeves 于1983年首次提出来的 通过粒子系统可以使用非常简单的粒子来构造复杂的物体 它为模拟动态的不规则物体 提供了强有力的技术手段 一般情况下 粒子的几何特征十分 简单 可以用一个像素或一个小的多边形来表示 如果给出了粒子中心点的坐标和粒子大小 不难计算出绘制粒子所需要的四个顶点的位置坐标 2 2 广告板技术广告板技术 由于通常使用平面图形而不是立体图形表示一个粒子 所以需要使用的粒子四边形始终 面向观察者 这就要使用广告板技术 广告板技术的原理是 在渲染一个多边形时 首先根据 观察方向构造一个旋转矩阵 利用该矩阵旋转多边形使其面向观察者 如果观察方向不断变 化 就要不断旋转多边形 3 3 粒子系统的基本原理粒子系统的基本原理 粒子通常都是一个带有纹理的四边形 我们通过这个使用了纹理映射的四边形 可以 认为粒子实际上是一个很小的网格模型 只不过是纹理赋予了它特殊的外表罢了 绘制粒 子就如果绘制多边形一样简单 因为一个粒子说白了就是一个可改变大小并映射了纹理的 四边形罢了 粒子系统由大量的粒子构成 粒子是一种微小的物体 每个粒子都具有一定的属性 如 位置 大小以及纹理 可能还需要颜色 透明度 运动速度 加速度 生命期等属性 我 们可以把粒子想象成颗粒状的物体 如雪花 雨滴 沙尘 烟雾等特殊的事物 又比如游 戏中的怪物 晶体 材料 在需要的时候 也可以通过粒子来实现 俗话说 不积跬步 无以至千里 不积小流 何以成江海 单个的粒子是比较平凡的存在 但是如果将大量的粒 子聚到一起 就可以实现很多神奇的效果了 在 C C 中 结构体 是用来定义粒子类型 的绝佳武器 原则上用 类 也可以实现 2 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 最为出色 因为他的渲染比一 4 般的 3D 软件快较为平面化 Combustion 这样的多用途软件或者只能用于粒子系统的 Particle Studio 等都可以用来生成电影或者视频中的粒子系统 而目前 粒子系统技术 被广泛用于大型 3D 游戏地制作中 二 课程内容的难点 疑点二 课程内容的难点 疑点 1 1 课程要点 课程要点 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 2 星光粒子系统的更新星光粒子系统的更新 典型的粒子系统更新循环可以分为两个不同的阶段 模拟阶段和渲染阶段 每个循环执行 每一帧动画 成员函数 Update 负责根据当前运行时间更新整个粒子系统 该函数首先遍历离子链表中 的所有粒子 根据当前粒子的存活时间计算粒子的当前位置和速度 从而实现对粒子运动轨 迹的控制 然后根据粒子是否已经落到地面上 判断当前例子是否已经死亡 并删除死亡的粒 子 3 3 星光粒子的运动轨迹星光粒子的运动轨迹 2 2 课程难点 课程难点 粒子运动轨迹的实现 粒子的更新渲染等 3 3 课程疑点 课程疑点 1 1 并不是所有的粒子都是使用由两个三角形组成的矩形来表示的 例如 在模拟雨景时 可以用两个顶点构成的一条线段来表示一个雨点粒子 同时 即使某个粒子系统中的粒子 都是用矩形表示 也并不意味着在渲染粒子时 一定要使用广告板技术 例如 在模拟雪 景时 通常是用矩形表示一个雪花粒子 但为了模拟学花在下降过程中随风飘舞的姿态 就不能使用广告板技术 2 可以不使用点精灵 而完全由程序控制每个粒子的渲染 也可以在初始化时一次性产生 所有的粒子 3 粒子系统的效果与应用 关键在于如何描述粒子的运动轨迹 也就是构造粒子的运动函数 运 动函数构造的恰当与否 直接决定仿真效果的逼真程度 5 三 三 实例开发实例开发 1 1 实例题目及说明实例题目及说明 题目题目 基于 DirectX 的星光绽放 说明说明 本设计的星光绽放相当于是一个模拟爆炸 或者说是烟花 特效的展示 在这个 案例之中 绽放点为在窗口中由随机数产生的一个位置 绽放后 会出现很多星光以不同 的速度向四方飞散而去 当粒子飞出窗口后或者超出时间后便会消失 每一次爆炸所出现 的粒子全部消失后 便会重新出现绽放的画面 以产生不断绽放星光的效果 该设计运用 DirectX 中的粒子系统等的知识点 可在 VC 的环境下进行运行 2 2 关键技术关键技术 2 12 1 粒子系统在宏观和微观上都是随时间不断变化的 一套粒子系统在它生命周期的每粒子系统在宏观和微观上都是随时间不断变化的 一套粒子系统在它生命周期的每 一刻 一般都需完成以下的四步曲的工作 一刻 一般都需完成以下的四步曲的工作 1 产生新的粒子 这一步当中 我们会根据预定的要求 产生一定数目的新粒子 粒子的各项初始属性都可以用 rand 函数来在一定的范围内赋上随机的值 2 更新现有粒子的属性 比如粒子有位置和移动速度 自旋速度等等属性 这就需 要在每一帧当中根据原来的粒子的位置移动速度和自旋速度重新进行计算和赋值更新 3 删除已经消亡的粒子 这一步是可选的 具体情况具体分析 因为有些粒子系统 中粒子是一直都存在的 没有消亡一说 在规定了粒子生命周期的一套粒子系统中 就需 要判断每个粒子是否生命走到了尽头 如果是的话 那么它就 game over 消亡了 得用 相关代码把它从粒子系统中消除 4 绘制出粒子 这步没有的话什么都不是 不显示出来叫什么粒子系统啊 人家可 不管你在之前做了多少工作 算了多少东西 反正玩家是要看到最终的显示效果的 2 22 2 星光粒子的结构构造技术 星光粒子的结构构造技术 struct flystar int x 星光所在的 x 坐标 int y 星光所在的 y 坐标 int vx 星光 x 方向的速度 int vy 星光 y 方向的速度 int lasted 星光存在的时间 BOOL exist 星光是否存在 flystar 50 2 32 3主要函数之一主要函数之一 MyPaintMyPaint 绘图函数 绘图函数 全局变量声明 HINSTANCE hInst HBITMAP bg star mask 用于贴图的三个 HBITMAP 变量 HDChdc mdc bufdc HWNDhWnd RECTrect int i count 定义 count 用于计数 struct flystar 6 int x 星光所在的 x 坐标 int y 星光所在的 y 坐标 int vx 星光 x 方向的速度 int vy 星光 y 方向的速度 int lasted 星光存在的时间 BOOL exist 星光是否存在 flystar 50 全局函数声明 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 DispatchMessage 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 7 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 初始化函数 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 LOADFR OMFILE 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 SetTimer hWnd 1 0 NULL MyPaint hdc return TRUE 自定义绘图函数 1 窗口贴图 2 实现星光绽放的效果 8 void MyPaint HDC hdc 创建粒子 if count 0 随机设置爆炸点 intx rand rect right inty 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来完成 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 2 1 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 4 2 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 4 3 flystar i vx 1 rand 15 flystar i vy 1 rand 15 flystar i 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 i 50 i 9 if flystar i exist 判断粒子是否还存在 若存在 则根据其坐标 flystar i x flystar i y 进行贴图操作 SelectObject bufdc mask BitBlt mdc flystar i x flystar i y 30 30 bufdc 0 0 SRCAND SelectObject bufdc star BitBlt mdc flystar i x flystar i y 30 30 bufdc 0 0 SRCPAINT 计算下一次贴图的坐标 flystar i x flystar i vx flystar i y flystar i vy 在每进行一次贴图后 将粒子的存在时间累加1 flystar i lasted 进行条件判断 若某粒子跑出窗口区域一定的范围 则将该粒子设为不存 在 且粒子数随之递减 if flystar i xrect right flystar i yrect bottom flystar i lasted 50 flystar i exist false 删除星光粒子 count 递减星光总数 将 mdc 中的全部内容贴到 hdc 中 BitBlt hdc 0 0 640 480 mdc 0 0 SRCCOPY 3 3 开发过程开发过程 1 1 对案例整体进行选取和分析对案例整体进行选取和分析 在之前课堂做过相关案例的基础上 进行修改和创新 添加一些其他的内容 这个案例用到 的知识紧扣教材 是对本学期学习程度的一个很好的检测 而且 这个实验也是在自己的能 力范围之内的 可以做出来 2 2 分析清楚该案例要用到的技术和必要的环境 分析清楚该案例要用到的技术和必要的环境 该案例主要运用 DirectX 中的粒子系统 纹理映色 点的坐标变换 光照等技术 运行 环境为 VC 及 DirectX 3 3 找出基本的函数及坐标应用 包括所需粒子的形状 大小 颜色和位置找出基本的函数及坐标应用 包括所需粒子的形状 大小 颜色和位置 4 4 加入所需图片和粒子 如下 加入所需图片和粒子 如下 背景图 背景图 10 星光粒子图 星光粒子图 5 5 案例总体实现的部分程序代码 案例总体实现的部分程序代码 include stdafx h include 全局变量声明 HINSTANCE hInst HBITMAP bg star mask 用于贴图的三个 HBITMAP 变量 HDChdc mdc bufdc HWNDhWnd RECTrect int i count 定义 count 用于计数 struct flystar 11 int x 星光所在的 x 坐标 int y 星光所在的 y 坐标 int vx 星光 x 方向的速度 int vy 星光 y 方向的速度 int lasted 星光存在的时间 BOOL exist 星光是否存在 flystar 50 全局函数声明 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 DispatchMessage 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 12 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 初始化函数 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 LOADFR OMFILE 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 SetTimer hWnd 1 0 NULL MyPaint hdc return TRUE 13 自定义绘图函数 1 窗口贴图 2 实现星光绽放的效果 void MyPaint HDC hdc 创建粒子 if count 0 随机设置爆炸点 intx rand rect right inty 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来完成 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 2 1 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 4 2 flystar i vx 1 rand 15 flystar i vy 1 rand 15 if i 4 3 flystar i vx 1 rand 15 flystar i vy 1 rand 15 flystar i exist true 设定粒子存在 count 50 50个粒子由 for 循环设置完成后 我们将粒子数量设为50 代表目前有50颗星光 先在内存 dc 中贴上背景图片 14 SelectObject bufdc bg BitBlt mdc 0 0 rect right rect bottom bufdc 0 0 SRCCOPY for i 0 i 50 i if flystar i exist 判断粒子是否还存在 若存在 则根据其坐标 flystar i x flystar i y 进行贴图操作 SelectObject bufdc mask BitBlt mdc flystar i x flystar i y 30 30 bufdc 0 0 SRCAND SelectObject bufdc star BitBlt mdc flystar i x flystar i y 30 30 bufdc 0 0 SRCPAINT 计算下一次贴图的坐标 flystar i x flystar i vx flystar i y flystar i vy 在每进行一次贴图后 将粒子的存在时间累加1 flystar i lasted 进行条件判断 若某粒子跑出窗口区域一定的范围 则将该粒子设为不存 在 且粒子数随之递减 if flystar i xrect right flystar i yrect bottom flystar i lasted 50 flystar i 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 15 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 6 运行结果截图 运行结果截图 星光左侧绽放 16 星光中间绽放 星光绽放到边界 17 4 4 总结总结 此次试验案例是基于 DirectX 技术构建的粒子系统 能够实粒子系统的基本内容 前面也 提到过 本设计的星光绽放相当于是一个模拟爆炸 或者说是烟花 特效的展示 在这个案 例之中 绽放点为在窗口中由随机数产生的一个位置 绽放后 会出现很多星光以不同的 速度向
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能会展数据分析报告
- 校园图书馆轻质材料应用案例研究报告
- 2025年有色金属资源循环利用产业链产业链废弃物处理产业链产业链环保效益评估报告
- 金融领域2025年人工智能算法审计在合规检查中的应用报告
- 2025年数控机床智能化升级技术路径与产业生态构建研究报告
- 中医考研复试题库及答案
- 老年人教育服务质量评价体系构建与实施报告
- 中医认证考试题及答案
- 中医试题及答案
- 2025年事业单位工勤技能-安徽-安徽水利机械运行维护工一级(高级技师)历年参考题库含答案解析
- 2025西安亮丽电力集团有限责任公司招聘10人笔试备考题库及1套完整答案详解
- 2025河北唐山某国有企业单位招聘劳务派遣工作人员44人笔试参考题库附带答案详解(10套)
- 成都银行总行招聘考试真题2024
- 基孔肯雅热培训测试题含答案
- 留疆战士考试题库及答案
- 小额贷款公司贷款五级分类办法
- 2025公卫执业医师考试试题(附答案)
- 医院药品质量管理课件
- 2025年上海市中考招生考试数学真题试卷(真题+答案)
- 大型活动策划组织与执行合同
- 2025年广东省中考英语试题卷(含答案解析)
评论
0/150
提交评论