计算机图形学 光照及纹理报告

合集下载

图形学光照实验报告

图形学光照实验报告
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
}
for(i=-y;i<=y;i++)
{
for(int i=-x;i<=x;i++)
{
mColor=Phong(x0,y0,r,i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,y+y0);
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib); glVertex2i (i+x0,-y+y0);
deltax += 2;
deltay += 4;
x++;
y--;
}
CirclePt( x0, y0, x, y, mColor);
}
}
//根据中点圆算法填充圆域
void FlatCircle(int x0, int y0, int r, Color mColor)
{
int x,y,deltax,deltay,d;
x = 0;
y = r;
deltax = 3;
deltay = 5-r-r;
d = 1-r;
glColor3ub (mColor.Ir, mColor.Ig, mColor.Ib);

计算机图形学实验报告4

计算机图形学实验报告4

计算机图形学实验报告4一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学中的一些关键概念和技术,通过实际操作和编程实现,提高对图形生成、变换、渲染等方面的理解和应用能力。

二、实验环境本次实验使用的软件环境为_____,编程语言为_____,硬件环境为_____。

三、实验内容1、二维图形的绘制使用基本的绘图函数,如直线、矩形、圆形等,绘制简单的二维图形。

通过设置线条颜色、填充颜色等属性,增强图形的表现力。

2、图形的几何变换实现图形的平移、旋转和缩放操作。

观察不同变换参数对图形的影响。

3、三维图形的生成构建简单的三维模型,如立方体、球体等。

应用光照和材质效果,使三维图形更加逼真。

四、实验步骤1、二维图形的绘制首先,在编程环境中导入所需的图形库和相关模块。

然后,定义绘图窗口的大小和坐标范围。

接下来,使用绘图函数按照指定的坐标和参数绘制直线、矩形和圆形。

最后,设置图形的颜色和填充属性,使图形更加美观。

2、图形的几何变换对于平移操作,通过修改图形顶点的坐标值来实现水平和垂直方向的移动。

对于旋转操作,根据旋转角度计算新的顶点坐标,实现图形的绕中心点旋转。

对于缩放操作,将图形的顶点坐标乘以缩放因子,达到放大或缩小图形的效果。

3、三维图形的生成首先,定义三维模型的顶点坐标和三角形面的连接关系。

然后,设置光照的位置、颜色和强度等参数。

接着,为模型添加材质属性,如颜色、反射率等。

最后,使用渲染函数将三维模型显示在屏幕上。

五、实验结果与分析1、二维图形的绘制成功绘制出了各种简单的二维图形,并且通过颜色和填充的设置,使图形具有了更好的视觉效果。

例如,绘制的矩形和圆形边缘清晰,颜色鲜艳,填充均匀。

2、图形的几何变换平移、旋转和缩放操作都能够准确地实现,并且变换效果符合预期。

在旋转操作中,发现旋转角度的正负会影响旋转的方向,而缩放因子的大小直接决定了图形的缩放程度。

3、三维图形的生成生成的三维模型具有一定的立体感和真实感。

计算机图形学第五次实验报告

计算机图形学第五次实验报告

《计算机图形学》实验报告实验十一真实感图形一、实验教学目标与基本要求初步实现真实感图形, 并实践图形的造型与变换等。

二、理论基础运用几何造型, 几何、投影及透视变换、真实感图形效果(消隐、纹理、光照等)有关知识实现。

1.用给定地形高程数据绘制出地形图;2.绘制一(套)房间,参数自定。

三. 算法设计与分析真实感图形绘制过程中, 由于投影变换失去了深度信息, 往往导致图形的二义性。

要消除这类二义性, 就必须在绘制时消除被遮挡的不可见的线或面, 习惯上称之为消除隐藏线和隐藏面, 或简称为消隐, 经过消隐得到的投影图称为物体的真实图形。

消隐处理是计算机绘图中一个引人注目的问题, 目前已提出多种算法, 基本上可以分为两大类:即物体空间方法和图象空间方法。

物体空间方法是通过比较物体和物体的相对关系来决定可见与不可见的;而图象空间方法则是根据在图象象素点上各投影点之间的关系来确定可见与否的。

用这两类方法就可以消除凸型模型、凹形模型和多个模型同时存在时的隐藏面。

1).消隐算法的实现1.物体空间的消隐算法物体空间法是在三维坐标系中, 通过分析物体模型间的几何关系, 如物体的几何位置、与观察点的相对位置等, 来进行隐藏面判断的消隐算法。

