第十一章 火焰的模拟.ppt

  1. 1、本文档共23页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章 火焰的模拟

OpenGL高级编程 可视化系统开发 广东工业大学图学与数字媒体系 罗立宏 第十一章 火焰的模拟 11.1 编程实例一 11.1.1 程序说明 11.1.2 使用到的技术(算法) 温度场的生成推演 颜色的约定 温度网格的绘制 (1)温度场的生成和推演 温度场推演( ) //每帧都要推演一次 { 把网格最下面一行的点随机赋 上温度值 for(对每个网格) T(x,y)=(T(x,y)+T(x-1,y+1) +T(x,y+1)+ T(x+1,y+1))/4 – 2 } 算式中取平均值,使得温度场 是连续的,-2则使得越往上温度 越低。 (2)颜色的约定 1.总体策略: 随着温度由0升高到255度或以上,颜色由黑→红→黄→白 2.具体方法 0 ° T 64°: r=T/64, g=0, b=0. 即 黑→红 64° T 128°: r=1, g=T/128, b=0.即 红→黄 128° T 192°: r=1, g=1, b=k/192. 即 黄→白 T 192°: r=1, g=1, b=1. 即 白 (3)温度网格的绘制 使用平滑模式GL_SMOOTH画多边形,每个顶点按温度不同使用不同的颜色,多边形内部的颜色会渐变。 11.1.3 程序阅读 本程序使用了第二章做的OpenGL单文档模板,在此基础上开发而成 11.1.3.1 绘图部分代码 绘图的程序绘图的工作都是在视图类的OnDraw()函数中开始的。因此,可以从OnDraw开始入手,找出绘图相关的函数: ◆ CMyFire1View::RenderScene() ◆ CMyFire1View ::Fuoco () //推演温度场 ◆ CMyFire1View ::ShowFire () //绘制火焰 ◆ CMyFire1View ::Colore () //颜色约定 (1) CMyFire1View::RenderScene() BOOL CMyFire1View::RenderScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); //矩阵堆栈重置为单位阵 //frame变量控制火焰燃烧动画的速度 frame++; frame=frame%2; //两帧更新一次画面 if(frame==0) if(freeze==false) Fuoco(); //推演温度场(即推演火焰) glTranslatef(0.1f,0.0f,-2.7f); //控制火焰的左右、远近 ShowFire(0,0,0,(float)0.1); //依照温度场绘制网格(显示火焰) ::SwapBuffers(m_pDC-GetSafeHdc()); // 交互缓冲区 return TRUE; } (2) CMyFire1View::Fuoco () //温度场推演 void CMyFire1View::Fuoco(void) { int x,y; int k; //对最下面一行的网格点设置0°-192°的随机温度 for(x=8;xFIREX-8;x++) Bfire[x][FIREY-1]=rand()%192; //最下面那行随机找5个点温度设为0,这样做火光会更“摇曳” for(x=0;x5;x++) Bfire[rand()%FIREX][FIREY-1]=0; //对每个网格循环 for(y=0;yFIREY-1;y++) { for(x=1;xFIREX-1;x++) { //按推演算法,温度取平均值并向上递减 k=Bfire[x][y]+Bfire[x-1][y+1]+Bfire[x+1][y+1]+Bfire[x][y+1]; k=k/4-2; if(k0) //递减设个尽头,最小为0 k=0; Bfire[x][y]=(unsigned char)k; } } } (3) CMyFire1View::ShowFire() void CMyFire1View::ShowFire(float x,float y,float z,float dim) { float xi,yi; fl

文档评论(0)

wyjy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档