计算机图形学大作业报告记录(灯光纹理映射)
计算机图形学报告华北电力大学

课程设计(综合实验)报告( 2015 -- 2016 年度第一学期)名称:计算机图形学题目:课内综合实验院系:计算机系班级:计科1203班学号:学生姓名:指导教师:姜丽梅实验学时:成绩:日期:2015年5月6日一、实验目的与要求1.掌握计算机图形学及交互式计算机图形学的定义,了解OpenGL的功能及工作流程,掌握基于OpenGL Glut库的程序框架。
2.掌握基本的二维线画图元的绘制算法及属性,掌握OpenGL基本图元的绘制。
3.理解二维、三维图形的绘制流程,掌握二维图形和三维图形的图形变换。
4.了解形体的真实感表示的内容,包括消隐技术、简单光照明模型、多边形的明暗绘制技术以及纹理映射技术。
5.要求使用OpenGL及GLUT库在Visual C++环境下编写图形绘制程序实现基本图元绘制。
6.要求对绘制的简单场景综合利用几何变换或gluLookAt函数实现交互式三维观察程序。
二、实验内容1、OpenGL基本图元绘制实验在两个具有不同属性的窗口中分别显示一个旋转的矩形来演示单缓存和双缓存,在旋转过程中不断改变图形的颜色,利用鼠标或菜单可终止/启动图形旋转。
明确程序包括哪些函数,各个函数的功能以及整个流程,从而为进一步做综合性的图形绘制实验奠定基础。
依赖项关系图可以清楚地表达出各函数之间的关系,如下:实验方法与步骤:1、正确配置相关文件;C:\Program Files\Microsoft Visual Studio\VC98\Include\GLC:\WINDOWS\system32C:\Program Files\Microsoft Visual Studio\VC98\Lib2、编辑源程序并进行调试;3、进行运行测试,并结合情况进行调整;通过改变各个函数参数值,观察图形变化,说明产生相应结果的原因,从而进一步了解函数的作用。
4、对运行结果进行保存。
实验代码:#include <stdlib.h>#include <gl/glut.h>#include < stdio.h >#include <math.h>#define DEG_TO_RAD 0.017453static GLfloat theta = 0.0;GLfloat r = 0.0; //设置矩形的初始颜色GLfloat g = 0.0;GLfloat b = 0.0;int singleb,doubleb;void display(void){ glClear(GL_COLOR_BUFFER_BIT); //清除颜色的缓冲,颜色渐变r = r - 0.0002;g = g + 0.0002;b = b + 0.0001;if(r < 0.0001){ r = 1.0;g = 0.0;b = 0.0;}glBegin(GL_POLYGON);glVertex2f(cos(DEG_TO_RAD*theta), sin(DEG_TO_RAD*theta));glColor3f(r, 0,0);glVertex2f(cos(DEG_TO_RAD*(theta+90)), sin(DEG_TO_RAD*(theta+90)));glColor3f(0, 0,b);glVertex2f(cos(DEG_TO_RAD*(theta+180)), sin(DEG_TO_RAD*(theta+180)));glColor3f(0, g,0);glVertex2f(cos(DEG_TO_RAD*(theta+270)), sin(DEG_TO_RAD*(theta+270)));glColor3f(r, g,b);glEnd();glutSwapBuffers();}void spinDisplay (void) //转动弧度设置{theta = theta +0.09;if (theta > 360.0)theta = theta - 360.0;glutSetWindow(singleb);glutPostWindowRedisplay(singleb);glutSetWindow(doubleb);glutPostWindowRedisplay(doubleb);}void spinDisplay1(void){glutPostRedisplay();}void myReshape(int w, int h){glViewport(0, 0, w, h); //指定平面上一个矩形裁剪区域,glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)gluOrtho2D(-1.,1.,-1.*(GLfloat)h/(GLfloat)w,1.*(GLfloat)h/(GLfloat)w);elsegluOrtho2D(-1.*(GLfloat)w/(GLfloat)h, 1.*(GLfloat)w/(GLfloat)h, -1., 1.); }void mouse(int button,int state,int x,int y) //鼠标定义{ switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){ glutIdleFunc(spinDisplay1);}break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN)glutIdleFunc(spinDisplay);break;default:}}void main(int argc, char** argv) //主函数{glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(100, 100);glutInitWindowSize(500, 500);singleb=glutCreateWindow("spinning square");glClearColor(1.0, 1.0, 1.0, 1.0);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);glutInitWindowPosition(600, 100);glutInitWindowSize(500, 500);doubleb=glutCreateWindow("spinning square");glClearColor(1.0, 1.0, 1.0, 1.0);glutDisplayFunc(display);glutReshapeFunc(myReshape);glutIdleFunc(spinDisplay);glutMouseFunc(mouse);glutMainLoop();}2、OpenGL三维观察综合实验对于绘制的立方体(也可以自己拟定)通过键盘移动视点,利用鼠标或键盘控制立方体的旋转方向,从不同角度观察各面颜色不同的立方体,通过本实验加深理解计算机图形学中的三维图形绘制流程的工作原理和OpenGL三维观察流程及相应的函数实现。
计算机形学的纹理映射

