如何利用OpenGL在MFC中开发出一个简单的喷泉模拟程序探讨 利用mfc编程来开发图形应用程序的基本步骤主要有几步

opengl \u706b\u7130\u55b7\u5c04\u7684\u6548\u679c \u8d8a\u7b80\u5355\u8d8a\u597d

\u8fd9\u662f\u6700\u7b80\u5355\u7684\u7c92\u5b50\u7279\u6548\uff0c \u5b66opengl\u7684\u4eba\u90fd\u5e94\u8be5\u4f1a\u505a\uff0c\u4ee3\u7801\u592a\u591a\u4e86\uff0c\u6253\u5f97\u9ebb\u70e6

http://blog.csdn.net/wanglang3081/article/details/8771343
\u8fd9\u4e2a\u7f51\u9875\u8be6\u7ec6\u4ecb\u7ecd\u5982\u4f55\u6765\u505a\u7c92\u5b50\u6548\u679c\u3002
\u4f60\u6309\u4ed6\u7684\u4ee3\u7801\u6765\u751f\u6210\u7c92\u5b50\uff0c \u7136\u540e\u628a\u6b7b\u4ea1\u65f6\u95f4\u51cf\u77ed\uff0c \u79fb\u52a8\u65b9\u5411\u4e0e\u98de\u673a\u76f8\u53cd\uff0c \u989c\u8272\u6539\u6210\u7ea2\u8272\u3002 \u7c92\u5b50\u6570\u81ea\u5df1\u6839\u636e\u9700\u8981\u6765\u8c03\u6574\u3002 \u4e3a\u4e86\u8ba9\u6548\u679c\u771f\u5b9e\uff0c \u53ef\u4ee5\u7ed9\u6bcf\u4e2a\u7c92\u5b50\u6765\u4e2a\u6e10\u53d8\u6548\u679c

\u5f00\u53d1\u7b80\u5355 MFC \u5e94\u7528\u7a0b\u5e8f\u7684\u6b65\u9aa4\u4e3b\u8981\u6709\uff1a
1. \u524d\u671f\u7b56\u5212---\u786e\u5b9a\u5e94\u7528\u7a0b\u5e8f\u8981\u6267\u884c\u54ea\u4e9b\u57fa\u672c\u4efb\u52a1\u3002
2. \u65b0\u5efa\u9879\u76ee---\u7528VS\u65b0\u5efaMFC\u9879\u76ee\uff0c\u8bbe\u7f6e\u521d\u59cb\u5c5e\u6027\u3002
3. \u754c\u9762\u8bbe\u8ba1---\u4f7f\u7528\uff02\u5bf9\u8bdd\u6846\u7f16\u8f91\u5668\uff02\u8bbe\u8ba1\u754c\u9762\uff1a\u6dfb\u52a0\u60f3\u8981\u7684\u5bf9\u8bdd\u6846\u63a7\u4ef6\uff0c\u8bbe\u7f6e\u5b83\u4eec\u7684\u5c5e\u6027\uff0c\u7136\u540e\u7cbe\u786e\u8c03\u8282\u5b83\u4eec\u7684\u4f4d\u7f6e\u548c\u5927\u5c0f\u4ee5\u770b\u8d77\u6765\u66f4\u52a0\u7f8e\u89c2\u3002
4. \u8bbe\u8ba1\u5b9e\u73b0---\u4e3a\u63a7\u4ef6\u6dfb\u52a0\u6210\u5458\u53d8\u91cf\uff0c\u540c\u65f6\u6dfb\u52a0\u5fc5\u9700\u7684\u7a0b\u5e8f\u53d8\u91cf\u4ee5\u53ca\u63a7\u4ef6\u7684\u4e8b\u4ef6\u5904\u7406\u7a0b\u5e8f\uff0c\u7136\u540e\u4e3a\u4f60\u7684\u7a0b\u5e8f\u7f16\u5199\u5b9e\u73b0\u4ee3\u7801\u4ee5\u4fbf\u8ba9\u5b83\u505a\u4f60\u60f3\u8981\u7684\u4e8b\u60c5\u3002
5. \u6d4b\u8bd5\u7a0b\u5e8f---\u8bd5\u8fd0\u884c\u7a0b\u5e8f\u5e76\u68c0\u67e5\u5176\u662f\u5426\u6309\u9884\u671f\u5de5\u4f5c\u3002\u5982\u679c\u5b58\u5728\u95ee\u9898\uff0c\u9700\u8fdb\u884c\u4fee\u6539\u3002

  1 OpenGL绘图环境初始化

  OpenGL是一个跨平台的三维图形库,可在Windows、Unix和Mac等平台上运行。而Visual
