QQ登录

只需一步,快速开始

145上位机VC MFC使用OPenGL绘制三维NURBS曲线

[ 复制链接 ]

145上位机VC MFC使用OPenGL绘制三维NURBS曲线

145上位机VC MFC使用OPenGL绘制三维NURBS曲线

145上位机VC MFC使用OPenGL绘制三维NURBS曲线


功能展示

OPenGL可以很方便的绘制三维方面的动画,我们当前使用实现OPenGL环境的初始化,并绘制一个 三维NURBS曲线,效果如图;
要点提示
使用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才能更好显示效果;
绘制三维NURBS曲线主要用到函数有:gluBeginSurface()gluNurbsSurface() gluEndSurface();gluNewNurbsRenderer()生成对象;





实现功能
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,                                    //
  16.         0,      0,                              //
  17.         PFD_MAIN_PLANE,                 //
  18.         0,                              //
  19.         0, 0, 0                         //
  20.     };
  21.         
复制代码
  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. void CGkbc8Dlg::OnDestroy()
  11. {
  12.         wglDeleteContext(m_hOpenglRC);
  13.         CDialog::OnDestroy();
  14. <div style="text-align: center;"><span style="line-height: 1.5;"><font size="4">}</font></span></div>
复制代码
在OnPaint()函数中绘制在OnSize()调整大小
  1. void CGkbc8Dlg::OnSize(UINT nType, int cx, int cy)
  2. {
  3.         CDialog::OnSize(nType, cx, cy);
  4.         
  5.         if ( 0 >= cx || 0 >= cy )
  6.         {
  7.                 return;
  8.         }

  9.         ::glViewport(0,0,cx,cy);
  10.         ::glMatrixMode(GL_PROJECTION);
  11.     ::glLoadIdentity();
  12.         GLdouble dblaspect = (GLdouble)cx/(GLdouble)cy;
  13.         ::gluPerspective(40.0f,dblaspect,.1f, 20.0f);
  14.         ::glMatrixMode(GL_MODELVIEW);
  15.     ::glLoadIdentity();
  16.         ::glTranslatef(0.0f,0.0f,-5.0f);
  17.         ::glRotatef(20.0f, 1.0f, 0.0f, 0.0f);
  18. }
复制代码
  1. //<>
  2.         GLUnurbsObj *nurb;
  3.         GLfloat point[4][4][3];


  4.         GLfloat diffuse[]={0.88,0.66,0.22,1.0};
  5.         GLfloat specular[]={0.92,0.9,0.0,1.0};
  6.         GLfloat shininess[]={80.0};

  7.         glClearColor(0.0,0.0,0.0,1.0);
  8.         glMaterialfv(GL_FRONT,GL_DIFFUSE,diffuse);
  9.         glMaterialfv(GL_FRONT,GL_SPECULAR,specular);
  10.         glMaterialfv(GL_FRONT,GL_SHININESS,shininess);

  11.         glEnable(GL_LIGHTING);
  12.         glEnable(GL_LIGHT0);
  13.         glDepthFunc(GL_LESS);
  14.         glEnable(GL_DEPTH_TEST);
  15.         glEnable(GL_AUTO_NORMAL);
  16.         glEnable(GL_NORMALIZE);
  17. nt u, v;
  18.         for (u=0;u<4;u++)
  19.         {
  20.                 for(v=0;v<4;v++)
  21.                 {
  22.                         point[u][v][0]=2.0*((GLfloat)u-1.5);
  23.                         point[u][v][1]=2.0*((GLfloat)v-1.5);

  24.                         if((u==1||u==2)&&(v==1||v==2))
  25.                         point[u][v][2]=3.0;
  26.                         else
  27.                         point[u][v][2]=-3.0;
  28.                 }
  29.         }
  30.         nurb=gluNewNurbsRenderer();
  31.         gluNurbsProperty(nurb,GLU_SAMPLING_TOLERANCE,25.0);
  32.         gluNurbsProperty(nurb,GLU_DISPLAY_MODE,GLU_FILL);

  33.         GLfloat knots[8]={0.0,0.0,0.0,0.0,1.0,1.0,1.0,1.0};
复制代码
  1. glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  2.         glPushMatrix();
  3.         glRotatef(330.0,1.0,0.0,0.0);
  4.         glScalef(0.5,0.5,0.5);

  5.         gluBeginSurface(nurb);
  6.         gluNurbsSurface(nurb,
  7.     8,
  8.     knots,
  9.     8,
  10.     knots,
  11.     4*3,
  12.     3,
  13.     &point[0][0][0],
  14.     4,4,
  15.     GL_MAP2_VERTEX_3);
  16.         gluEndSurface(nurb);

  17.         glPopMatrix();
  18.         glFlush();

  19.         if(FALSE==::SwapBuffers(GetDC()->m_hDC))
  20.                 AfxMessageBox("交换缓冲区失败");
复制代码
我们来演示下功能实现的整个过程
请点击此处下载

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

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

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

  

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

  

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

  

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


回复

使用道具 举报

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