计算机形学的纹理映射计算机图形学中的纹理映射是一种常见且广泛应用的技术,用于增强三维模型的真实感和细节。
本文将探讨纹理映射的概念、原理和应用,并分析其在计算机图形学领域中的重要性。
一、概述纹理映射是一种将二维图像贴附到三维模型表面的过程。
它通过在三维模型的表面上粘贴纹理图像来模拟真实世界中的材质和细节。
纹理映射可以使平凡的三维模型变得生动,并为渲染引擎提供更真实的光照效果。
二、纹理映射的原理纹理映射的原理可简单描述为以下三个步骤:1. 纹理坐标的计算:为了将二维纹理贴附到三维模型表面上,首先需要计算每个顶点的纹理坐标。
纹理坐标是一个二维向量,指示了纹理图像中的像素位置。
2. 纹理插值:一旦获得了每个顶点的纹理坐标,渲染引擎会根据每个像素的位置在顶点之间进行插值计算,以确定其在纹理图像中的位置。
这样可以确保纹理图像均匀地覆盖整个三维表面。
3. 纹理采样:根据插值计算的纹理坐标,渲染引擎从纹理图像中采样像素值。
采样过程将决定每个像素的颜色和纹理特征。
三、纹理映射的应用纹理映射在计算机图形学中有广泛的应用。
以下是几个常见的应用领域:1. 视觉效果:纹理映射可用于创建逼真的视觉效果,如岩石、树木的表面纹理。
通过将真实世界的图像应用到模型上,可以使其看起来更加真实。
2. 游戏开发:游戏中的角色、场景和物体通常都需要进行纹理映射。
纹理映射可以为游戏提供更好的视觉效果,并增加游戏的沉浸感。
3. 虚拟现实:纹理映射是虚拟现实技术中不可或缺的一部分。
通过在虚拟环境中应用纹理,可以增强用户感知,使其更好地融入虚拟世界。
4. 增强现实:纹理映射在增强现实应用中也扮演着重要角色。
通过在现实世界中投射纹理,可以实现虚拟物体与真实世界的交互。
结论纹理映射是计算机图形学中的重要技术之一,通过将二维纹理应用于三维模型的表面,可以增强模型的真实感和细节。
它在视觉效果、游戏开发、虚拟现实和增强现实等领域都有广泛应用。
纹理映射的原理和应用需要综合考虑,以确保最佳的效果和性能。
计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。
二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。
1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。
三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。
要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。
消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。
物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。
用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。
1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。
世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。
为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。
物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。
观察坐标系的原点一般即是观察点。
物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。
选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。
因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。
这需要对物体进行三维旋转和平移变换。
常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。
图形学实验报告

图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。
通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。
实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。
我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。
通过改变像素的颜色值,我们可以创建出各种各样的图像效果。
实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。
我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。
这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。
实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。
我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。
通过这些技术,我们可以创建出更加复杂和精细的图像。
实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。
我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。
通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。
实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。
我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。
通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。
实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。
我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。
通过这些技术,我们可以创建出逼真的三维场景和动画效果。
总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。
我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。
计算机图形学大作业报告

云南大学软件学院期末课程报告Final Course ReportSchool of Software, Yunnan University个人成绩序号学号姓名成绩1学期: 2009年秋季学期课程名称: 计算机图形学任课教师:实践题目: 创建旋转体小组长:联系电话:电子邮件:2009-2010学年上学期计算机图形学成绩考核表年级:专业:软件工程学号:姓名:本人所做工作:创建旋转体总结报告(GB8567——88)1引言 ............................................................................................................... 错误!未定义书签。
1.1编写目的............................................................................................. 错误!未定义书签。
1.2背景..................................................................................................... 错误!未定义书签。
1.3定义..................................................................................................... 错误!未定义书签。
1.4参考资料............................................................................................. 错误!未定义书签。
2实际开发结果................................................................................................ 错误!未定义书签。
计算机图形学实验报告--纹理映射