世界坐标系是描述物体的原始坐标系, 物体的世界坐标描述了物体的基本形状。

为了更好地观察和描述物体, 经常需要对其世界坐标进行平移和旋转, 而得到物体的观察坐标。

物体的观察坐标能得到描述物体的更好视角, 所以物体空间法通常都是在观察坐标系中进行的。

观察坐标系的原点一般即是观察点。

物体空间法消隐包括两个基本步骤, 即三维坐标变换和选取适当的隐藏面判断算法。

选择合适的观察坐标系不但可以更好地描述物体, 而且可以大大简化和降低消隐算法的运算。

因此, 利用物体空间法进行消隐的第一步往往是将物体所处的坐标系转换为适当的观察坐标系。

这需要对物体进行三维旋转和平移变换。

常用的物体空间消隐算法包括平面公式法、径向预排序法、径向排序法、隔离平面法、深度排序法、光线投射法和区域子分法。

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

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

计算机图形学大作业报告记录(灯光纹理映射)————————————————————————————————作者:————————————————————————————————日期:大作业报告实验课程名称:计算机图形学学生姓名:班级:学院(系):学生学号:指导教师:成绩:一、目的这次大作业是作为这学期的最后的一个考核,所以必须要用到所有的本学期学过的知识,比如怎样画出三维图形,怎样在图像上在图像上添加纹理光照,怎样使用鼠标和键盘进行人机交互等。

二、主要功能模块设计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 显示图形模块的设计:功能描述:该模块主要为所要画的图形进行描述,是绘制图形的主要函数,通过调用这个功能模块就能画出用于显示给用户的图形。

图形学实验报告

图形学实验报告

图形学实验报告图形学实验报告概述:在本次图形学实验中,我们将探索和学习计算机图形学的基本概念和技术。

通过实验,我们深入了解了图形学的原理和应用,以及如何使用计算机生成和处理图像。

实验一:像素和颜色在这个实验中,我们学习了图像是由像素组成的,每个像素都有自己的颜色值。

我们使用了Python编程语言和PIL库来创建一个简单的图像,并设置了不同的像素颜色。

通过改变像素的颜色值,我们可以创建出各种各样的图像效果。

实验二:坐标系统和变换在这个实验中,我们学习了坐标系统和图形变换。

我们使用OpenGL库来创建一个简单的二维图形,并通过平移、旋转和缩放等变换操作来改变图形的位置和形状。

这些变换操作使我们能够在屏幕上创建出各种不同的图案和效果。

实验三:线段和多边形在这个实验中,我们学习了如何使用线段和多边形来绘制图形。

我们使用了Bresenham算法来绘制直线,并学习了如何使用多边形填充算法来填充图形。

通过这些技术,我们可以创建出更加复杂和精细的图像。

实验四:光照和阴影在这个实验中,我们学习了光照和阴影的原理和应用。

我们使用了光照模型来模拟光线的传播和反射,以及计算物体的明暗效果。

通过调整光照参数和材质属性,我们可以创建出逼真的光照和阴影效果。

实验五:纹理映射和渲染在这个实验中,我们学习了纹理映射和渲染的概念和技术。

我们使用了纹理映射来将图像贴到三维物体表面,以增加物体的细节和真实感。

通过渲染技术,我们可以模拟光线的折射和反射,以及创建出逼真的材质效果。

实验六:三维建模和动画在这个实验中,我们学习了三维建模和动画的基本原理和方法。

我们使用了三维建模工具来创建三维模型,并学习了如何使用关键帧动画来实现物体的运动和变形。

通过这些技术,我们可以创建出逼真的三维场景和动画效果。

总结:通过这次图形学实验,我们深入了解了计算机图形学的原理和应用。

我们学习了像素和颜色、坐标系统和变换、线段和多边形、光照和阴影、纹理映射和渲染,以及三维建模和动画等技术。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验及课程设计:内容简介:《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》是《计算机图形学基础教程(Visual C++版)》教材的配套实验教材,提供了18个综合性教学实验和5个课程设计项目,可以满足计算机图形学课堂上机实验和设计周课程设计任务。

