QQ登录

只需一步,快速开始

143上位机VC MFC使用OPenGL绘制三维茶壶

[ 复制链接 ]

143上位机VC MFC使用OPenGL绘制三维茶壶

143上位机VC MFC使用OPenGL绘制三维茶壶

143上位机VC MFC使用OPenGL绘制三维茶壶


功能展示

OPenGL可以很方便的绘制三维方面的动画,我们当前使用实现OPenGL环境的初始化,并绘制一个三维的带纹理的水壶,效果如图,刷新窗口,水壶会旋转一定角度 ;
要点提示
使用OPENGL前得向工程加载它的静态文件及所在的头文件,通过 我们例程中几行代码便可#include"gl\gl.h“ #include "gl\glu.h“ #include "gl\glaux.h"#pragmacomment(lib,"opengl32.lib")#pragmacomment(lib,"glu32.lib") #pragma comment(lib,"glaux.lib")

另外窗口得具备属性WS_CLIPSIBLINGS |WS_CLIPCHILDREN才能更好显示效果;
使用OPENGL画动画的过程 是ChoosePixelFormat()选择像素格式再通过SetPixelFormat()进行设置; wglCreateContext()创建设备上下文; wglMakeCurrent()设置上下文; glViewport()设置浏览视图的大小
glMatrixMode()设置矩阵模式; gluPerspective()设置透视坐标; glRotatef()设置观看坐标; glPushMatrix()数据入栈操作, glPopMatrix()数据出栈操作; SwapBuffers()交换缓存内容;可以  glPushMatrix ();   glPopMatrix ();之间绘制动画;
实现功能
1.新建基于对话框的应用程序
2.初始化OPENGL环境,在主对话框头文件添加#include "gl\gl.h"
#include "gl\glu.h“ #include"gl\glaux.h"#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib") #pragmacomment(lib,"glaux.lib")

3.添加变量HGLRC m_hOpenglRC; 变量在OnInitDialog()初始化,在OnDestroy()销毁
  1. ModifyStyle(0,WS_CLIPSIBLINGS | WS_CLIPCHILDREN,0);//设置窗口属性;
  2.         static PIXELFORMATDESCRIPTOR pfd =
  3.         {
  4.         sizeof(PIXELFORMATDESCRIPTOR),  //
  5.         1,                              //
  6.         PFD_DRAW_TO_WINDOW |            //
  7.           PFD_SUPPORT_OPENGL |          //
  8.           PFD_DOUBLEBUFFER,             //
  9.         PFD_TYPE_RGBA,                  //
  10.         24,                             //
  11.         0, 0, 0, 0, 0, 0,               //
  12.         0,                              //
  13.         0,                              //
  14.         0,                              //
  15.         0, 0, 0, 0,       16, 0, 0,                              //
  16.         PFD_MAIN_PLANE,    0,                              //
  17.         0, 0, 0                         //
  18.     };
复制代码
  1. int pixelformat=::ChoosePixelFormat(GetDC()->m_hDC,&pfd);
  2.         if(pixelformat==0)
  3.         {
  4.                 AfxMessageBox("初始化失败");
  5.                 return -1;
  6.         }
  7.         SetPixelFormat(GetDC()->m_hDC,pixelformat,&pfd);
  8.         m_hOpenglRC=wglCreateContext(GetDC()->m_hDC);
  9.         wglMakeCurrent(GetDC()->m_hDC,m_hOpenglRC);
  10.         glClearColor (0.0, 0.0, 0.0, 0.0);
  11.         int j;
  12.         for (j = 0; j < 64; j++)
  13.         {
  14.                 stripeImage[3*j] = 255;
  15.                 stripeImage[3*j+1] =255-2*j;
  16.                 stripeImage[3*j+2] =255;
  17.         }
  18.         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  19.         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  20.         glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  21.         glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  22.         glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  23.         glTexImage1D(GL_TEXTURE_1D, 0, 3,64, 0, GL_RGB, GL_UNSIGNED_BYTE, stripeImage);
  24.         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
  25.         glTexGenfv(GL_S, GL_OBJECT_PLANE, sgenparams);
  26.         glEnable(GL_DEPTH_TEST);
  27.         glDepthFunc(GL_LESS);
  28.         glEnable(GL_TEXTURE_GEN_S);
  29.         glEnable(GL_TEXTURE_1D);
  30.         glEnable(GL_CULL_FACE);
  31.         glEnable(GL_LIGHTING);
  32.         glEnable(GL_LIGHT0);
  33.         glEnable(GL_AUTO_NORMAL);
  34.         glEnable(GL_NORMALIZE);
  35.         glFrontFace(GL_CW);
  36.         glCullFace(GL_BACK);
  37.         glMaterialf (GL_FRONT, GL_SHININESS, 64.0);
复制代码
  1. void CGkbc8Dlg::OnDestroy()
  2. {
  3.         wglDeleteContext(m_hOpenglRC);
  4.         CDialog::OnDestroy();
  5. }
  6. 在OnPaint() 函数中绘制在OnSize()调整大小
  7. static GLfloat  xangle = 15.0f;
  8.         static GLfloat  yangle = 10.0f;
  9.         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  10.         glPushMatrix ();
  11.         glTranslatef(0.0f, 0.0f, -8.0);
  12.         glRotatef(xangle, yangle, yangle, 0.0f);
  13.         xangle+= 10.0f;
  14.         yangle+=10.0f;
  15.         auxSolidTeapot(2.5);
  16.         glPopMatrix ();
  17.         glFlush();
  18.         if(FALSE==::SwapBuffers(GetDC()->m_hDC))
  19.                 AfxMessageBox("交换缓冲区失败");
  20.         if ( 0 >= cx || 0 >= cy )
  21.         {
  22.                 return;
  23.         }
  24.         ::glViewport(0,0,cx,cy);
  25.         ::glMatrixMode(GL_PROJECTION);
  26.     ::glLoadIdentity();
  27.         GLdouble dblaspect = (GLdouble)cx/(GLdouble)cy;
  28.         ::gluPerspective(40.0f,dblaspect,0.1f,60.0f);
  29.         ::glMatrixMode(GL_MODELVIEW);
  30.     ::glLoadIdentity();
  31.         ::glTranslatef(0.0f,0.0f,-5.0f);
  32.         ::glRotatef(20.0f, 10.0f, 0.0f, 0.0f);
复制代码
我们来演示下功能实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:143.上位机VC MFC使用OPenGL绘制三维茶壶.rar 
文件大小:132.79 KB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!




回复

使用道具 举报

快速回复 返回列表 客服中心 搜索