基于OpenGL的三维图形绘制实验
基于OpenGL的三维图形绘制实验
基于OpenGL的三维图形绘制实验基于OpenGL的三维图形绘制实验⽬录实验题⽬:交互图形程序设计基础实验 (3)1.实验⽬的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运⾏截图 (7)4.实验结果 (7)5.实验体会 (7)实验题⽬:交互图形程序设计基础实验1.实验⽬的1)理解并掌握三维基本图形数据结构表⽰⽅法。
2)掌握编写OpenGL图形程序的基本⽅法.3)掌握OpenGL基本图形表⽰及绘制。
2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验⽬的是掌握图形信息的表⽰、数据的组织,在此基础上基于OpenGL绘制出三维图形。
实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核⼼函数等的使⽤;基本图形的绘制(点、线段、折线、闭合折线、多边形、三⾓形、三⾓扇、三⾓条带、四边形、四边形条带等)及图形属性控制(线宽、颜⾊、线型、填充样式等);对指定的若⼲三维模型进⾏建模、绘制,在⼀个程序框架下实现,提交1次程序,1份实验报告。
2.2 实验任务1、使⽤Visual C++建⽴⼀个单⽂档(SDI)程序,完成OpenGL绘制框架程序的设计。
在此基础上参照提供的资料,定义绘制函数,基于⾃定义的若⼲点坐标与颜⾊,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三⾓形、四边形、三⾓扇、三⾓条带、四边形条带。
2、使⽤1中建⽴的程序框架,完成如下任务:(1)绘制正棱柱(底⾯多变形的边数及⾼度可以通过对话框输⼊)(2)正棱锥(底⾯多变形的边数及⾼度可以通过对话框输⼊)(3)正棱台(底⾯多变形的边数、台⾼、锥⾼可以通过对话框输⼊)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。
加⼊菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输⼊参数,然后绘制。
基于OpenGL 的3D图形绘制
实验二基于OpenGL的3D图形绘制一、实验目的与要求1.学习OpenGL 图形格式、数学原理;2.掌握OpenGL 基本图元的绘制,熟悉曲线、曲面、二次几何体的绘制技术;3.掌握OpenGL 光照、材质、纹理的基本原理;4.掌握基于Win32、Visual C++环境绘制3D 图形绘制原理、过程与步骤。
二、实验仪器与设备1.微型电子计算机80台2.Windows 2000以上版本操作系统80套3.Visual C++ 6.0开发系统80套4.OpenGL 2.0 以上函数库80套三、实验内容与步骤本实验主要做使用图形绘制系统,实现线条,矩形,圆,文本等基本图形的绘制,保存与打开功能。
实验步骤如下。
1.设计流程图图1设计流程图2.关键代码解析2.1基于Win32Conslolevoid background(void){glClearColor(0.0,0.0,0.0,0.0); //设置背景颜色为黑色}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT); //buffer设置为颜色可写glBegin(GL_TRIANGLES); //开始画三角形glShadeModel(GL_SMOOTH); //设置为光滑明暗模式glColor3f(1.0,0.0,0.0); //设置第一个顶点为红色glVertex2f(-1.0,-1.0); //设置第一个顶点的坐标glColor3f(0.0,1.0,0.0); //设置第二个顶点为绿色glVertex2f(0.0,-1.0); //设置第二个顶点的坐标glColor3f(0.0,0.0,1.0); //设置第三个顶点为蓝色glVertex2f(-0.5,1.0); //设置第三个顶点的坐标 glEnd(); //三角形结束glPointSize(5.0f);glBegin(GL_POINTS);glVertex2f(1.0f,-0.5f);glEnd();glLineWidth(3.0f);glBegin(GL_LINES);glColor3f(1.0,0.0,0.0); //设置第一个顶点为红色glVertex2f(0.3f,-1.0f);glColor3f(0.0,1.0,0.0); //设置第二个顶点为绿色glVertex2f(1.3f,-1.0f);glEnd();glBegin(GL_POL YGON); //画五边形glColor3f(1.0,0.0,0.0);glVertex2f(0.0f,0.0f);glColor3f(0.0,1.0,0.0);glVertex2f(1.0f,0.0f);glColor3f(0.0,0.0,1.0);glVertex2f(1.5f,1.0f);glColor3f(1.0,1.0,0.0);glVertex2f(0.5f,1.5f);glColor3f(0.0,0.0,1.0);glVertex2f(-0.5f,1.0f);glEnd(); //五边形结束glFlush(); //强制OpenGL函数运行}void myReshape(GLsizei w,GLsizei h){glViewport(0,0,w,h); //设置视口glMatrixMode(GL_PROJECTION); //指明当前矩阵为GL_PROJECTIONglLoadIdentity(); //将当前矩阵置换为单位阵if(w <= h)gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵 elsegluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);glMatrixMode(GL_MODELVIEW); //指明当前矩阵为GL_MODELVIEW}int main(int argc,char ** argv){/*初始化*/glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,400);glutInitWindowPosition(200,200);/*创建窗口*/glutCreateWindow("OpenGL_Win32Console-1071301211高磊");/*绘制与显示*/background();glutReshapeFunc(myReshape); //注册当前窗口的形状变化回调函数glutDisplayFunc(myDisplay); //注册当前窗口的显示回调函数glutMainLoop(); //进入GLUT事件处理循环return(0);}2.2基于Win32 APIint WINAPI WinMain( HINSTANCE hInstance, //实例HINSTANCE hPrevInstance, // 前一个实例LPSTR lpCmdLine, // 命令行参数int nCmdShow) // 窗口显示状态{MSG msg; // Windowsx 消息结构BOOL done=FALSE; // 用来退出循环的Bool 变量// 创建OpenGL 窗口if (!CreateGLWindow("OpenGL_Win32C-1071301211高磊",640,480,16)){return 0; // 失败退出}while(!done) // 保持循环直到done=TRUE{if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) //有消息在等待吗?{if (msg.message==WM_QUIT) //收到退出消息?{done=TRUE;}else{TranslateMessage(&msg); // 翻译消息DispatchMessage(&msg); // 发送消息}}else // 如果没有消息{// 绘制场景。
基于OpenGL的三维建模实现方法
9:K%$! 中 , 依 次 调 用 ’(D<*PP7*’85QN(R’N5 、 ’(D<*PP7*’85SN5T ,ND+、 ’(D<*PP)*+,*- 、 ’(D<*PP456SN5,ND+ 和 ’(D<*PP456QN(R’N5 函
数 。 其 中 ’(D<*PP7*’85QN(R’N5 和 ’(D456QN(R’N5 函 数 即 是 表 示 开始和结束绘制, ’(D<*PP)*+,*- 则是具体绘制的顶点。 对于复杂的物体, 二次曲面和多边形镶嵌工具的方法往往 可以综合使用。比如在绘制飞机模型时, 飞机上的各个部位都 可以用二次曲面或者多边形来表示。具体的表示形状如下所 示:
9:KFDG6+8HBEL MNEL
() ; BELO 9(D@*IJDG6+8H
这个创建的二次曲面的状态变量并不包含所要绘制的几 何形状。 相反, 它所描述的是如何绘制出这个几何形状, 可以通 过改变二次曲面的状态来定制几何形状的绘制过程。
图! 用二次曲面和复杂多边形绘制的飞机
BC*59: 中的复杂多边形是指凹多边形和内部有孔的多边
)*+,-. 中并未提供建模的高级命令,故直接用 )*+,-. 建模
工作量较大, 所建模型常是经过简化的, 难以再现模型的细节。 针对这些特点,提出了使用专业的建模软件建模,再转化为 为便于比较, 文中的建模 )*+,-. 程序来进行控制的建模方法。 均以飞机为例。
F F 一个三角形
("$"E , ; 67B+/C+D’E "$"E , GHI$"E ) ("$"E , ; 67B+/C+D’E %H$"E , ’"$"E ) (%H$"E , ; 67B+/C+D’E "$"E , ’"$"E )
基于OpenGL的三维动画效果设计与实现
基于OpenGL的三维动画效果设计与实现OpenGL是一种跨平台的图形库,广泛应用于计算机图形学、游戏开发和虚拟现实等领域。
在OpenGL的基础上,可以实现各种精美的三维动画效果,如逼真的光影效果、自然的物理模拟和华丽的特效等。
本文将介绍如何基于OpenGL实现三维动画效果。
一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形库,可以用于开发高性能的3D图形应用程序。
它提供了一套标准的API,程序员可以使用OpenGL库里的函数来绘制各种图形,包括点、线、三角形等。
OpenGL的主要优点是跨平台,程序可以在不同的操作系统和硬件上运行,并且不需要对程序做太多的修改。
二、OpenGL开发环境在开始OpenGL开发之前,需要配置正确的开发环境。
OpenGL的开发环境包括编程语言、OpenGL库、窗口系统和OpenGL的开发工具等。
编程语言:OpenGL支持多种编程语言,如C/C++、Java、Python等。
其中,C/C++是最常用的开发语言,因为它可以直接调用OpenGL的函数库。
OpenGL库:OpenGL库是开发OpenGL程序时必须的工具,它包含了OpenGL 的所有函数和常量。
窗口系统:OpenGL需要一个可视化的窗口系统,用来显示图形界面。
常用的窗口系统有Windows、Linux和MacOS等。
开发工具:开发OpenGL程序需要使用各种IDE和编辑器,如Visual Studio、CodeBlocks和Eclipse等。
三、实现三维动画效果的基础知识1.三维坐标系OpenGL使用右手坐标系表示三维坐标系,其中x轴向右,y轴向上,z轴向外。
2.矩阵变换OpenGL可以通过矩阵变换来实现图形的移动、旋转、缩放等操作。
常用的变换矩阵包括平移矩阵、旋转矩阵和缩放矩阵。
3.光照模型光照模型是OpenGL中重要的概念之一,它用来计算光源对物体的影响。
其中,主要包括光源的位置、光线的颜色和强度等因素。
利用OpenGL绘制三维地形(续)
void keyboard (unsigned char key, int x, int y) {
switch (key) { case 'd': day = (day + 10) % 360; glutPostRedisplay(); break; case 'D': day = (day - 10) % 360; glutPostRedisplay(); break;
void reshape (int w, int h) {
glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); }
glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); }
void display(void) {
glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0);
glPushMatrix(); glutWireSphere(1.0, 20, 16); /* draw sun */ glRotatef ((GLflo(2.0, 0.0, 0.0); glRotatef ((GLfloat) day, 0.0, 1.0, 0.0); glutWireSphere(0.2, 10, 8); /* draw smaller planet */ glPopMatrix(); glutSwapBuffers(); }
基于OpenGL的三维建模与动画设计技术研究
基于OpenGL的三维建模与动画设计技术研究一、引言在当今数字化时代,三维建模与动画设计技术已经成为影视、游戏、虚拟现实等领域不可或缺的重要组成部分。
而OpenGL作为一种跨平台的图形库,被广泛运用于三维建模与动画设计中。
本文将探讨基于OpenGL的三维建模与动画设计技术,包括其原理、应用和未来发展趋势。
二、OpenGL概述OpenGL(Open Graphics Library)是一种用于渲染2D、3D矢量图形的跨平台图形库。
它提供了一系列的函数,可以用来绘制复杂的图形、场景和动画。
OpenGL具有开放源代码、跨平台、高性能等特点,因此被广泛应用于计算机图形学领域。
三、三维建模技术1. 网格建模网格建模是三维建模中最基本的技术之一,它通过顶点、边和面构成的网格结构来描述物体的外观和形状。
在OpenGL中,可以利用顶点缓冲对象(VBO)和索引缓冲对象(IBO)来高效地管理网格数据,实现复杂物体的建模。
2. 着色器编程着色器编程是OpenGL中非常重要的一部分,它可以控制光照、材质、纹理等效果,从而使得渲染出来的图像更加逼真和生动。
顶点着色器和片元着色器是着色器编程中常用的两种着色器类型,它们可以对顶点和像素进行灵活处理。
3. 纹理映射纹理映射是将二维图像映射到三维物体表面上的技术,可以使得物体表面呈现出各种细节和纹理。
在OpenGL中,通过纹理对象和纹理坐标来实现纹理映射,从而增强了三维场景的真实感和视觉效果。
四、三维动画设计技术1. 骨骼动画骨骼动画是一种基于骨骼系统进行变换和插值计算的动画技术,可以使得角色或物体呈现出生动的动作和表情。
在OpenGL中,可以通过骨骼动画算法和插值技术实现复杂的角色动画效果。
2. 关键帧动画关键帧动画是一种基于关键帧设置和插值计算的动画技术,通过在不同关键帧上设置物体的位置、旋转等属性,然后通过插值计算生成中间帧,从而实现流畅自然的动画效果。
在OpenGL中,可以通过关键帧插值算法实现各种复杂的动画效果。
基于OpenGL的三维绘图框架设计
基于OpenGL的三维绘图框架设计随着计算机硬件技术的持续提升,以及三维图形技术的日益成熟和广泛应用,基于OpenGL的三维绘图技术得到了越来越广泛的应用。
作为一种较为通用的三维绘图框架,OpenGL可用于实现各种各样的三维图形应用,如三维游戏、CAD/CAM等。
本文的主要目的是介绍一个基于OpenGL的三维绘图框架的设计方案。
首先,我们需要了解OpenGL的基本概念、运作机制以及常用的API函数。
OpenGL是一种图形库,提供了一系列的API函数,用于实现各种渲染操作,如绘制、材质、光照、纹理、渲染状态等。
除此之外,OpenGL还提供了一系列的扩展API函数,用于实现一些高级的图形效果,如阴影、反射、抗锯齿等。
为了便于使用OpenGL进行三维绘图,我们可以将其封装成一个高层次的API,以简化对OpenGL的操作。
在本文所介绍的三维绘图框架中,我们使用了C++语言,并通过类的方式实现了OpenGL的封装。
具体而言,我们设计了以下几个类:1. Window类:用于创建OpenGL窗口,以及实现基本的事件处理、渲染操作等。
2. Camera类:用于实现摄像机控制,包括相机的位置、朝向、视角等。
3. Shader类:用于加载、编译、链接OpenGL着色器程序,以实现各种图形效果。
4. Mesh类:用于加载、渲染各种三维模型,可支持多种格式,如OBJ、FBX 等。
5. Texture类:用于加载、绑定纹理贴图,以实现各种纹理效果。
通过以上几个类的组合,我们可以实现一个基本的三维绘图框架。
具体而言,在窗口创建完成后,我们可以通过OpenGL的API函数绘制各种几何图形,如球体、立方体、柱体等,或者从外部导入各种三维模型。
同时,我们还可以通过Shader类加载、编译、链接着色器程序,以实现各种图形效果。
例如,我们可以通过顶点着色器将各种几何图形投影到屏幕上,通过片元着色器实现纹理贴图、光照、阴影等效果。
总的来说,基于OpenGL的三维绘图框架具有以下优点:1. 灵活性高:OpenGL提供了丰富的API函数以及着色器语言,可实现各种各样的图形效果。
关于opengl实验报告
关于opengl实验报告OpenGL实验报告一、实验目的本实验旨在通过使用OpenGL图形库,掌握基本的3D图形编程技术,以及了解OpenGL的基本操作和常用函数。
二、实验环境1. 操作系统:Windows 102. 开发环境:Visual Studio 20193. 编程语言:C++4. 图形库:OpenGL三、实验内容1. 创建一个窗口并初始化OpenGL环境2. 绘制一个简单的三维立方体3. 添加光照效果和材质4. 实现简单的相机控制5. 添加纹理贴图四、实验过程1. 创建窗口并初始化OpenGL环境首先,我们使用OpenGL提供的函数来创建一个窗口,并初始化OpenGL环境。
这一步是整个实验的基础,也是我们能够进行后续操作的前提。
2. 绘制一个简单的三维立方体利用OpenGL提供的函数,我们可以很容易地绘制一个简单的三维立方体。
通过设置顶点坐标和法向量,我们可以使用OpenGL提供的函数来绘制出一个立方体。
3. 添加光照效果和材质在绘制立方体的基础上,我们可以通过设置光源的位置和颜色,以及物体的材质属性,来实现光照效果和材质的渲染。
这一步可以让我们的立方体看起来更加真实。
4. 实现简单的相机控制通过控制相机的位置和方向,我们可以实现简单的相机控制。
这样可以让我们在3D场景中自由地移动和观察物体。
5. 添加纹理贴图最后,我们可以通过加载纹理图片,并将其贴到立方体的表面上,来实现纹理贴图。
这样可以让我们的立方体看起来更加生动和具有真实感。
五、实验总结通过本次实验,我们学习了如何使用OpenGL图形库进行3D图形编程,掌握了基本的操作和常用函数。
同时,我们也实现了一个简单的3D场景,包括绘制立方体、添加光照效果和材质、实现相机控制以及添加纹理贴图。
这些技术和知识对于今后的图形编程工作将会有很大的帮助。
基于OpenGL的三维图形绘制分析
信息与电脑 China Computer&Communication
2016 年第 23 期
基于 OpenGL 的三维图形绘制分析
郭 林 祝晓林 胡元凌
(中海石油(中国)有限公司天津分公司渤海石油研究院,天津 300459)
摘 要:OpenGL 是三维图形绘制的重要组成部分,以现阶段三维图形绘制形式为基础,结合近年来 OpenGL 实施特点, 分析基于 OpenGL 的三维图形绘制方案。 关键词:OpenGL;三维图形;绘制 中图分类号:TP311.52 文献标识码:A 文章编号:1003-9767(2016)23-092-02
第二,要求。软件需要具备优质的人机界面,绘图需要 结合双缓存系统来提升实际绘图的效率和质量,系统设计的 过程中需要结合模块化的设计方案,从而全面展现软件工程 的理念。 第三,完成内容。文件的形式设计、获取文件信息资源 的计算方案、界面的设计与目标、实现三维图形的绘制。 第四,开发环境。在实际绘图的过程中,采用 Microsoft Visual Studio 2015 达到目标,信息资源储存到 Data 文件夹 中的 grd 文件当中。 第五,运行环境。软件结合现阶段最新的软件技术实施 绘制 , 保证 Pentium 4 处理器、Windows XP 操作系统、1GB 内存、128m 显存及更高配置的硬件系统可以平稳运行 [1]。
1 系统需求
主要分为以下几点。 第一,完成目标。规定绘制图形需要的信息资源保存在 文件当中,可以自主从文件中获取工程信息的模拟数据,并 且结合工程信息的模拟数据绘制图形,可以在绘制过程中随 意转变形状,从而依据多样化的观点分析绘制的图形,同时 保障工程的绘制图形在文件中保存,也可以打印这一图形文 件。工程的组织机构图如图 1 所示。
基于OpenGL的三维可视化技术研究与实现
基于OpenGL的三维可视化技术研究与实现随着计算机技术的飞速发展,三维可视化技术也逐渐成为计算机领域的热门研究方向。
其中,基于OpenGL的三维可视化技术因其高效、易用、跨平台等特点,成为了广泛应用的一种技术。
一、OpenGL概述OpenGL是一种跨平台、开放源代码的图像渲染API,是由Silicon Graphics Inc.开发的一套图形程序接口。
OpenGL在3D图形方面的优越性能以及跨平台特性,使得其得到了广泛应用。
OpenGL的发展也比较迅速,在OpenGL 2.0中加入了可编程管线,使得OpenGL可通过GLSL(OpenGL Shading Language)进行高级图形渲染。
二、基于OpenGL的三维可视化技术基于OpenGL的三维可视化技术可以用于各种领域,例如计算机游戏、虚拟现实、医学、建筑设计等等。
其中,计算机游戏是三维可视化技术应用较早的领域之一。
基于OpenGL的游戏开发可以在各种平台上实现高效、流畅的游戏体验。
虚拟现实也是基于三维可视化技术的重要应用领域。
使用基于OpenGL的虚拟现实技术,可以实现逼真的虚拟环境,使用户产生身临其境的体验。
在医学方面,基于OpenGL的三维可视化技术可以用于医学图像重建、医学模拟、手术演示等。
通过可视化技术,医生可以更直观地了解病患情况,选择更合理的治疗方案。
基于OpenGL的三维可视化技术也被广泛应用于建筑设计领域。
使用可视化技术,设计师可以更清晰地了解设计效果,更快速地进行设计调整。
三、基于OpenGL的三维可视化技术实现基于OpenGL的三维可视化技术需要使用OpenGL的相关库函数进行开发。
其中,可以使用GLUT库进行OpenGL窗口的创建和事件处理。
使用OpenGL的矩阵操作函数可以进行三维模型的旋转、缩放、平移等操作。
通过对三维模型的合理组合,可以实现更为复杂的场景效果。
此外,基于OpenGL的三维可视化技术也可以结合其他技术进行应用。
实验1__OpenGL基本图形绘制[整理版]
实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。
二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。
3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。
VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。
选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。
这三个文件请务必加入,否则编译时会出错。
或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。
杭州电子科技大学《实时三维图形绘制》OpenGL大作业实验报告
实时三维图形绘制实验报告基于粒子系统的雪花场景模拟一、实验目的通过一学期对《实时三维图形绘制》的学习,在熟练掌握OpenGL理论的前提下,动手实践,将课本知识转化为实际应用。
二、实验要求编程实现绘制OpenGL场景并可交互式操作,体现课堂所学内容。
三、实验内容1、搭建OpenGL程序框架首先在VS2015中新建项目,在该项目中建立3个主要的类:GLWindow、Keys 和GLApplication,其中GLWindow类负责窗口属性的设置,包括建立、更新、删除窗口等操作。
Keys类负责读取键盘的输入,这样才能实现交互的要求。
GLApplication类负责建立我们的应用程序,包括初始化、更新、绘制图形等操作。
(1)窗口类GLWindow的设计在新建项目中添加类GLWindow,它包括程序主窗口的属性,以及建立、改变和删除窗口的方法(具体程序见代码)。
/** windows窗口类 */class GLWindow{public:/** 构造函数 */GLWindow();/** 创建windows窗口 */bool Create(const char * window_title, const char * class_name, boolfullscreen,HINSTANCE h_instance, LPVOID lpParam);/** 删除OpenGL窗口 */void Destroy();/** 改变窗口的显示设置 */bool ChangeScreenSetting();/** 当窗口大小改变时,通知OpenGL调整大小 */void ReshapeGL();/** Swap Buffers (Double Buffering) */void SwapBuffers() { ::SwapBuffers(m_hDC); }/** 设置窗口左上角的位置 */void SetPosX(int x);void SetPosX(unsigned short x) { SetPosX((signed short)x); }void SetPosY(int y);void SetPosY(unsigned short y) { SetPosY((signed short)y); }/** 返回窗口的大小 */int GetWidth();int GetHeight();/** 设置窗口的大小 */void SetWidth(int width);void SetHeight(int height);/** 返回窗口左上角的位置 */int GetPosX();int GetPosY();/** 设置窗口的颜色位深 */void SetHiColor() { m_BitsPerPixel = 16; }void SetTrueColor() { m_BitsPerPixel = 32; }/** 重载运算符,可以让GL_Window m_Window声明后的m_Window作为窗口句柄使用 */operator HWND() { return m_hWnd; }private:HWND m_hWnd; /**< 窗口句柄 */HDC m_hDC; /**< 设备描述表 */HGLRC m_hRC; /**< OpenGL渲染描述表 */int m_WindowPosX; /**< 窗口的左上角的X位置 */ int m_WindowPosY; /**< 窗口的左上角的Y位置 */ int m_WindowWidth; /**< 窗口的宽度 */int m_WindowHeight; /**< 窗口的高度 */int m_ScreenWidth; /**< 全屏的宽度 */int m_ScreenHeight; /**< 全屏的高度 */int m_BitsPerPixel; /**< 颜色位深 */bool m_IsFullScreen; /**< 是否全屏 */};(2)键盘类Keys的设计定义键盘类Keys对我们的按键信息进行记录,用于程序达到交互的目的。
基于OpenGL的三维游戏设计与实现
基于OpenGL的三维游戏设计与实现随着技术的发展,游戏行业也在不断壮大,人们对游戏的需求也日益增长。
而三维游戏因其更加真实、丰富的游戏体验,成为了游戏行业发展的趋势之一。
这篇文章将从基于OpenGL的三维游戏设计与实现方面进行讨论。
一、OpenGL简介OpenGL(Open Graphics Library)是一种跨平台的图形渲染API,是由Silicon Graphics公司开发的。
它可以用于绘制2D和3D图形,而且支持硬件加速,运行效率较高。
OpenGL的基本概念是通过多边形组成的网格来组成3D物体,然后通过不同的着色技术来渲染出真实的3D效果。
OpenGL的核心版本是2.0和3.0,后者的功能更加强大,但相应的代码量和难度也更大。
二、三维游戏的基本原理在三维游戏中,玩家可以在虚拟的3D场景中进行游戏。
游戏制作人员通过使用3D建模软件(如Maya、Blender等)创建3D 场景和角色模型,并使用OpenGL等图形渲染API将这些模型渲染出来。
其中最重要的部分是光照模型。
光照是指在三维空间中,光源对物体表面的照射效果。
通常有多种光源,如环境光、点光源、方向光等。
它们不同的组合和设置但是会产生不同的渲染效果。
在三维游戏中,光照模型可以决定场景的整体效果,渲染出更逼真的画面。
除了光照模型,三维游戏中的其他技术还包括纹理映射、投影、碰撞检测等。
通过这些技术的运用,制作人员可以创建一个更加真实、丰富的3D游戏场景。
三、OpenGL的优缺点OpenGL具有通用性和开放性,跨平台性较好。
因此,许多游戏基于OpenGL渲染技术进行开发。
此外,OpenGL的功能比较强大,支持2D和3D图形渲染,而且具有较高的运行效率。
这些优点使OpenGL成为游戏开发中非常重要的技术。
但是,OpenGL的学习难度较大,需要较强的数学和物理基础,并且难以掌握。
同时,OpenGL的文档较为复杂,为新手入门带来不小的难度。
四、三维游戏的发展趋势随着技术的不断发展,三维游戏的画面质量越来越逼真,游戏的玩法也日趋繁多。
计算机图形学实验报告三
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
基于OpenGL的简单几何造型
实验三基于OpenGL的简单几何造型1.实验内容与目标:通过使用Microsoft Visual Studio 2005学会用openGL 绘制一个三维立体几何。
2.小组成员分工:1)程序源代码的设计以及结果的生成。
2)介绍算法的具体步骤。
3)整理数据。
3.实验原理:openGL包含一百多个函数,每个函数具有一定的绘图功能,通过这些函数来编立体几何以及旋转变换。
4.实验步骤:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。
int main(int argc, char *argv[]),这个是带命令行参数的main函数,注意main函数中的各语句,除了最后的return之外,其余全部以glut开头。
这种以glut开头的函数都是GLUT工具包所提供的函数。
在glutDisplayFunc函数中,我们设置了“当需要画图时,请调用myDisplay 函数”。
于是myDisplay函数就用来画图。
观察myDisplay中的三个函数调用,发现它们都以gl开头。
这种以gl开头的函数都是OpenGL的标准函数。
5.实验结果:见附图6.性能分析:1)正确性:opengl功能很强大,每个函数都有其广泛性,且函数书写简单方便。
2)时间效率:由于for循环较多,且程序复杂,时间复杂度较大。
3)存储空间:存在函数的递归,函数的传递,所以在编程序的时候由于不断地递归和传递使得存储空间占用较大。
7. 附录:程序源代码。
#include<GL/glut.h>#pragma comment(lib, "opengl32.lib")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "glut32.lib")#include<GL/glut.h>void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glRectf(-0.5f, -0.5f, 0.5f, 0.5f);glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第̨²一°?个?OpenGL程¨¬序¨°");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}#include <GL/glut.h>#include <gl/gl.h>void display(){glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,0.0,0.0,1.0); // set the point color glPointSize(10);glBegin(GL_POINTS);glVertex3f(-0.5,-0.5,0.0);glVertex3f(0.5,-0.5,0.0);glVertex3f(0.5,0.5,0.0);glVertex3f(-0.5,0.5,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第一个OpenGL程序");glutDisplayFunc(display);glutMainLoop();return 0;}#include <GL/glut.h>#include <gl/gl.h>void display(){glClearColor(0.0,0.0,0.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glColor4f(1.0,0.0,0.0,1.0); // set the line color glLineWidth(5);glBegin(GL_LINES);glVertex3f(-0.5,-0.5,0.0);glVertex3f(0.5,-0.5,0.0);glVertex3f(0.5,0.5,0.0);glVertex3f(-0.5,0.5,0.0);glEnd();glFlush();}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("第一个OpenGL程序");glutDisplayFunc(display);glutMainLoop();return 0;}#define GLUT_DISABLE_ATEXIT_HACK#include<gl/GLUT.H>#include<gl/GLU.H>#include<gl/GL.H>#include<math.h>const GLfloat factor = 0.1f;//让正弦函数比例放大void myDisplay(void){GLfloat x;glClear(GL_COLOR_BUFFER_BIT);//画坐标ÀglEnable(GL_LINE_STIPPLE);//启动虚线glLineStipple(2,0x0F0F);//设置虚线样式glLineWidth(2.0f); //设置线宽¨glBegin(GL_LINES);glVertex2f(-1.0f,0.0f);glVertex2f(1.0f,0.0f);glVertex2f(0.0f,-1.0f);glVertex2f(0.0f,1.0f);glEnd();//画正弦函数曲线glDisable(GL_LINE_STIPPLE);//禁止虚线glBegin(GL_LINE_STRIP);for (x=-1.0f/factor;x<1.0f/factor;x+=0.01f){glVertex2f(x*factor,sin(x)*factor);}glEnd();glFlush();}int main(int argc,char *argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow("我的OpenGL程序");glutDisplayFunc(&myDisplay);glutMainLoop();//进行消息循环return 0;}。
基于OpenGL的三维图形的绘制_吴爱兰
PSLIBLINGS|WS_CLIPCHILDREN;(2)OnCreate为了使OpenGL能在绘图表面(窗口或位图)上绘制图象,必须先对绘图表面进行初始化,既通过对象素格式的描述(分配并填充PIXELFORMATDESCRIPTOR结构)、选择(通过ChoosePixelFormat函数)和设置(通过SetPixelFormat函数),规定绘图表面的某些属性。
此外,只有在OpenGL环境中,OpenGL命令才能被接受并执行,所以我们必须创建OpenGL绘制环境(由函数wgCreatContext完成)。
在必要的情况下,还将进一步创建调色板。
我们选择视图类消息句柄OnCreate作为完成这些工作的恰当场所。
(3)OnSize窗口大小变动时会触发消息句柄,OnSize在此函数中,我们的目的是建立3D OpenGL坐标与2D屏幕坐标之间的映射,体现为做三件事:获取当前的绘制环境。
这个使用wgMakeCurrent函数来完成,函数如下所示,BOOL bResult=wgMakeCurrent(dc.m_Hdc,m_hrc);设置映射方式。
OpenGL大量使用矩阵运算,因为场地景到屏幕的变换,以及3D图形的3D旋转、平移和缩放都是采用矩阵变换实现的。
在OnSize函数中,我们使用投影栈来设置我们观察物体的方法,总共用到四个函数,如下所示,GLdouble gldAspect=(GLdouble)cx/(GLdouble)cy;GlMatrixMode(GL_PROJECTION);//指定所使用的矩阵栈GlLoadIdentity(); //清空矩阵栈GlPerspective(45.0,gldAspect,1.0,10.0);//设定用户的可见区域GlViewport(0,0,cx,xy); //设置在用户区上的绘制区域激活当前绘制环境。
在使用多个绘基于OpenGL的三维图形的绘制吴爱兰1 楼建列21、浙江公路机械技工学校 3100142、浙江经济职业技术学院教育技术中心 310018一、OpenGL的简介目前OpenGL是工业界公认的先进而强大的三维图形编程接口(3D API)。
计算机图形学实验2------OPengl绘制3D图形
实验二 OPengl绘制3D图形一、实验目的➢了解和学习OpengL的编程➢通过学习掌握OpenGL 基本图元的绘制,进行3D图形的绘制➢掌握基于 Win32、Visual C++环境绘制3D 图形配置过程、绘制原理二、环境配置1)创建一个工程。
2)链接OpenGL libraries。
在Visual C++中先单击Project,再单击Settings,再找到Link单击,最后在Object/library modules 的最前面加上opengl32.lib glu32.lib glut.lib g laux.lib gdi32.lib user32.lib advapi32.lib或者在project -> add to project ->files引入需要的头文件3)单击Project Settings中的C/C++标签,将Preprocessor definitions 中的_CONSOLE 改为__WINDOWS。
最后单击OK。
三、实验关键代码void CCMyOpenGLView::RenderScene(){glLoadIdentity();glTranslatef(m_xPos,m_yPos,-5.0f);glRotatef(m_xAngle,1.0f,0.0f,0.0f);glRotatef(m_yAngle,0.0f,1.0f,0.0f);glutWireCone(1.0f,2.0,20,20);}bool CCMyOpenGLView::InitializeOpenGL(){m_pDC = new CClientDC(this);if(m_pDC == NULL){MessageBox("Error Obtaining DC");return FALSE;}if(!SetupPixelFormat()){return FALSE;}m_hRC = ::wglCreateContext (m_pDC->GetSafeHdc ());if(m_hRC == 0){MessageBox("RC创建失败!");return FALSE;}if(::wglMakeCurrent (m_pDC->GetSafeHdc (), m_hRC)==FALSE) {MessageBox("设置当前RC失败!");return FALSE;}::glClearColor(0.0f,0.0f,0.0f,0.0f);::glClearDepth(1.0f);::glEnable(GL_DEPTH_TEST);return TRUE;}bool CCMyOpenGLView::SetupPixelFormat(){static PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR),1, PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER,PFD_TYPE_RGBA, 24, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0};int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);if ( m_nPixelFormat == 0 ){return FALSE;}if(::SetPixelFormat(m_pDC->GetSafeHdc(),m_nPixelFormat,&pfd)==FALSE){return FALSE;}return TRUE;}int CCMyOpenGLView::OnCreate(LPCREATESTRUCT lpCreateStruct) {if (CView::OnCreate(lpCreateStruct) == -1)return -1;InitializeOpenGL();return 0;}void CCMyOpenGLView::OnDestroy(){CView::OnDestroy();if(::wglMakeCurrent (0,0) == FALSE)MessageBox("Could not make RC non-current");if(::wglDeleteContext (m_hRC)==FALSE)MessageBox("Could not delete RC");if(m_pDC)delete m_pDC;m_pDC = NULL;}BOOL CCMyOpenGLView::OnEraseBkgnd(CDC* pDC){return TRUE;}void CCMyOpenGLView::OnSize(UINT nType, int cx, int cy){CView::OnSize(nType, cx, cy);GLdouble aspect_ratio;if ( 0 >= cx || 0 >= cy )return;::glViewport(0, 0, cx, cy);aspect_ratio = (GLdouble)cx/(GLdouble)cy;::glMatrixMode(GL_PROJECTION);::glLoadIdentity();::gluPerspective(45.0f, aspect_ratio, .01f, 200.0f);::glMatrixMode(GL_MODELVIEW);::glLoadIdentity();}void CCMyOpenGLView::OnLButtonDown(UINT nFlags, CPoint point) {m_MouseDownPoint=point;SetCapture();CView::OnLButtonDown(nFlags, point);}void CCMyOpenGLView::OnLButtonUp(UINT nFlags, CPoint point) {m_MouseDownPoint=CPoint(0,0);ReleaseCapture();CView::OnLButtonUp(nFlags, point);}void CCMyOpenGLView::OnMouseMove(UINT nFlags, CPoint point) {if (GetCapture()==this){m_xAngle+=(point.y-m_MouseDownPoint.y)/3.6;m_yAngle+=(point.x-m_MouseDownPoint.x)/3.6;InvalidateRect(NULL,FALSE);m_MouseDownPoint=point;};CView::OnMouseMove(nFlags, point);}void CCMyOpenGLView::OnObjectsCone(){m_bTeapot=FALSE;m_bSphere=FALSE;m_bCone=TRUE;InvalidateRect(NULL,FALSE);}四、实验结果五、心得体会通过学习Opengl编程,实现三维立体图形的绘制,了解了设置像素格式,即OpenGL怎样操作像素、创建着色描述表并当前化着色表、删除着色表,响应WM_DESTROY消息响应WM_CREATE消息等等,函数实现了解了Opengl实用工具集,它体现了几乎所有现代窗口系统所共有的功能的函数库。
利用OpenGL实现三维绘图
利用OpenGL实现三维绘图前言:在三维绘图蓬勃发展的过程中,计算机公司推出了大量的三维绘图软件包。
其中SGI公司推出的OpenGL,作为一个性能优越的图形应用程序设计界面(API)异军突起,取得了很大的成就。
它以高性能的交互式三维图形建模能力和易于编程开发,得到了Microsoft、 IBM、 DEC、 Sun、 HP等大公司的认同。
因此,OpenGL 已经成为一种三维图形开发标准,是从事三维图形开发工作的必要工具。
一.初始化OpenGL绘图环境1.定义颜色格式和缓冲模式OpenGL提供两种颜色模式:RGB(RGBA)模式和颜色索引模式。
在RGBA模式下所有颜色的定义用RGB三个值来表示,有时也加上Alpha值(表示透明度)。
RGB三个分量值的范围都在0和1 之间,它们在最终颜色中所占的比例与它们的值成正比。
如:(1,1,0)表示黄色,(0,0,1)表示蓝色。
颜色索引模式下每个象素的颜色是用颜色索引表中的某个颜色索引值表示(类似于从调色板中选取颜色)。
由于三维图形处理中要求颜色灵活,而且在阴影,光照,雾化,融合等效果处理中RGBA 的效果要比颜色索引模式好,所以,在编程时大多采用RGBA模式。
OpenGL提供了双缓存来绘制图像。
即在显示前台缓存中的图像同时,后台缓存绘制第二幅图像。
当后台绘制完成后,后台缓存中的图像就显示出来,此时原来的前台缓存开始绘制第三幅图像,如此循环往复,以增加图像的输出速度。
设置窗口显示模式函数:voidauxInitDisplayMode(AUX_DOUBLE//双缓存方式|AUX_RGBA);//RGBA颜色模式2.设置光源OpenGL的光源大体分为三种:环境光(Ambient light),即来自于周围环境没有固定方向的光。
漫射光(Diffuse light)来自同一个方向,照射到物体表面时在物体的各个方向上均匀发散。
镜面光(Specular light)则是来自于同一方向,也沿同一个方向反射。
基于OpenGL的三维可视化技术研究
基于OpenGL的三维可视化技术研究1. 介绍OpenGL是一种跨平台的图形 API(应用程序接口),它能够处理2D和3D图形。
它被广泛应用于游戏和其他图形密集型应用程序中。
在三维可视化领域中,使用OpenGL可帮助创建高质量的三维图形。
2. OpenGL的基本概念和功能OpenGL是一个底层的图形API。
在使用OpenGL时,程序员必须编写所有的渲染代码,包括平移、旋转、缩放以及其它所有的图形变换。
OpenGL只是提供了简单的指令集,它允许程序员使用这些指令来创建二维和三维的图形。
OpenGL的基本功能包括:a. 生成对象:使用OpenGL创建对象,如顶点数组、纹理、缓冲区等。
b. 渲染对象:这是实际绘制图形的部分。
OpenGL提供了各种渲染模式,如点、线、三角形、多边形等。
c. 变换:OpenGL提供了一组变换函数,如平移、旋转、缩放等。
d. 材质:材质定义了物体的外观和性质。
3. 三维可视化技术的应用三维可视化技术可以应用于许多领域,如医学、机械制造、建筑、游戏等。
在医学上,三维可视化技术可以用于创建3D模型,以帮助医生更好地理解患者的解剖结构,从而更准确地进行手术操作。
此外,还可以用于模拟药物的作用和疾病的症状。
在机械制造领域,三维可视化技术可用于制作机械零件的模型,以验证零件的实际工作性能。
还可以用于设备的设计和测试。
在建筑方面,三维可视化技术可以用于建筑设计和规划。
它可以帮助建筑师更好地理解建筑结构,从而更好地展示和修改设计。
在游戏方面,三维可视化技术可以用于创建令人惊叹的游戏场景和角色模型。
它也可以帮助游戏开发人员更好地理解和优化游戏引擎。
4. OpenGL在三维可视化技术中的应用OpenGL是三维可视化技术中最常用的图形API之一。
虽然OpenGL提供了丰富的功能,但它的主要优势在于它的跨平台性和高性能。
OpenGL可以在各种操作系统和硬件平台上运行,并且拥有广泛的硬件支持。
它可以与其他技术,如可编程管道、着色器、纹理压缩等,结合使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于OpenGL的三维图形绘制实验目录实验题目:交互图形程序设计基础实验 (3)1.实验目的 (3)2.实验内容 (3)2.1 实验内容 (3)2.2 实验任务 (3)3.实验过程 (4)3.1 预处理 (4)3.3 主要函数说明 (5)3.4 过程描述 (6)3.5 运行截图 (7)4.实验结果 (7)5.实验体会 (7)实验题目:交互图形程序设计基础实验1.实验目的1)理解并掌握三维基本图形数据结构表示方法。
2)掌握编写OpenGL图形程序的基本方法.3)掌握OpenGL基本图形表示及绘制。
2.实验内容2.1 实验内容基于OpenGL的三维图形绘制实验目的是掌握图形信息的表示、数据的组织,在此基础上基于OpenGL绘制出三维图形。
实验内容包括OpenGL编程环境搭建、OpenGL程序结构、基本数据类型、核心函数等的使用;基本图形的绘制(点、线段、折线、闭合折线、多边形、三角形、三角扇、三角条带、四边形、四边形条带等)及图形属性控制(线宽、颜色、线型、填充样式等);对指定的若干三维模型进行建模、绘制,在一个程序框架下实现,提交1次程序,1份实验报告。
2.2 实验任务1、使用Visual C++建立一个单文档(SDI)程序,完成OpenGL绘制框架程序的设计。
在此基础上参照提供的资料,定义绘制函数,基于自定义的若干点坐标与颜色,分别绘制绘制点、线段、不闭合折线、闭合折线、多边形、三角形、四边形、三角扇、三角条带、四边形条带。
2、使用1中建立的程序框架,完成如下任务:(1)绘制正棱柱(底面多变形的边数及高度可以通过对话框输入)(2)正棱锥(底面多变形的边数及高度可以通过对话框输入)(3)正棱台(底面多变形的边数、台高、锥高可以通过对话框输入)注意模型坐标系的选择和顶点坐标的计算,每个图形的绘制单独写成函数。
加入菜单绘制三、四、五、六边的情况,其他边数情况从弹出对话框中输入参数,然后绘制。
实际绘制要绘制成表面着色图,如下线框图仅供参考。
图 13.实验过程3.1 建立Open程序框架1. 设置好 OpenGL 编程环境:使用 Microsoft 公司实现的 OpenGL 库( 1)头文件:检查 VC 的\Include\GL 下是否有 OpenGL 开发库的头文件 gl.h、glu.h、 glaux.h以及 glut.h( 2)链接导入库文件:检查 VC 的\Lib 目录下是否opengl32.lib、 glu32.lib、glaux.lib 以及 glut32.lib( 3)程序运行需要的动态链接库:系统目录下 opengl32.dll、 glu32.dll、glut32.dll2. 启动 Visual C++ 6.0,选择[New]菜单,在 New 对话框中建立图形程序的MFC工程,工程名为CG2016112455 兰红林 023. 测试OpenGL的环境。
4. OpenGL设置像素格式和逻辑色板在CG2016112455 兰红林 02View.cpp中添加如下代码,并在CG2016112455 兰红林 02View.h中添加相应的函数声明://设置窗口的像素格式(自定义方法)BOOL CCG201611245502View::SetupPixelFormat(void){PIXELFORMATDESCRIPTOR pfd ={sizeof(PIXELFORMATDESCRIPTOR), // pfd 结构的大小1, // 版本号PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图PFD_SUPPORT_OPENGL | // 支持 OpenGLPFD_DOUBLEBUFFER, // 双缓存模式PFD_TYPE_RGBA, // RGBA 颜色模式24, // 24 位颜色深度0, 0, 0, 0, 0, 0, // 忽略颜色位0, // 没有非透明度缓存0, // 忽略移位位0, // 无累加缓存0, 0, 0, 0, // 忽略累加位32, // 32 位深度缓存0, // 无模板缓存0, // 无辅助缓存PFD_MAIN_PLANE, // 主层0, // 保留0, 0, 0 // 忽略层,可见性和损毁掩模};int iPixelFormat;// 为设备描述表得到最匹配的像素格式if((iPixelFormat = ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd)) == 0) {MessageBox("ChoosePixelFormat Failed", NULL, MB_OK);return FALSE;}// 设置最匹配的像素格式为当前的像素格式(一个窗口的像素格式只能被设置一次)if(SetPixelFormat(m_pDC->GetSafeHdc(), iPixelFormat, &pfd) == FALSE) {MessageBox("SetPixelFormat Failed", NULL, MB_OK);return FALSE;}if(pfd.dwFlags & PFD_NEED_PALETTE)SetLogicalPalette();//设置逻辑调色板return TRUE;}//设置逻辑调色板(自定义方法)void CCG201611245502View::SetLogicalPalette(void){struct{WORD Version;WORD NumberOfEntries;PALETTEENTRY aEntries[256];} logicalPalette = { 0x300, 256 };BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};BYTE blues[] = {0, 85, 170, 255};for (int colorNum=0; colorNum<256; ++colorNum){logicalPalette.aEntries[colorNum].peRed =reds[colorNum & 0x07];logicalPalette.aEntries[colorNum].peGreen =greens[(colorNum >> 0x03) & 0x07];logicalPalette.aEntries[colorNum].peBlue =blues[(colorNum >> 0x06) & 0x03];logicalPalette.aEntries[colorNum].peFlags = 0;}//创建逻辑调色板m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);}3.2 程序分析设备的在当前像素格式下的坐标范围为-1.0f –1.0f ,为了方便设置顶点,所有的图形都采用菜单来绘制,一次只显示一种图形,下一次绘制时清屏。
在CG2016112455 兰红林02View.cpp源文件中引用菜单,添加菜单命令。
设置一个全局变量m_mode来确定当前绘制的内容,点击菜单时改变m_mode的值,并调用OnPaint 函数来刷新屏幕,再调用相应的绘制函数来绘图。
自定义绘制三维图形时,绘制正棱柱和正棱锥需要两个参数:高度和边数,绘制棱台时需要设置三个参数,棱台的高,棱锥的高和边数。
这些数据需要通过对话框来获取,所以需要设计两个对话框。
3.3 过程描述3.3.1 菜单和对话框设计1)、添加两个对话框类CDialogDraw和CDialogDraw2;界面如下:图2. CDialogDraw图3. CDialogDraw22)、菜单栏设计如下:图4. 二维画图图5. 正棱柱图6. 正棱锥图7. 棱台3)、添加菜单响应事件BEGIN_MESSAGE_MAP(CCG201611245502View, CScrollView) //{{AFX_MSG_MAP(CCG201611245502View)ON_WM_CREATE()ON_WM_DESTROY()ON_WM_SIZE()ON_COMMAND(ID_POINT, OnDrawPoint)ON_COMMAND(ID_LINE, OnDrawLine)ON_COMMAND(ID_NONE_BROKENLINE, OnDrawUnBrokenLine) ON_COMMAND(ID_BROKENLINE, OnDrawBrokenLine)ON_COMMAND(ID_POLYGON, OnDrawPoligon)ON_COMMAND(ID_TRIANGLE, OnDrawTriangle)ON_COMMAND(ID_QUADRANGLE, OnDrawQuadrangle)ON_COMMAND(ID_TRIANGLE_FAN, OnDrawTriangleFan)ON_COMMAND(ID_TRIANGLE_STRIPS, OnDrawTriangleStrips)ON_COMMAND(ID_QUADRANGLE_STRIPS, OnDrawQuadrangleStrips)ON_COMMAND(ID_PRISM_THREE, OnDrawPrismThree)ON_COMMAND(ID_PRISM_FOUR, OnDrawPrismFour)ON_COMMAND(ID_PRISM_FIVE, OnDrawPrismFive)ON_COMMAND(ID_PRISM_SIX, OnDrawPrismSix)ON_COMMAND(ID_PRISM_OTHER, OnDrawPrismOther)ON_COMMAND(ID_PYRAMID_THREE, OnDrawPyramidThree)ON_COMMAND(ID_PYRAMID_FOUR, OnDrawPyramidFour)ON_COMMAND(ID_PYRAMID_FIVE, OnDrawPyramidFive)ON_COMMAND(ID_PYRAMID_SIX, OnDrawPyramidSix)ON_COMMAND(ID_PYRAMID_OTHER, OnDrawPyramidOther)ON_COMMAND(ID_TRUSTUM_PYRAMID_THREE, OnDrawTrustumPyramidThree) ON_COMMAND(ID_TRUSTUM_PYRAMID_FOUR, OnDrawTrustumPyramidFour)ON_COMMAND(ID_TRUSTUM_PYRAMID_FIVE, OnDrawTrustumPyramidFive)ON_COMMAND(ID_TRUSTUM_PYRAMID_SIX, OnDrawTrustumPyramidSix)ON_COMMAND(ID_TRUSTUM_PYRAMID_OTHER, OnDrawTrustumPyramidOther) //}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) END_MESSAGE_MAP()//设置场景BOOL CCG201611245502View::RenderScene(void){//调用 OpenGL 绘图函数进行图形绘制//根据需要自行修改,也可在派生类中重载此函数//本例中以绘制一个三棱柱if(m_mode==0)Point();else if(m_mode == 2)Line();else if(m_mode == 3)UnBrokenLine();else if(m_mode == 4)BrokenLine();else if(m_mode == 5)Poligon();else if(m_mode == 6)Triangle();else if(m_mode == 7)Quadrangle();else if(m_mode == 8)TriangleFan();else if(m_mode == 9)TriangleStrips();else if(m_mode == 10)QuadrangleStrips();else if(m_mode == 11)Prism(3, 0.8);else if(m_mode == 12)Prism(4, 0.8);else if(m_mode == 13)Prism(5, 0.8);else if(m_mode == 14)Prism(6, 0.8);else if(m_mode == 15){CDialogDraw dlg;if(dlg.DoModal()==IDOK){Prism(dlg.side, dlg.height);}}else if(m_mode == 16)Pyramid(3,0.8);else if(m_mode == 17)Pyramid(4,0.8);else if(m_mode == 18)Pyramid(5,0.8);else if(m_mode == 19)Pyramid(6,0.8);else if(m_mode == 20){CDialogDraw dlg;if(dlg.DoModal()==IDOK){Pyramid(dlg.side, dlg.height);}}else if(m_mode == 21)TrustumPyramid(3, 0.8, 0.5);else if(m_mode == 22)TrustumPyramid(4, 0.8, 0.5);else if(m_mode == 23)TrustumPyramid(5, 0.8, 0.5);else if(m_mode == 24)TrustumPyramid(6, 0.8, 0.5);else if(m_mode == 25){CDialogDraw2 dlg;if(dlg.DoModal()==IDOK){TrustumPyramid(dlg.side, dlg.total_height, dlg.part_height);}}//else cube();return TRUE;}void CCG201611245502View::OnDrawQuadrangleStrips(){m_mode = 10;OnPaint();}void CCG201611245502View::OnDrawTriangleStrips(){m_mode = 9;OnPaint();}void CCG201611245502View::OnDrawTriangleFan(){m_mode = 8;OnPaint();}void CCG201611245502View::OnDrawQuadrangle(){m_mode = 7;OnPaint();}void CCG201611245502View::OnDrawTriangle(){m_mode = 6;OnPaint();}void CCG201611245502View::OnDrawPoligon(){m_mode = 5;OnPaint();}void CCG201611245502View::OnDrawBrokenLine() {m_mode = 4;OnPaint();}void CCG201611245502View::OnDrawUnBrokenLine() {m_mode = 3;OnPaint();}void CCG201611245502View::OnDrawLine(){m_mode = 2;OnPaint();}void CCG201611245502View::OnDrawPrismThree() {m_mode = 11;OnPaint();}void CCG201611245502View::OnDrawPrismFour() {m_mode = 12;OnPaint();}void CCG201611245502View::OnDrawPrismFive() {m_mode = 13;OnPaint();}void CCG201611245502View::OnDrawPrismSix() {m_mode = 14;OnPaint();void CCG201611245502View::OnDrawPrismOther(){m_mode = 15;OnPaint();}void CCG201611245502View::OnDrawPyramidThree(){m_mode = 16;OnPaint();}void CCG201611245502View::OnDrawPyramidFour(){m_mode = 17;OnPaint();}void CCG201611245502View::OnDrawPyramidFive(){m_mode = 18;OnPaint();}void CCG201611245502View::OnDrawPyramidSix(){m_mode = 19;OnPaint();}void CCG201611245502View::OnDrawPyramidOther(){m_mode = 20;OnPaint();}void CCG201611245502View::OnDrawTrustumPyramidThree() {m_mode = 21;OnPaint();}void CCG201611245502View::OnDrawTrustumPyramidFour() {m_mode = 22;OnPaint();}void CCG201611245502View::OnDrawTrustumPyramidFive()m_mode = 23;OnPaint();}void CCG201611245502View::OnDrawTrustumPyramidSix(){m_mode = 24;OnPaint();}void CCG201611245502View::OnDrawTrustumPyramidOther(){m_mode = 25;OnPaint();}3.3.2 主要函数说明3.3.2.1 画点void CCG201611245502View::Point(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();glColor3f(1.0, 0.0, 0.0);glBegin(GL_POINTS);glPointSize(5);glVertex2f(0.0, 0.0);glVertex2f(0.1, 0.1);glVertex2f(0.1, 0.2);glVertex2f(0.1, 0.3);glVertex2f(0.1, 0.4);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.2 画线void CCG201611245502View::Line(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glClearColor(0.0, 0.0, 0.0, 0.0);//glClear(GL_COLOR_BUFFER_BIT);glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);glBegin(GL_LINES);glColor3f(1.0,0.0,0.0);glVertex3f(0.25,0.25,0);glVertex3f(0.75,0.25,0);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.3 画不闭合折线void CCG201611245502View::UnBrokenLine(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();glColor3f(1.0, 0.0, 0.0);glBegin( GL_LINE_STRIP);glVertex2f( 0.0f, 0.0f);glVertex2f( -0.3f, 0.1f);glVertex2f( 0.1f, 0.8f);glVertex2f( 0.4f, 0.6f);glEnd();glFinish();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.4 画闭合折线void CCG201611245502View::BrokenLine(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();glColor3f(1.0, 0.0, 0.0);glBegin( GL_LINE_LOOP);glVertex2f( 0.0f, 0.0f);glVertex2f( -0.3f, 0.1f);glVertex2f( 0.1f, 0.8f);glVertex2f( 0.4f, 0.6f);glEnd();glFinish();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.5 画多边形void CCG201611245502View::Poligon(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();glBegin(GL_POLYGON);glColor3f(1.0,0.0,0.0);glVertex3f(0.25,0.25,0);glVertex3f(0.5,0,0);glVertex3f(0.75,0.25,0);glVertex3f(0.75,0.75,0);glVertex3f(0.25,0.75,0);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.6 画三角形void CCG201611245502View::Triangle(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glutInitWindowPosition(300, 300);glBegin(GL_TRIANGLES);glColor3f(1.0,0.0,0.0);glVertex2f(-0.5f, -0.5f);glVertex2f(0.0f, -0.3f);glVertex2f(0.5f, 0.8f);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.7 四边形void CCG201611245502View::Quadrangle(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glutInitWindowPosition(300, 300);glColor3f(0.0, 1.0, 1.0);glBegin(GL_QUADS);glVertex2f(-0.3, 0.1);glVertex2f(-0.4, 0.1);glVertex2f(-0.5, 0.3);glVertex2f(-0.4, 0.5);glVertex2f(-0.5, 0.1);glVertex2f(-0.6, 0.1);glVertex2f(-0.7, 0.3);glVertex2f(-0.6, 0.5);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.8 画三角扇void CCG201611245502View::TriangleFan(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glutInitWindowPosition(300, 300);glBegin(GL_TRIANGLE_FAN);glColor3f(1.0, 0.0, 1.0);glVertex2f(0.0f, -0.25f);glColor3f(0.0, 1.0, 1.0);glVertex2f(0.5f, -0.25f);glColor3f(0.0, 0.0, 1.0);glVertex2f(0.4f, 0.0f);glColor3f(0.0, 1.0, 0.0);glVertex2f(0.2f, 0.15f);glColor3f(1.0, 0.0, 0.0);glVertex2f(0.0f, 0.2f);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.9 画三角条带void CCG201611245502View::TriangleStrips(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glutInitWindowPosition(300, 300);glBegin(GL_TRIANGLE_STRIP);glColor3f(1.0, 0.0, 1.0);glVertex2f(0.0f, -0.25f);glColor3f(0.0, 1.0, 1.0);glVertex2f(0.5f, -0.25f);glColor3f(0.0, 0.0, 1.0);glVertex2f(0.4f, 0.0f);glColor3f(0.0, 1.0, 0.0);glVertex2f(0.2f, 0.15f);glColor3f(1.0, 0.0, 0.0);glVertex2f(0.0f, 0.2f);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.10 画四边形条带void CCG201611245502View::QuadrangleStrips(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色缓存和深度缓存glPushMatrix();//glutInitWindowPosition(300, 300);glBegin(GL_QUAD_STRIP);glColor3f(1.0, 1.0, 0.0);glVertex2f(-0.3, 0.5);glColor3f(0.0, 1.0, 0.0);glVertex2f(-0.4, 0.4);glColor3f(1.0, 0.0, 0.0);glVertex2f(-0.5, 0.3);glColor3f(1.0, 0.0, 1.0);glVertex2f(-0.4, 0.2);glColor3f(0.0, 1.0, 1.0);glVertex2f(-0.5, 0.1);glColor3f(0.0, 1.0, 0.0);glVertex2f(-0.6, 0.0);glColor3f(0.0, 0.0, 1.0);glVertex2f(-0.7, 0.3);glColor3f(1.0, 0.0, 0.0);glVertex2f(-0.6, 0.5);glEnd();glPopMatrix();glFlush();SwapBuffers(m_pDC->GetSafeHdc());}3.3.2.11 画正棱柱参数n为边数,height表示半高。