实验项目编排上由浅入深,通过定义基础类、直线类、变换类、填充类、光照类,最终构造了三维动态光照场景。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》的全部内容都基于MFC框架完成,彩插中展示的所有图形均使用CDC类的SetPixel()成员函数绘制,未包含任何图形学库。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》的教学实验和课程设计项目的源代码和实验拓展项目的可执行文件全部提供在笔者的个人网站上,请读者下载后参照源代码学习。

通读本书,读者可以轻松掌握柏拉图正多面体(正四面体、正六面体、正八面体、正十二面体和正二十面体)、球体、圆环等三维物体的线框模型、表面模型的建模方法。

在三维动态光照场景中,可以调整物体表面模型的材质、添加纹理细节,改变视点和光源的位置,完成三维真实感图形的动态绘制。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》内容全面、案例丰富、注重理实一体化,适合作为本科计算机图形学的实验和课程设计教材。

《高等学校计算机专业教材精选·图形图像与多媒体技术:计算机图形学实验及课程设计(Visual C++版)》为源代码提供了详尽的注释,可供计算机图形学爱好者从编程的角度理解和掌握计算机图形学原理。

计算机图形学实验报告--纹理映射

计算机图形学实验报告--纹理映射

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光照模型

计算机图形学实验报告-实验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();}编译运行得到如下结果:。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《计算机图形学》综合训练项目报告关键代码及界面展示1.源代码//头文件#ifndef GLWIDGET_H#define GLWIDGET_H#include <QtOpenGL>#include <QWidget>class GLWidget : public QGLWidget{Q_OBJECTpublic:explicit GLWidget(QGLWidget *parent = 0);~GLWidget();protected:void initializeGL();void paintGL();void resizeGL(int width, int height);void keyPressEvent(QKeyEvent *e);void loadTextures();bool fullscreen;GLuint texture[3];private:float rotate_angle;float zoom;float rotate_speed;int filter;bool light;bool blend;};#endif // GLWIDGET_H//主函数#include "glwidget.h"#include <QApplication>#include <QGraphicsView>#include <QGraphicsScene>#include <QGraphicsItem>int main(int argc, char *argv[]){QApplication a(argc, argv);GLWidget w;w.show();return a.exec();}//程序主要代码void GLWidget::initializeGL(){setGeometry(300, 150, 500, 500);//设置窗口初始位置和大小loadTextures();glEnable(GL_TEXTURE_2D);//允许采用2D纹理技术glShadeModel(GL_SMOOTH);//设置阴影平滑模式glClearColor(0.0, 0.0, 0.0, 0);//改变窗口的背景颜色,不过我这里貌似设置后并没有什么效果glClearDepth(1.0);//设置深度缓存glEnable(GL_DEPTH_TEST);//允许深度测试glDepthFunc(GL_LEQUAL);//设置深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);//进行透视校正/*opengl中支持8个光源,即GL_LIGHT0~GL_LIGHT7*/glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);//指定光源1的环境光参数glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);//指定光源1的漫射光参数glLightfv(GL_LIGHT1, GL_POSITION, light_position);//指定光源1的位置glEnable(GL_LIGHT1);//允许光源1的使用// glEnable(GL_LIGHTING);//我们还需要启动总光源开关,默认的时候不开,后面的L键来控制开启和关闭glColor4f(1.0, 1.0, 1.0, 0.5);//后面的步骤都是以全亮绘制物体,并且50%的透明度glBlendFunc(GL_SRC_ALPHA, GL_ONE);}void GLWidget::paintGL(){//glClear()函数在这里就是对initializeGL()函数中设置的颜色和缓存深度等起作用glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/*下面开始画立方体,并对其进行纹理映射*/glLoadIdentity();glTranslatef(0.0, 0.0, zoom);glRotatef(rotate_angle, -0.4f, 0.4f, -1.0f);glBindTexture(GL_TEXTURE_2D, texture[filter]);//这句代码一定要,因为在initializeGL()函数中已绑定一个固定的纹理目标了glBegin(GL_QUADS);//上顶面glNormal3f(0.0, 1.0, 0.0);//该函数指定是法线的方向为向量(x, y, z)方向,在使用光源且对空间物体进行纹理映射时,每个面都需要指定其法线的方向,否则会出现各种意外的结果。

