MFC框架下三维场景的绘制与交互控制-4页文档资料

MFC框架下三维场景的绘制与交互控制
1 创建项目
在VC环境下用OpenGL函数库绘制图像,需要在VC里导入OpenGL的头文件、静态链接文件等。将glut.h放到...Microsoft Visual StudioVC98IncludeGL目录下,将glut32.lib放到...Microsoft Visual StudioVC98Lib目录下,将glut32.dll放到X:windowssystom32目录下。
创建项目,基于OpenGL的三维图形的绘制可以在MFC的对话框下进行绘制,也可以在单文档中进行绘制,本课题采取在单文档模式下进行三维图形的绘制。创建一个MFC SDI应用程序,在项目属性中加入所需要链接的库文件。
2 系统初始化
(1)打开ClassWizard,选择CtestballView类,为下述消息加入消息处理函数:WM_CREATE, WM_DESTROY, WM_SIZE,WM_ERASEBACKGROUND。其中OnSize中的glMatrixMode是用来设置矩阵模式的,它有三个选项:GL_MODELVIEW、GL_PROJECTION、 GL_TEXTURE。GL_MODELVIEW表示从实体坐标系转到人眼坐标系。GL_PROJECTION表示从人眼坐标系转到剪裁坐标系。 GL_TEXTURE表示从定义纹理的坐标系到粘贴纹理的坐标系的变换。
要使三维物体显得更流畅,前后各面的空间关系正确,一定得使用Z 缓冲技术。否则,前后各面的位置就会相互重叠,不能正确显示。Z缓冲区存储物体每一个点的值,这个值表明此点离人眼的距离。Z缓冲需要占用大量的内存和CPU时间。启用Z缓冲只需在OnSize()的最后加上glEnable (GL_DEPTH_TEST)。应当注意的是,在每次重绘之前,应使用
glClear(GL_DEPTH_BUFFER_BIT)语句清空Z缓冲区。
(2)在窗口创建之前我们必须设置窗口风格,从而避免OpenGL绘制到其他窗口中去。这些应该放在PreCreateWindow()中。OpenGL需要窗口加上WS_CLIPCHILDREN(创建父窗口使用的Windows风格,用于重绘时裁剪子窗口所覆盖的区域)和 WS_CLIPSIBLINGS(创建子窗口使用的Windows 风格,用于重绘时剪裁其他子窗口所覆盖的区域)风格。
3 数据载入
在testballView.cpp文件中声明绘制地球函数void
立体剪裁DrawPlanet(Planet planet)、初始化函数void init(void),初始化地球参数函数void InitPlanets()及BOOL RenderScene()、BOOL SetupPixelFormat(void)、void SetLogicalPalette(void)和BOOL InitializeOpenGL(CDC* pDC)函数。声明绘制描述表m_hRC成员变量、m_hPalette调板成员变量及设备描述表m_pDC成员变量。
4 模型建立及属性设置
4.1 建立场景空间模型
定义Planet和GlobalPosition结构体。用于定义与三维球体有关的一些参数。如球体的大小,在视窗区中的位置,与X、Y轴的相应夹角。
编写绘制三维球体的函数DrawPlanet。在DrawPlanets中调用DrawPlanet函数可实现绘制多个不同的球体。其中,在InitPlanets函数中初始化所要绘制球体的相关参数。
4.2 光照及材质属性设置
为了让所绘制的球体更具有真实感,需要绘制光源,通过光源所产生
的明暗不同的效果,让球体呈现出立体的感觉。设置GL_LIGHT1和
GL_LIGHT2两个光源, GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR、
GL_POSITION分别定义光源的周围颜强度、光源的散射强度、光源的镜面反射强度和光源的位置。运行效果如图1所示。
4.3 纹理映射
现实的物体表面往往有各种纹理,因此要绘制逼真的三维物体,除了对物体进行光照处理外,还需要加上纹理贴图,使物体看起来更真实。定义load_texture和LoadTextures函数实现纹理映射,效果如图2所示。
5 交互设计
为了方便用户和系统进行交流,需要设计交互技术。让用户通过鼠标和键盘与系统进行交互。我们采用了MFC中的消息响应函数,通过鼠标与键盘的点击,对所绘制的球体进行拖动旋转、缩放、平移等操作,以此实现此功能。打开ClassWizard,如图3所示。
图3 打开类向导
分别添加WM_KEYDOWN、WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE 等消息响应函数,并添加相应代码。其中,WM_KEYDOWN函数用于对所绘制的球体进行缩放和平移操作。而WM_LBUTTONDOWN和WM_LBUTTONUP函数用于获取鼠标在视窗区点击时的坐标,以便于稍后计算球体被拖动时的旋转角度。
6 结束语
本系统为在MFC框架下基于OpenGL的三维场景绘制,实现了对所绘制的三维场景的旋转、平移、缩放、鼠标拖动旋转等功能。文中详细介绍
了本系统开发的过程,并在VC++开发环境下实现了相应功能。
希望以上资料对你有所帮助,附励志名言3条::
1、世事忙忙如水流,休将名利挂心头。粗茶淡饭随缘过,富贵荣华莫强求。
2、“我欲”是贫穷的标志。事能常足,心常惬,人到无求品自高。
3、人生至恶是善谈人过;人生至愚恶闻己过。

本文发布于:2024-09-22 04:30:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/376622.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:绘制   需要   进行
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议