ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:19.67KB ,
资源ID:6794976      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6794976.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(MFC+OpenGL 编程入门.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

MFC+OpenGL 编程入门.docx

1、MFC+OpenGL 编程入门标 题: MFC+OpenGL 编程入门发信人: qhchen (老道 ), 信区: VR_3D 发信站: BBS 水木清华站 (Mon Aug 9 17:55:55 1999) MFC+OpenGL 编程入门 1998-09-08 中国科技大学数学系计算专业 老道 E-mail: qhchen OpenGL 作图非常方便,故日益流行,但对许多人来说,是在微机上 进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步, 虽然也是最初级的。 下面介绍如何在 VC+ 上进行 OpenGL 编程。其实相当简单明快,只 因国内缺少这方面的资料与例子,致使许多小细

2、节要一个一个地试,耗去 大量时间。希望各位有什么心得体会,也公布出来,从而节省每个人都要 试试的时间。 言归正传,下面以画一条 Bezier 曲线为例,详细介绍VC+ 上 OpenGL 编程的方法。这里实际上也给出了个 C+ 良好封装性编程的范例。文中给 出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺 利地画出第一个 OpenGL 平台上的图形来。 (本文例子以VC+ 5.0 为背景) 一、产生程序框架 Test.dsw New Project | MFC Application Wizard (EXE) | Test | OK *注* : 加“”者指要手工敲入的字串 二、

3、导入 Bezier 曲线类的文件。用下面方法产生 BezierCurve.h BezierCurve.cpp 两个文件: 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. 在集成环境中

4、,Project | Settings | Link | Object/library module | opengl32.lib glu32.lib glaux.lib | OK 五、设置 OpenGL 工作环境:(下面各个操作,均针对 TestView.cpp ) 1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格 cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC; 2. 处理 OnCreate():创建 OpenGL 的绘图设备。 OpenGL 绘图的机制 是: 先用 OpenGL 的绘图上

5、下文 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

6、(); return 0; void CTestView:Init() m_pDC = new CClientDC(this); /创建 DC 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 CTes

7、tView: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,

8、 0, 0, 0, 0, / color bits ignored 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;

9、 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); return FALSE; return TRUE; 3. 处理 OnDestroy() void CTestView:OnDestroy() wglMakeCurrent(m_

10、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) / TODO: Add your message handler code here and/or call default / return CView:OnEraseBkgnd(pDC);/把这句话注释掉,若不然,Wind

11、ow /会用白色北景来刷新,导致画面闪烁 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:Dra

12、wScene( ) 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 轴转 3

13、0 度 / 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); glVertex3f(0,0,0); glVertex3f(0,0,1);/坐标 glEnd();/end draw the 3D axis /下面画一条 Bezie

14、r 曲线 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); VERIFY(wglMakeCurrent(m_pDC-m_hDC,m

15、_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(); /重新进行投影变换

16、 gluPerspective (20.0f, (GLdouble)w/(GLdouble)h, 1.0, 40.0f); glMatrixMode(GL_MODELVIEW);/结束投影变换 glLoadIdentity(); 7 处理 OnLButtonDown() void CTestView:OnLButtonDown(UINT nFlags, CPoint point) CView:OnLButtonDown(nFlags, point); if(bezier_curve.m_NMAX-1) MessageBox(顶点个数超过了最大数MAX=50); return; /以下为坐标变换

17、作准备, /说明: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

18、_ClientRect.bottom)/2;/取之作原点 /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,TR

19、UE);/发送刷新重绘消息 double CTestView:scrx2glx(int scrx) /可能有毛病,因为点到的位置总 /总画不到,望指正 return (double)(scrx-centerx)/double(h); double CTestView:scry2gly(int scry) return (double)(centery-scry)/double(h); 附录: 1.CBezierCurve 的声明: (BezierCurve.h) class CBezierCurve public: CBezierCurve(); virtual CBezierCurve();

20、 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) CBezierCurve:CBezierCurve() m_N=4; m_Vertex0.x=-0.5f;

21、 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); void CBezierCurve:bezier_generation(myPOINT2D PMAX, int level) /算法的具体描述,请参考相关书本

22、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+) 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); 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();/结束画连线段 *本文结束* -

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1