glTexCoord2f(0.0, 1.0);//将2D的纹理坐标映射到3D的空间物体表面上glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, -1.0f);//下顶面glNormal3f(0.0, -1.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, -1.0f, -1.0f);//正前面glNormal3f(0.0, 0.0, 1.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, 1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, 1.0f);//右侧面glNormal3f(1.0, 0.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(1.0f, 1.0f, 1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(1.0f, 1.0f, -1.0f);//背后面glNormal3f(0.0, 0.0, -1.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(1.0f, 1.0f, -1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(-1.0f, -1.0f, -1.0f);//左侧面glNormal3f(-1.0, 0.0, 0.0);glTexCoord2f(0.0, 1.0);glVertex3f(-1.0f, 1.0f, -1.0f);glTexCoord2f(0.0, 0.0);glVertex3f(-1.0f, -1.0f, -1.0f);glTexCoord2f(1.0, 0.0);glVertex3f(-1.0f, -1.0f, 1.0f);glTexCoord2f(1.0, 1.0);glVertex3f(-1.0f, 1.0f, 1.0f);glEnd();rotate_angle += rotate_speed;}void GLWidget::resizeGL(int width, int height){if(0 == height)height = 1;//防止一条边为0glViewport(0, 0, (GLint)width, (GLint)height);//重置当前视口,本身不是重置窗口的,只不过是这里被Qt给封装好了glMatrixMode(GL_PROJECTION);//选择投影矩阵glLoadIdentity();//重置选择好的投影矩阵gluPerspective(45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0);//建立透视投影矩阵glMatrixMode(GL_MODELVIEW);//以下2句和上面出现的解释一样glLoadIdentity();}void GLWidget::keyPressEvent(QKeyEvent *e){switch(e->key()){/*L键位开启光照的开关*/case Qt::Key_L:light = !light;if(!light)glDisable(GL_LIGHTING);glEnable(GL_LIGHTING);updateGL();break;/*B键位选择是否采用色彩融合*/case Qt::Key_B:blend = !blend;if(blend){glEnable(GL_BLEND);glDisable(GL_DEPTH_TEST);}else{glDisable(GL_BLEND);glEnable(GL_DEPTH_TEST);}updateGL();break;/*F键位选择纹理滤波的方式*/case Qt::Key_F:filter += 1;if(filter > 2)filter = 0;updateGL();break;/*PageUp键为将木箱移到屏幕内部方向*/ case Qt::Key_PageUp:zoom -= 0.2;updateGL();break;/*PageDown键为将木箱移到屏幕外部方向*/ case Qt::Key_PageDown:zoom += 0.2;updateGL();break;/*Up键为加快立方体旋转的速度*/case Qt::Key_Up:rotate_speed += 1.0;updateGL();break;/*Down键为减慢立方体旋转的速度*/case Qt::Key_Down:rotate_speed -= 1.0;updateGL();/*F1键为全屏和普通屏显示切换键*/case Qt::Key_F1:fullscreen = !fullscreen;if(fullscreen)showFullScreen();else{setGeometry(300, 150, 500, 500);showNormal();}updateGL();break;/*Ese为退出程序键*/case Qt::Key_Escape:close();}}/*加载纹理*/void GLWidget::loadTextures(){QImage tex, buf;if(!buf.load(":resources/c.jpg"))// if(!buf.load(":resources/c.jpg")){qWarning("Cannot open the image...");QImage dummy(128, 128, QImage::Format_RGB32);//当没找到所需打开的图片时,创建一副128*128大小,深度为32位的位图dummy.fill(Qt::green);buf = dummy;}tex = convertToGLFormat(buf);//将Qt图片的格式buf转换成opengl的图片格式texglGenTextures(3, &texture[0]);//开辟3个纹理内存,索引指向texture[0] /*建立第一个纹理*/glBindTexture(GL_TEXTURE_2D, texture[0]);glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);/*建立第二个纹理*/glBindTexture(GL_TEXTURE_2D, texture[1]);glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);/*建立第三个纹理*/glBindTexture(GL_TEXTURE_2D, texture[2]);gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, tex.width(), tex.height(), GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());//该函数对所加载的纹理像素没有要求是2的n次方,可以是任意的像素glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);//mipmap方式是当物体很远时,也能保留很好的细节,所以它的运算量很大,速度很慢,这里GL_LINEAR_MIPMAP_NEAREST是混合使用}2.界面展示。

相关文档
最新文档