C++完善的基本类库MFC和应用向导AppWizard使得开发一个复杂的应用程序变得轻松自如。如果将两者结合,便可开发出较高水平的Windows下三维图形应用程序[1]。

  在3D游戏的渲染过程中,传统的建模方法一般只适用于外形比较规则的形体,对于那些像雨、雪、瀑布、喷泉以及火焰等没有固定形状,甚至要随着外部环境或者其他因素的改变而改变的物质建模,传统的方法就显得无能为力了[2]。1983年REEVES
W T提出了一种新的建模方法,称为模糊物体建模,该方法就是粒子系统,它的出现正好解决了上述问题[3]。

  OpenGL函数库和操作系统无关,它有自己的独特设计,与Windows的图像设备接口GDI模型以及多数MFC应用程序的建立方法不太一致。在Windows系统中,这样的一组函数称为wiggle函数,每个wiggle函数的前缀是“wgl”。

  在Win32下,首先必须重新设置画图窗口的像素格式,使其符合OpenGL对像素格式的需要。为此,声明一个PIXELFORMATDESCRIPTOR结构的变量,并适当设置其结构成员的值,使其支持OpenGL及其颜色模式。再以此变量为参数调用ChoosePixelFormat(),分配一个像素格式号,然后调用SetPixelFormat()将其设置为当前像素格式。

  完成了像素格式的重新设置后,需要为OpenGL建立绘制描述表(Render
Context)。绘制描述表的作用类似于Windows中的设备描述表(DevICe
Context)。只有建立了绘制描述表RC后,OpenGL才能调用绘图原语在窗口中做出图形。Win32API提供了几个操作绘制描述表的函数,包括建立、复制、使用、删除和查询等,它们都以wgl为词头。RC是以线程为单位的,每一个线程必须使用一个RC作为当前RC才能执行OpenGL绘图原语。

  wglCreateContext()是建立绘制描述表的函数,它以一个指向GDI设备描述表的句柄为参数,返回一个与此设备描述表相关联的绘制描述表句柄。在以此2句柄为参数调用函数wglMakeCurrent(),使RC成为线程当前使用的RC,完成Windows下OpenGL绘图环境的初始化过程[4]。

  2 建立OpenGL单文档应用程序框架

  使用Visual C++的AppWizard和Class Wizard可以很容易地生成一个使用MFC的OpenGL单文档应用程序框架,名称为MyFountain。

  2.1 PreCreateWindow方法

  BOOL CMySDOpenGLView:: PreCreateWindow(CREATESTRUCT& cs)

  {

  cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;

  return CView::PreCreateWindow(cs);

  }

  使视窗口具有WS_CLIPCHILDREN和WS_CLIPSIBLINGS风格,确保成功地设置像素格式。

  2.2 添加消息响应函数

  利用MFC ClassWizard为CMySDOpenGLView类添加消息WM_CREATE、WM_DESTROY、WM_SIZE和WM_TIMER的响应函数。

  首先在OnCreate方法中初始化OpenGL,并设置定时器。

  然后在OnTimer响应函数中添加定时器响应函数和场景更新命令,使得程序按照定时器设置的时间步长进行中断,并调用OnDraw对场景进行更新、渲染。

  第三步,添加OnSize函数对用户进行窗口调整的消息进行响应,并即时调整窗口的大小[5]。

  最后,当关闭窗口时,将值NULL(或0)赋值给wglMakeCurrent()的参数hRC后,调用wglDeleteContext()删除绘制描述表,并删除调色板和定时器。

  3 基于粒子系统的喷泉模拟

  构造可视化系统的建模技术大致可以分为两类:几何建模和行为建模。几何建模处理物体的几何和形状的表示,研究图形数据结构等基本问题;行为建模处理物体运动和行为的描述。

  一个粒子系统由大量称为粒子的简单体素构成。每个粒子有一组属性,如位置、速度、颜色和生命期。一个粒子究竟有什么样的属性,主要取决于具体的应用。粒子的初值由随机过程产生。粒子往往由位于空间的某个地方的粒子源产生。

  粒子系统也利用了随机过程,并常将物体的几何和行为组合在一个有机模型中。

  一个粒子系统是不断进化的。在生命期的每一刻,都要完成以下4步工作:

  (1)粒子源产生新粒子。产生任意数目的新粒子,它们的初始属性由随机过程控制。每个粒子都有一个生命期,如果某些粒子不应删除,则可以赋予它无限长的生命期。

  (2)更新现有粒子属性。例如,若粒子有位置和速度属性,在模拟重力场中的运动时,可以如下更新粒子的位置和速度属性:

  v=v+gts=s+vt

  在该步中,粒子的生命期递减一个时间步。

  (3)删除“死”粒子。检查粒子的生命期,若为0则将粒子从系统中删除。

  (4)绘制粒子。显示粒子系统中所有现存的粒子。

  在一般情况下,粒子的几何特征十分简单,可以采用一个像素或小的多边形来代表[6]。

  3.1 粒子数据结构的定义

  粒子数据结构的定义如下:

  struct particle

  {

  float t; //粒子的生命期

  float vel; //粒子运动的速度

  float dir; //粒子运动的方向

  float x,y,z; //粒子的位置坐标

  float xd,zd; //粒子的X和Z方向增加值

  char type; //粒子类型(运动或淡化)

  float a; //淡化alpha值

  struct particle*next,*prev;

  };

  3.2 绘制喷泉

  3.2.1 先构造一个场景

  由于重点是喷泉,因此简单构造一个模拟的地面能突出喷泉就可以了。实现代码如下:

  glClear(GL_COLOR_BUFFER_BIT);

  glLoadIdentity();

  glBindTexture(GL_TEXTURE_2D,texture[1]);

  a+=0.2;

  gluLookAt(cam.x,cam.y,cam.z,0,0,0,upv.x,upv.y, upv.z);

  3.2.2 喷泉的渲染处理

  喷泉的渲染处理过程主要是利用了OpenGL的特征函数[7]和方法,主要进行了两方面的处理:(1)将喷泉模型渲染成纹理文件[8];(2)采用透明纹理渲染技术[9]。

  3.2.3 喷泉的实现

  在构造了简单的地面场景后,取以原点为中心的圆周上的均匀点序列作为喷泉的喷射点,按照上述提到的绘制方法[10]即完成了喷泉的动态模拟。喷泉系统模拟的主要关键代码在于向内存中添加渲染粒子,即函数AddParticles(),之后粒子将按照预定的轨道运行,其主要实现代码如下:

  //添加新的粒子

  void CMyFountainView::AddParticles()

  {

  struct particle*tempp;

  int i, j;

  for (j=0;j<18;j++)

  for (i=0;i<2;i++)

  {

  tempp=(struct particle*)malLOC(sizeof(struct particle));

  if (fn[j])fn[j]->prev=tempp;

  tempp->next=fn[j];

  fn[j]=tempp;

  tempp->t=-9.9; //粒子的生命期

  tempp->v=(float)(rand()%200000)/100000+1;

  // 粒子速度

  tempp->d=(float)(rand()%400)/100-2;

  //粒子方向

  tempp->x=20*cos((j*3.14159)/180); //开始位置的坐标

  tempp->y=0;

  tempp->z=20*sin((j*3.14159)/180);

  tempp->xd=cos((tempp->d*3.14159)/180)*tempp->v/4;

  tempp->zd=sin((tempp->d*3.14159)/180)*tempp->v;

  tempp->type=0; //粒子状态为运动

  tempp->a=1; //粒子淡化

  }

  }

  • 銆愮瓟瀵硅拷鍔30鍒嗐OpenGL鍦∕FC涓榧犳爣璋冪敤闂!
    绛旓細鎴戣繕娌鍦∕FC鐢杩openGL锛屼笅闈㈣繖涓▼搴忔槸鎺у埗鍙板簲鐢ㄧ▼搴忥紝鏄敤榧犳爣妯℃嫙铏氭嫙鐞冩帶鍒剁珛鏂逛綋鏃嬭浆锛屾槸鐢ㄧ殑glutMouseFunc()锛岀Щ妞嶅埌MFC涓搴旇鏄彲浠ョ敤鐨勶紝甯屾湜瀵逛綘鏈夊府鍔┿--- include <math.h> include <GL/glut.h> include <stdlib.h> int winWidth, winHeight;float angle = 0.0, axis[3], trans...
  • CVIEW涓OPENGL璁剧疆
    绛旓細OpenGL瑕佹兂涓嶩DC娣风敤锛屾垨鑰呰鍏煎HDC鍚э紝闇瑕佷娇鐢╳glCreateContext()鍑芥暟鏉ラ氳繃HDC鍒涘缓涓涓狧GLRC骞舵妸瀹冮変负褰撳墠鎵浣跨敤鐨勭幆澧冦備笉杩囧湪姝や箣鍓嶏紝鎴戜滑杩橀渶瑕佹妸鍍忕礌鏍煎紡璁剧疆鎴愭敮鎸丱penGL鐨勬牸寮忋傚彟澶栵紝绐楀彛涔熷繀椤昏鏀逛负鐗瑰畾鐨勬牱寮忔墠鑳借OpenGL浣跨敤銆傚仛濂戒簡杩欎笁鐐癸紝灏辫兘鍦∕FC妗嗘灦涓浣跨敤OpenGL杩涜缁樺埗浜嗐
  • MFC + OpenGL缁樺浘鏄鎬庝箞鏍疯鎵缁樺浘褰㈠缁堟樉绀哄湪绐楀彛鍐,涓栫晫鍧愭爣鍜岀獥鍙...
    绛旓細鍏堟槸涓栫晫鍧愭爣绯讳笅鐨勭墿浣撶粡杩囪瑙佷綋鍓垏锛屾妸涓嶈鐨勬樉绀虹殑灏卞壀鎺変簡銆傜劧鍚庢槸涓夌淮鍧愭爣涓嬬殑鐗╀綋鎶曞奖鍒颁簩缁村潗鏍囦笅锛岃繖鏍峰氨鍙樻垚浜嗙獥鍙d腑鐨勫浘褰紝浣嗘槸绐楀彛涓殑鍥惧舰杩樺彧鏄昏緫鍧愭爣琛ㄧず锛屽繀椤绘斁鍒拌澶囧潗鏍囦笅鏉ユ墠鑳芥渶缁堟樉绀哄嚭鏉ワ紝涔熷氨鏄浆鍖栦负鐩爣鏄剧ず璁惧锛屾渶缁堣皟鏁翠竴涓嬪彉涓虹墿鐞嗗潗鏍囷紝灏卞畬鎴愪簡鎶曞奖鍓垏宸ヤ綔锛屽墿涓嬬殑灏辨槸...
  • MFC涓璒penGL鍏ㄥ睆閲囨牱鎶楅敮榻垮け璐
    绛旓細鍏跺疄OpenGL鐨鍏ㄥ睆鎶楅敮榻垮氨鏄紑鍚閲嶉噰鏍枫傚湪浣跨敤glut鐨勬椂鍊欙紝寰堟柟渚垮氨鑳藉疄鐜般傚彧瑕佸惎鐢ㄥ閲嶉噰鏍风紦鍐插氨琛屼簡銆備絾鏄紝鍦∕FC绐楀彛涓殑瀹炵幇灏卞緢楹荤儲浜嗐傞鍏堬紝鍦∕FC绐楀彛涓覆鏌揙penGL灏遍渶瑕佹瘮杈冮夯鐑︾殑璁剧疆銆傛墍浠ワ紝闇瑕佸湪璁剧疆OpenGL娓叉煋鐜鐨勬椂鍊欒繘涓姝ュ鐞嗐傚叿浣撶殑鏉ョ湅涓嬮潰涓娈典唬鐮佸惂銆傝繖娈典唬鐮佸氨鏄疢FC绐楀彛鍒涘缓鐨...
  • MFC涓璒penGL鍏ㄥ睆閲囨牱鎶楅敮榻垮け璐
    绛旓細鍏跺疄OpenGL鐨鍏ㄥ睆鎶楅敮榻垮氨鏄紑鍚閲嶉噰鏍枫傚湪浣跨敤glut鐨勬椂鍊欙紝寰堟柟渚垮氨鑳藉疄鐜般傚彧瑕佸惎鐢ㄥ閲嶉噰鏍风紦鍐插氨琛屼簡銆備絾鏄紝鍦∕FC绐楀彛涓殑瀹炵幇灏卞緢楹荤儲浜嗐傞鍏堬紝鍦∕FC绐楀彛涓覆鏌揙penGL灏遍渶瑕佹瘮杈冮夯鐑︾殑璁剧疆銆傛墍浠ワ紝闇瑕佸湪璁剧疆OpenGL娓叉煋鐜鐨勬椂鍊欒繘涓姝ュ鐞嗐傚叿浣撶殑鏉ョ湅涓嬮潰涓娈典唬鐮佸惂銆傝繖娈典唬鐮佸氨鏄疢FC绐楀彛鍒涘缓鐨...
  • MFC涓opengl,濡備綍閫氳繃榧犳爣鎷栧姩鏀瑰彉瑙嗚,鏄敼鍙榞llookat鐨勫弬鏁拌繕鏄棆杞墿...
    绛旓細涓や釜鏂规硶閮藉彲浠ワ紝鏂规硶涓锛歡lRotaef(x,y,z);pushMatrix();drawObject();popMatrix();鍦ㄩ紶鏍嘙ove浜嬩欢涓敼鍙榵,y,z鍊 鏂规硶浜 gllookat(x,y,z,objectx,objecy,objectz,0,1,0)鍦ㄩ紶鏍嘙ove浜嬩欢涓敼鍙榵,y,z鍊硷紝瑕佺敤鍦嗗懆鍑芥暟锛屼互瑙嗙偣瀵硅薄涓轰腑蹇冦
  • 鍩轰簬MFC鐨OpenGL 缂栫▼,濡備綍鍦瀵硅瘽妗嗙殑picture鎺т欢涓鍏3D妯″瀷??_鐧惧害...
    绛旓細涓哄暐瑕佹斁鍦╬icture鎺т欢涓傘傘傚彲浠ュ垎涓轰袱姝ュ幓鏌ュ銆1.濡備綍鍦∕FC涓浣跨敤OPENGL 2.濡備綍鐢∣PENGL鏄剧ず3DS妯″瀷銆傝繖涓や釜鍦ㄧ綉涓婇兘鑳芥壘鍒帮紝绁濅綘鎴愬姛銆
  • 濡備綍鍦∕FC椤圭洰涓疄鏃跺垱寤轰竴涓獥鍙e苟鍦ㄥ叾涓opengl缁樺浘鏄剧ず
    绛旓細鐐瑰嚮鑿滃崟鍚庡湪鑿滃崟娑堟伅鍑芥暟閲岄潰鍒涘缓鏃犳ā寮忓璇濇锛岀劧鍚庡湪瀵硅瘽妗嗛噷闈㈢粯鍥俱
  • opengl mfc 姹傚姪姹傚姪姹傚姪!!!
    绛旓細swapbuffer鐩存帴鐢hdc鐪嬬湅锛屼笉琛岀殑璇濆紑濮嬬殑鏃剁敤鍏ㄥ眬鐨刧etdc淇濆瓨hdc锛歨dc=::GetDC(pwnd);
  • 澶х璇疯繘!濡傚浘鎵绀烘槸鍦∕FC涓鐨刅iew瑙嗗浘涓覆鏌OpenGL瑙嗗満,鏄剧ず涓涓ā鍨...
    绛旓細鏂囨湰杈撳嚭鑳屾櫙妯″紡璁句负閫忔槑鍗冲彲
  • 扩展阅读:ai自动生成ppt的网站 ... openai免费 ... ai生成ppt网址免费 ... oc引导卡在machreboot ... openai官网apikey收费 ... open ai终止中国服务 ... 抑郁自评量表免费测试 ... 进pe看不到m2固态硬盘 ... openai chatgpt ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网