版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、opengl作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥 windows 的界面上的功能. 下面介绍如何在 vc+ 上进行 opengl 编程。 opengl 绘图的一般过程可以看作这样的,先用 opengl 语句在 opengl 的绘图环境 rendercontext (rc)中画好图, 然后再通过一个 swap buffer 的过程把图传给操作系统的绘图环境 devicecontext (dc)中,实实在在地画出到屏幕上. 下面以画一条 bezier
2、 曲线为例,详细介绍vc+ 上 opengl编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个 opengl 平台上的图形来。 一、产生程序框架 test.dsw new project | mfc application wizard (exe) | test | ok *注* : 加“”者指要手工敲入的字串 二、导入 bezier 曲线类的文件 用下面方法产生 beziercurve.h beziercurve.cpp 两个文件: workspace | classview | test classes| new class | generi
3、c 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 工作环境:(下面各个操作,均
4、针对 testview.cpp ) 1. 处理 precreatewindow(): 设置 opengl 绘图窗口的风格 cs.style |= ws_clipsiblings | ws_clipchildren | cs_owndc; 2. 处理 oncreate():创建 opengl 的绘图设备。 opengl 绘图的机制是: 先用 opengl 的绘图上下文 rendering context (简称为 rc )把图画好,再把所绘结果通过 swapbuffer() 函数传给 window 的 绘图上下文 device context (简记为 dc).要注意的是,程序运行过程中,可以有
5、多个 dc,但只能有一个 rc。因此当一个 dc 画完图后,要立即释放 rc,以便其它的 dc 也使用。在后面的代码中,将有详细注释。 int ctestview:oncreate(lpcreatestruct lpcreatestruct) if (cview:oncreate(lpcreatestruct) = -1) return -1; myinitopengl(); return 0; void ctestview:myinitopengl() m_pdc = new cclientdc(this); /创建 dc assert(m_pdc != null); if (!mysetu
6、ppixelformat() /设定绘图的位图格式,函数下面列出 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:mysetuppixelformat() /我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式 static pixelformatdescriptor pfd = sizeof(pixelfo
7、rmatdescriptor), / 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 0, / no alpha buffer 0, / shift bit ignor
8、ed 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(
9、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_pdc-m_hdc,null); /释放与m_hdc 对应的 rc wgldeletecontext(m_hrc); /删除 rc if (m_pdc
10、) 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); /把这句话注释掉,若不然,window /会用白色北景来刷新,导致画面闪烁 return true;/只要空返回即可。 5. 处理 ondraw() void ctestview:o
11、ndraw(cdc* pdc) wglmakecurrent(m_pdc-m_hdc,m_hrc);/使 rc 与当前 dc 相关联 mydrawscene( ); /具体的绘图函数,在 rc 中绘制 swapbuffers(m_pdc-m_hdc);/把 rc 中所绘传到当前的 dc 上,从而 /在屏幕上显示 wglmakecurrent(m_pdc-m_hdc,null);/释放 rc,以便其它 dc 进行绘图 void ctestview:mydrawscene( ) glclearcolor(0.0f,0.0f,0.0f,1.0f);/设置背景颜色为黑色 glclear(gl_colo
12、r_buffer_bit|gl_depth_buffer_bit); glpushmatrix(); gltranslated(0.0f,0.0f,-3.0f);/把物体沿(0,0,-1)方向平移 /以便投影时可见。因为缺省的视点在(0,0,0),只有移开 /物体才能可见。 /本例是为了演示平面 bezier 曲线的,只要作一个旋转 /变换,可更清楚的看到其 3d 效果。 /下面画一条 bezier 曲线 bezier_curve.mypolygon();/画bezier曲线的控制多边形 bezier_curve.mydraw(); /cbeziercurve bezier_curve /是
13、ctestview 的成员变量 /具体的函数见附录 glpopmatrix(); glflush(); /结束 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_hrc);/确认rc与当前dc关联 w=cx; h=cy; verify(wglmakecurrent(null,null);/确认dc释放rc 7 处理 onlbuttondown() void c
14、testview:onlbuttondown(uint nflags, cpoint point) cview:onlbuttondown(nflags, point); if(bezier_curve.m_nmax-1) messagebox(顶点个数超过了最大数max=50); return; /以下为坐标变换作准备 getclientrect(&m_clientrect);/获取视口区域大小 w=m_clientrect.right-m_clientrect.left;/视口宽度 w h=m_clientrect.bottom-m_clientrect.top;/视口高度 h /w,h
15、是ctestview的成员变量 centerx=(m_clientrect.left+m_clientrect.right)/2;/中心位置, centery=(m_clientrect.top+m_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;/
16、加一个顶点 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) 附录: 1.cbeziercurve 的声明: (beziercurve.h) class cbeziercurve public: mypoint
17、2d m_vertexmax;/控制顶点,以数组存储 /mypoint2d 是一个存二维点的结构 /成员为gldouble x,y int m_n; /控制顶点的个数 public: cbeziercurve(); virtual cbeziercurve(); void bezier_generation(mypoint2d pmax,int level); /算法的具体实现 void mydraw();/画曲线函数 void mypolygon(); /画控制多边形 ; 2. cbeziercurve 的实现: (beziercurve.cpp) cbeziercurve:cbezierc
18、urve() 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); void cbeziercurve:bezier_generation(mypoint2d pma
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026黑龙江大庆市让胡路区区属学校人才引进60人建设考试参考题库及答案解析
- 2026重庆医科大学附属大学城医院妇产科全职博士后招聘建设笔试备考题库及答案解析
- 中国葛洲坝集团建设工程有限公司2026届校园招聘建设笔试备考试题及答案解析
- 2026吉林延边州延吉市建工社区卫生服务中心招聘中药师1人建设笔试模拟试题及答案解析
- 2026上半年广东肇庆市卫生健康系统事业单位招聘医护人员93人(编制)建设笔试模拟试题及答案解析
- 2026四川凉山州西昌市北城社区卫生服务中心招聘1人建设考试备考题库及答案解析
- 2026福建厦门市集美职业技术学校顶岗教师招聘1人建设考试参考试题及答案解析
- 2026上海市同济大学马克思主义学院专职教师招聘建设考试参考题库及答案解析
- 2026广西南宁经济技术开发区第一初级中学春季数学教师招聘1人建设考试参考试题及答案解析
- 2026年宁德市蕉城区教育局补充招聘紧缺急需人才6人(三)建设笔试备考题库及答案解析
- IE工业工程改善培训课件
- 基于单片机的SPWM逆变电源设计
- 咬合桩等效地连墙计算-MRH
- 校园零星维修服务 投标方案
- 体育考研《运动生理学》王瑞元版备考复习题库(核心题)
- 整县屋顶分布式光伏项目吊装方案
- 表面工程复合电镀
- GB/T 8424.2-2001纺织品色牢度试验相对白度的仪器评定方法
- 劳务派遣服务方案
- 硬笔书法全册教案共20课时
- 住院病历-电子-模板-大全精
评论
0/150
提交评论