欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    MFC+OpenGL_编程入门.pdf

    • 资源ID:70344056       资源大小:150.71KB        全文页数:18页
    • 资源格式: PDF        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    MFC+OpenGL_编程入门.pdf

    科研导航http:/ MFC+OpenGL 编程入门编程入门 OpenGL 作图非常方便,故日益流行,但对许多人来说,是在微机上 进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。下面介绍如何在 VC+上进行 OpenGL 编程。其实相当简单明快,只 因国内缺少这方面的资料与例子,致使许多小细节要一个一个地试,耗去 大量时间。希望各位有什么心得体会,也公布出来,从而节省每个人都要 试试的时间。言归正传,下面以画一条 Bezier 曲线为例,详细介绍 VC+上 OpenGL 编程的方法。这里实际上也给出了个 C+良好封装性编程的范例。文中给 出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺 利地画出第一个 OpenGL 平台上的图形来。(本文例子以 VC+5.0 为背景)一、产生程序框架 Test.dsw New Project|MFC Application Wizard(EXE)|Test|OK *注*:加“”者指要手工敲入的字串 二、导入 Bezier 曲线类的文件。用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件:科研导航http:/ WorkSpace|ClassView|Test Classes|New Class|Generic Class(不用 MFC 类)|CBezierCurve|OK 三、编辑好 Bezier 曲线类的定义与实现。写好下面两个文件:BezierCurve.h BezierCurve.cpp 四、设置编译环境:1.在 BezierCurve.h 和 TestView.h 内各加上:#include#include#include 2.在集成环境中,Project|Settings|Link|Object/library module|opengl32.lib glu32.lib glaux.lib|OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp)1.处理 PreCreateWindow():设置 OpenGL 绘图窗口的风格 科研导航http:/ cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN|CS_OWNDC;2.处理 OnCreate():创建 OpenGL 的绘图设备。OpenGL 绘图的机制 是:先用 OpenGL 的绘图上下文 Rendering Context(简称为 RC)把图画好,再把所绘结果通过 SwapBuffer()函数传给 Window 的 绘图上下文 Device Context(简记为 DC).要注意的是,程序运行 过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图 后,要立即释放 RC,以便其它的 DC 也使用。在后面的代码中,将有 详细注释。int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CView:OnCreate(lpCreateStruct)=-1)return-1;Init();return 0;void CTestView:Init()m_pDC=new CClientDC(this);/创建 DC 科研导航http:/ ASSERT(m_pDC!=NULL);if(!bSetupPixelFormat()/设定绘图的位图格式,函数下面列出 return;m_hRC=wglCreateContext(m_pDC-m_hDC);/创建 RC wglMakeCurrent(m_pDC-m_hDC,m_hRC);/RC 与当前 DC 相关联 /CClient*m_pDC;HGLRC m_hRC;是 CTestView 的成员变量 BOOL CTestView:bSetupPixelFormat()static PIXELFORMATDESCRIPTOR pfd=sizeof(PIXELFORMATDESCRIPTOR),/size of this pfd 1,/version number PFD_DRAW_TO_WINDOW|/support window PFD_SUPPORT_OPENGL|/support OpenGL PFD_DOUBLEBUFFER,/double buffered PFD_TYPE_RGBA,/RGBA type 24,/24-bit color depth 0,0,0,0,0,0,/color bits ignored 科研导航http:/ 0,/no alpha buffer 0,/shift bit ignored 0,/no accumulation buffer 0,0,0,0,/accum bits ignored 32,/32-bit z-buffer 0,/no stencil buffer 0,/no auxiliary buffer PFD_MAIN_PLANE,/main layer 0,/reserved 0,0,0 /layer masks ignored ;int pixelformat;if(pixelformat=ChoosePixelFormat(m_pDC-m_hDC,&pfd)=0)MessageBox(ChoosePixelFormat failed);return FALSE;if(SetPixelFormat(m_pDC-m_hDC,pixelformat,&pfd)=FALSE)MessageBox(SetPixelFormat failed);科研导航http:/ return FALSE;return TRUE;3.处理 OnDestroy()void CTestView:OnDestroy()wglMakeCurrent(m_pDC-m_hDC,NULL);/释放与 m_hDC 对应的 RC wglDeleteContext(m_hRC);/删除 RC if(m_pDC)delete m_pDC;/删除当前 View 拥有的 DC CView:OnDestroy();4.处理 OnEraseBkgnd()BOOL CTestView:OnEraseBkgnd(CDC*pDC)科研导航http:/ /TODO:Add your message handler code here and/or call default /return CView:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Window /会用白色北景来刷新,导致画面闪烁 return TRUE;/只要空返回即可。5.处理 OnDraw()void CTestView:OnDraw(CDC*pDC)wglMakeCurrent(m_pDC-m_hDC,m_hRC);/使 RC 与当前 DC 相关联 DrawScene();/具体的绘图函数,在 RC 中绘制 SwapBuffers(m_pDC-m_hDC);/把 RC 中所绘传到当前的 DC 上,从而 /在屏幕上显示 wglMakeCurrent(m_pDC-m_hDC,NULL);/释放 RC,以便其它 DC 进行绘图 void CTestView:DrawScene()科研导航http:/ glClearColor(0.0f,0.0f,0.0f,1.0f);/设置背景颜色为黑色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glPushMatrix();glTranslated(0.0f,0.0f,-3.0f);/把物体沿(0,0,-1)方向平移 /以便投影时可见。因为缺省的视点在(0,0,0),只有移开 /物体才能可见。/本例是为了演示平面 Bezier 曲线的,只要作一个旋转 /变换,可更清楚的看到其 3D 效果。/如?glRotated(30,1.0f,0.0f,0.0f);/绕 X 轴转 30 度 /glRotated(30,0.0f,1.0f,0.0f);/绕 Y 轴转 30 度 glBegin(GL_LINES);/画坐标系,由三条线段组成 glColor3f(1,0,0);glVertex3f(0,0,0);glVertex3f(1,0,0);/坐标 glColor3f(0,1,0);glVertex3f(0,0,0);glVertex3f(0,1,0);/坐标 glColor3f(0,0,1);科研导航http:/ glVertex3f(0,0,0);glVertex3f(0,0,1);/坐标 glEnd();/end draw the 3D axis /下面画一条 Bezier 曲线 bezier_curve.myPolygon();/画 Bezier 曲线的控制多边形 bezier_curve.myDraw();/CBezierCurve bezier_curve /是 CTestView 的成员变量 /具体的函数见附录 glPopMatrix();glFinish();/结束 RC 绘图 return;6.处理 OnSize()void CTestView:OnSize(UINT nType,int cx,int cy)CView:OnSize(nType,cx,cy);科研导航http:/ VERIFY(wglMakeCurrent(m_pDC-m_hDC,m_hRC);/确认 RC 与当前 DC 关联 GLResize(cx,cy);/具体的响应 WM_SIZE 消息,对投影进行修正 VERIFY(wglMakeCurrent(NULL,NULL);/确认 DC 释放 RC void GLResize(GLsizei w,GLsizei h)/GLResize()是一个全局函数 /Prevent a divide by zero if(h=0)h=1;glViewport(0,0,w,h);/设置视口 glMatrixMode(GL_PROJECTION);/进入投影变换状态 glLoadIdentity();/重新进行投影变换 gluPerspective(20.0f,(GLdouble)w/(GLdouble)h,1.0,40.0f);glMatrixMode(GL_MODELVIEW);/结束投影变换 glLoadIdentity();科研导航http:/ 7 处理 OnLButtonDown()void CTestView:OnLButtonDown(UINT nFlags,CPoint point)CView:OnLButtonDown(nFlags,point);if(bezier_curve.m_NMAX-1)MessageBox(顶点个数超过了最大数 MAX=50);return;/以下为坐标变换作准备,/说明:OpenGL 有一个更有力处理方式,即用 gluUnProject()/这里为了证券交易起见,自己处理。GetClientRect(&m_ClientRect);/获取视口区域大小 w=m_ClientRect.right-m_ClientRect.left;/视口宽度 w h=m_ClientRect.bottom-m_ClientRect.top;/视口高度 h /w,h 是 CTestView 的成员变量 centerx=(m_ClientRect.left+m_ClientRect.right)/2;/中心位置,centery=(m_ClientRect.top+m_ClientRect.bottom)/2;/取之作原点 科研导航http:/ /centerx,centery 是 CTestView 的成员变量 GLdouble tmpx,tmpy;tmpx=scrx2glx(point.x);/屏幕上点坐标转化为 OpenGL 画图的规范坐标 tmpy=scry2gly(point.y);bezier_curve.m_Vertexbezier_curve.m_N.x=tmpx;/加一个顶点 bezier_curve.m_Vertexbezier_curve.m_N.y=tmpy;bezier_curve.m_N+;/顶点数加一 InvalidateRect(NULL,TRUE);/发送刷新重绘消息 double CTestView:scrx2glx(int scrx)/可能有毛病,因为点到的位置总 /总画不到,望指正 return(double)(scrx-centerx)/double(h);double CTestView:scry2gly(int scry)return(double)(centery-scry)/double(h);科研导航http:/ 附录:1.CBezierCurve 的声明:(BezierCurve.h)class CBezierCurve public:CBezierCurve();virtual CBezierCurve();void bezier_generation(myPOINT2D PMAX,int level);/算法的具体实现 void myDraw();/画曲线函数 public:void myPolygon();/画控制多边形 myPOINT2D m_VertexMAX;/控制顶点,以数组存储 /myPOINT2D 是一个存二维点的结构 /成员为 Gldouble x,y int m_N;/控制顶点的个数 ;2.CBezierCurve 的实现:(BezierCurve.cpp)科研导航http:/ CBezierCurve:CBezierCurve()m_N=4;m_Vertex0.x=-0.5f;m_Vertex0.y=-0.5f;m_Vertex1.x=-0.5f;m_Vertex1.y=0.5f;m_Vertex2.x=0.5f;m_Vertex2.y=0.5f;m_Vertex3.x=0.5f;m_Vertex3.y=-0.5f;CBezierCurve:CBezierCurve()void CBezierCurve:myDraw()bezier_generation(m_Vertex,LEVEL);科研导航http:/ void CBezierCurve:bezier_generation(myPOINT2D PMAX,int level)/算法的具体描述,请参考相关书本 int i,j;level-;if(level0)return;if(level=0)/不要写成 level=0!glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINES);/画出线段 glVertex2d(P0.x,P0.y);glVertex2d(Pm_N-1.x,Pm_N-1.y);glEnd();/结束画线段 return;/递归到了最底层,跳出递归 myPOINT2D QMAX,RMAX;for(i=0;im_N;i+)科研导航http:/ Qi.x=Pi.x;Qi.y=Pi.y;for(i=1;i=i;j-)Qj.x=(Qj-1.x+Qj.x)/double(2);Qj.y=(Qj-1.y+Qj.y)/double(2);R0.x=Qm_N-1.x;R0.y=Qm_N-1.y;bezier_generation(Q,level);科研导航http:/ bezier_generation(R,level);void CBezierCurve:myPolygon()glBegin(GL_LINE_STRIP);/画出连线段 glColor3f(0.2f,0.4f,0.4f);for(int i=0;im_N;i+)glVertex2d(m_Vertexi.x,m_Vertexi.y);glEnd();/结束画连线段 *本文结束*-科研导航http:/ 平生不见陈近南,便称英雄亦惘然

    注意事项

    本文(MFC+OpenGL_编程入门.pdf)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开