glRotatef(x,1.0f,0.0f,0.0f); glRotatef(y,0.0f,1.0f,0.0f); glRotatef(z,0.0f,1.0f,1.0f);
// 在 X 轴上旋转立方体 // 在 Y 轴上旋转立方体 // 在 YZ 轴上旋转立方体
glBindTexture(GL_TEXTURE_2D, texture[0]); glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glEnd(); glBindTexture(GL_TEXTURE_2D, texture[4]); glBegin(GL_QUADS); // Left Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f);
//Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit if (TextureImage[0]=LoadBMP("Data/Crate.bmp")) { Status=TRUE; // Set The Status To TRUE // Create The Texture
if (TextureImage[0]) {if (TextureImage[0]->data) {
// If Texture Exists // If Texture Image Exists
计算机图形学实验报告-实验5Phong光照模型

计算机图形学实验报告班级计算机工硕班学号 **********姓名王泽晶实验五: Phong光照模型实验目的通过本次试验,学生可以掌握简单光照明模型的计算,以及真实感绘制中三维场景搭建的初步知识。
实验内容:对给定的光源、相机状态,对球进行Phong光照明模型绘制。
搭建三维场景:a)在三维空间中摆放1个球,半径为R,默认为50 ,摆放位置为(0,0,0)b)球的材质默认值为Ka = (0.1,0.1,0.1), Kd = (0,0,0.8), Ks = 0.2, n = 10c)视点方向初始为(0,0,1),光源方向初始为(1,1,1)d)视口设置为x0 = -100, y0 = -75, w = 200, h = 150使用phong模型绘制场景试验步骤:添加成员函数,编写成员数代码为override public function computeIntersection( viewStart:Vec3, viewDir:Vec3):Boolean {// See /geometry/sphereline/var viewEnd:Vec3 = viewStart.add(viewDir);var A:Number = Math.pow(viewEnd.getVec(0) - viewStart.getVec(0), 2)+Math.pow(viewEnd.getVec(1) - viewStart.getVec(1), 2) +Math.pow(viewEnd.getVec(2) - viewStart.getVec(2), 2);var B:Number =((viewEnd.getVec(0) - viewStart.getVec(0)) * (viewStart.getVec(0) - _position.getVec(0)) +(viewEnd.getVec(1) - viewStart.getVec(1)) * (viewStart.getVec(1) -_position.getVec(1)) +(viewEnd.getVec(2) - viewStart.getVec(2)) * (viewStart.getVec(2) -_position.getVec(2))) * 2.0;var C:Number = Math.pow(_position.getVec(0) - viewStart.getVec(0), 2) + Math.pow(_position.getVec(1) - viewStart.getVec(1), 2) +Math.pow(_position.getVec(2) - viewStart.getVec(2), 2) - _radius*_radius;// Solve C + Bt + At^2 = 0var delta:Number = B*B - 4*A*C;if ( delta<0.0 || A==0.0 ) return false;// We don't consider whether 0<t<1 here because real viewer is at infinite place var t1:Number = (-B + Math.sqrt(delta)) / (2*A);var t2:Number = (-B - Math.sqrt(delta)) / (2*A);if ( t1<t2 )point = viewStart.multiplyk(1.0 - t1).add(viewEnd.multiplyk(t1));elsepoint = viewStart.multiplyk(1.0 - t2).add(viewEnd.multiplyk(t2));normal = Vec3.normalize(point.minus(_position));return true;}public var _width :Number =0.0;public var _height:Number = 0.0;public var data:Array = new Array();protected function group1_creationCompleteHandler(event:FlexEvent):void{draw();}public function draw():void{graphics.clear();if(txtViewDir.text == "")return;var ary:Array = txtViewDir.text.split(",");var flag:Boolean = false;for(var i:int= 0;i<ary.length;i++){if(ary[i] == "" || isNaN(ary[i])){flag = true;break;}}if(flag)txtViewDir.setStyle("color",0xff0000);return;}txtViewDir.setStyle("color",0x000000);var viewDir:Vec3 = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));ary = txtLight.text.split(",");flag = false;for(i= 0;i<ary.length;i++){if(ary[i] == "" || isNaN(ary[i])){flag = true;break;}}if(flag){txtLight.setStyle("color",0xff0000);return;}txtLight.setStyle("color",0x000000);var light:Light = new Light();light.direction = new Vec3(Number(ary[0]), Number(ary[1]),Number(ary[2])).negative();light.ambient = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));light.intensity = new Vec3(Number(ary[0]), Number(ary[1]), Number(ary[2]));var material:Material = new Material();material.diffuse =new Vec3(0.0, 0.0, 0.8);material.specular =new Vec3(0.2, 0.2, 0.2);material.ambient =new Vec3(0.1, 0.1, 0.1);data = createSceneImage( 200, 150, viewDir, light, material );drawImg();}public function drawImg():void{for(var y:int = 0 ;y<150;y++)for(var x:int =0;x<200;x++){var index:int = (y*200 + x) * 3;var r:Number = data[index+0];var g:Number = data[index+1];var b:Number = data[index+2];var cl:uint =(r << 16) | (g << 8) | b;this.graphics.beginFill(cl)this.graphics.drawCircle(x,y,1);this.graphics.endFill();}}}public function allocateBuffer( width:int,height: int ):Array{var data:Array = new Array();data.length = width * height * 3;_width = width;_height = heightreturn data;}public function createSceneImage( width:int,height: int ,viewDir:Vec3, light:Light, material:Material ):Array{var data:Array = new Array();var sphere:SphereObject = new SphereObject(50.0);sphere.setPosition(new Vec3(0.0, 0.0, 0.0) );sphere.setMaterial( material );var halfW:int = width / 2var halfH:int = height / 2;for ( var y:int=0; y<height; ++y ){for ( var x:int=0; x<width; ++x ){var viewStart:Vec3 = new Vec3(Number(x - halfW), Number(y - halfH), 0.0);if ( puteIntersection(viewStart, viewDir) )sphere.color = puteColor(light, viewDir, sphere.normal);elsesphere.color = new Vec3(0.1, 0.1, 0.1);var index:int = (y*width + x) * 3;data[index+0] = (sphere.color.getVec(0) * 255.0);data[index+1] = (sphere.color.getVec(1) * 255.0);data[index+2] = (sphere.color.getVec(2) * 255.0);}}return data;}protected function button1_clickHandler(event:MouseEvent):void {// TODO Auto-generated method stubdraw();}编译运行得到如下结果:。
计算机图形学实验报告

实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学大作业报告记录(灯光纹理映射)————————————————————————————————作者:————————————————————————————————日期:大作业报告实验课程名称:计算机图形学学生姓名:班级:学院(系):学生学号:指导教师:成绩:一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。
二、主要功能模块设计1 矩阵运算模块的设计:功能描述:程序启动后,这部分功能模块会为整个应用程序提供算法支持,具体是矩阵直接的相互运算,在2D向3D转化过程中会起到很重要的作用。
代码设计:float vv(float * v1, float * v2){return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];}void vxv(float * n, float * v1, float * v2){n[0] = v1[1] * v2[2] - v1[2] * v2[1];n[1] = v1[2] * v2[0] - v1[0] * v2[2];n[2] = v1[0] * v2[1] - v1[1] * v2[0];}void loadIdentity(Matrix m){Matrix identity = {{1.0,0.0,0.0,0.0},{0.0,1.0,0.0,0.0},{0.0,0.0,1.0,0.0},{0.0,0.0,0.0,1.0}};for(int i = 0;i < 4; i++)for(int j = 0;j < 4; j++)m[i][j] = identity[i][j];}void preMultiply(Matrix p, Matrix m){int i , j;Matrix t;for( i = 0; i < 4; i ++)for( j = 0; j < 4; j++)t[i][j] = p[i][0] * m[0][j] + p[i][1] * m[1][j] + p[i][2] * m[2][j] + p[i][3] * m[3][j];for( i = 0; i < 4; i ++)for( j = 0; j < 4; j ++)m[i][j] = t[i][j];}2 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。
代码设计://2D图形的display函数void display(){glClear(GL_COLOR_BUFFER_BIT);if(n == 1 && type ==GL_LINE_STRIP) {glBegin(GL_POINTS);glVertex2iv(vert[0]);glColor3f(0,0.5,0.5);glVertex2i(width-vert[0][0]-1,vert[0][1]);glEnd();}glColor3f(0,0.5,0.5);glBegin(GL_LINES);glVertex2i(width/2,0);glVertex2i(width/2,height-1);glEnd();glBegin(type);for(int i = 0;i<n;i++) glVertex2i(width-vert[i][0]-1,vert[i][1]);glEnd();glColor3f(1,1,0);glBegin(type);for(int i = 0;i<n;i++) glVertex2iv(vert[i]);glEnd();glutSwapBuffers();initQMesh();glutSetWindow(winid);glutPostRedisplay();}//3D图形的显示函数void modelDisplay(){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glPushMatrix();float M[16];for(int r = 0; r < 4; r++) for(int c = 0; c < 4; c++) M[4 * c + r] = CRM[r][c];glMultMatrixf(M);glScalef(zoom,zoom,zoom);drawQMesh();glPopMatrix();glPushMatrix();glLightfv(GL_LIGHT0,GL_AMBIENT,amb);glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);glPopMatrix();glutSwapBuffers();}3 键盘敲击模块功能描述:该功能主要为两个窗体添加键盘敲击事件,在2D窗体中主要添加了反走样效果,清除所画的图,点线转化功能,对于3D窗体主要添加了投影方式的变换,光源移动的功能代码设计://2D绘制窗体的键盘敲击处理函数void keyboard(unsigned char key, int x,int y){switch(key){case'a': antialiasing = ! antialiasing;//反走样效果if(antialiasing){glEnable(GL_BLEND);glEnable(GL_LINE_SMOOTH);}else{glDisable(GL_BLEND);glDisable(GL_LINE_SMOOTH);}break;case'c': n = 0;break; //清除界面功能case'l': type = GL_LINE_STRIP;break; //绘制线功能case'v': type = GL_POINTS;break; //绘制点功能}glutPostRedisplay();}//3D显示窗体的键盘敲击事件处理函数:void modelKeyboard(unsigned char key, int x, int y){switch (key) {case'o':glMatrixMode(GL_PROJECTION);//正投影glLoadIdentity();glOrtho(-4,4,-4,4,6,14);glMatrixMode(GL_MODELVIEW);break;case'p':glMatrixMode(GL_PROJECTION);//侧投影,不过是默认的 glLoadIdentity();gluPerspective(45.0,1.0,6.0,14.0);glMatrixMode(GL_MODELVIEW);break;case'm':lightPosition[0] = lightPosition[0] - 0.5; //光源移动break;case'n':lightPosition[1] = lightPosition[1] - 0.5;break;case'z':lightPosition[2] = lightPosition[2] - 0.5;break;case'k':glDisable(GL_FOG);break;}glutPostRedisplay();}4鼠标点击模块功能描述:该功能模块主要实现了对两个窗体鼠标事件的处理,对于3D窗体实现了鼠标左键旋转,由键放大缩小的效果,2D窗体实现了左键画点,右键可以对已经存在的点改变它的位置。
代码设计://3D窗体的鼠标事件void modelMouse(int button,int state,int x,int y){switch (button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN ){cx = x;cy = h - 1 - y;dx = dy = 0;left_button_down = true;}elseleft_button_down = false;break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN){cx = x;cy = h - 1 - y;right_button_down = true;}elseright_button_down = false;break;}}//2D窗体鼠标事件void mouse(int button, int state, int x ,int y){y = height - 1 - y;switch(button){case GLUT_LEFT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding ){v = n++;vert[v][0] = (x < width/2) ? width/2: (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;glutPostRedisplay();}else rubberbanding = false;break;case GLUT_RIGHT_BUTTON:if(state == GLUT_DOWN && ! rubberbanding && (v = findVertex(x,y)) != -1) {if(glutGetModifiers() == GLUT_ACTIVE_CTRL) {for (int i = v; i< n-1; i++){vert[v][0] = vert[i+1][0];vert[i][1] = vert[i+1][1];}n--;}else{vert[v][0] = (x < width/2) ? width/2 : (x >= width) ? width - 1 : x;vert[v][1] = (y < 0) ? 0 : (y >= height) ? height -1 : y;rubberbanding = true;}glutPostRedisplay();}else rubberbanding = false;break;}}功能截图:利用鼠标在界面上画出原来的图,截图如下:按住“Z”后,上方的光照变化,截图如下:按住“Y”后,下方的光照效果发生变化,截图如下:使用鼠标实现图像方向的变化,截图如下:使用鼠标实现图像大小的变化,截图如下:放大:缩小:三、心得通过对本次大作业试验的编写,更进一步了解了OpenGL的用法,从计算机图形学课程中可能收获最多的并不是图形学的一些基础知识,虽然这些很重要,但是真正有些成就感的还是用OpenGL开发出来的这些程序。