几何图形变换实验_计算机专业_OpenGL实验_Exp

合集下载

实验 OpenGL几何变换

实验 OpenGL几何变换

实验OpenGL几何变换1.实验目的:理解掌握一个OpenGL程序平移、旋转、缩放变换的方法。

2.实验内容:(1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法;(2)根据示范代码,尝试完成实验作业;3.实验原理:(1)OpenGL下的几何变换在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。

平移矩阵构造函数为glTranslate<f,d>(tx, ty, tz),作用是把当前矩阵和一个表示移动物体的矩阵相乘。

tx, ty,tz指定这个移动物体的矩阵,它们可以是任意的实数值,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维应用来说,tz=0.0。

旋转矩阵构造函数为glRotate<f,d>(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。

theta, vx, vy, vz指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数theta表示旋转的角度。

向量v=(vx, vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的方向,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维旋转来说,vx=0.0,vy=0.0,vz=1.0。

缩放矩阵构造函数为glScale<f,d>(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。

sx, sy,sz指定这个缩放物体的矩阵,分别表示在x,y,z方向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为f(单精度浮点float)或d(双精度浮点double)。

注意这里都是说“把当前矩阵和一个表示移动<旋转, 缩放>物体的矩阵相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。

实验报告几何变换实验

实验报告几何变换实验

实验报告几何变换实验实验报告:几何变换实验引言:几何变换是计算机图形学中的重要概念,它可以改变图像的形状、位置和大小。

在本次实验中,我们将通过对几何变换的实际操作,深入了解几何变换的原理和应用。

一、实验目的本次实验的主要目的是探究几何变换在图像处理中的应用,具体包括平移、旋转、缩放和翻转等几何变换操作。

通过实际操作和观察,我们将了解几何变换对图像的影响,并学习如何使用计算机编程实现这些变换。

二、实验材料和方法1. 实验材料:- 一台计算机- 图像处理软件(如Photoshop、GIMP等)- 编程软件(如Python、MATLAB等)2. 实验方法:- 步骤一:选择一张图片作为实验对象,并导入到图像处理软件中。

- 步骤二:使用图像处理软件进行平移操作,观察图像的位置变化。

- 步骤三:使用图像处理软件进行旋转操作,观察图像的旋转效果。

- 步骤四:使用图像处理软件进行缩放操作,观察图像的大小变化。

- 步骤五:使用图像处理软件进行翻转操作,观察图像的翻转效果。

- 步骤六:使用编程软件编写程序,实现上述几何变换操作,并观察结果。

三、实验结果与分析1. 平移操作:在实验中,我们发现通过平移操作,可以将图像在水平和垂直方向上进行移动。

通过调整平移的距离和方向,我们可以改变图像在画布上的位置。

这种操作常用于图像的对齐和拼接等应用中。

2. 旋转操作:旋转操作可以改变图像的角度和方向。

通过调整旋转的角度和中心点,我们可以使图像以不同的角度进行旋转。

这种操作常用于图像的矫正、仿射变换等应用中。

3. 缩放操作:缩放操作可以改变图像的大小。

通过调整缩放的比例,我们可以使图像变得更大或更小。

这种操作常用于图像的放大、缩小、裁剪等应用中。

4. 翻转操作:翻转操作可以改变图像的方向。

通过水平或垂直翻转,我们可以使图像在左右或上下方向发生镜像反转。

这种操作常用于图像的镜像处理、对称效果等应用中。

四、实验总结通过本次实验,我们深入了解了几何变换在图像处理中的应用。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。

通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。

在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。

首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。

这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。

然后,在实验中我们学习了图形的变换。

变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。

我们可以通过平移、旋转、缩放等变换来改变图形。

变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。

在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。

变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。

最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。

在实验中,我们学习了透视投影和正交
投影两种方式。

透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。

而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。

在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。

通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。

在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。

计算机图形学-几何变换实验报告

计算机图形学-几何变换实验报告
// 右上:右视图 glViewport(win_width/2, win_height/2, win_width/2, win_height/2); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-3.0, 3.0, -3.0, 3.0, 1.0, 50.0); gluLookAt (5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glCallList(object);
// 左下:前视图 glViewport(0, 0, win_width/2, win_height/2); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70.0, 1.0, 1, 50); gluLookAt (0.0, 0.0, 4.5, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef (30.0, 1.0, 0.0, 0.0); glRotatef (Angle, 0.0, 0.0, 0.0); glCallList(object); glFlush(); glutSwapBuffers();
// 右下:旋转的透视视区 glViewport(win_width/2, 0, win_width/2, win_height/2); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(70.0, 1.0, 1, 50); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef (30.0, 1.0, 0.0, 0.0); glRotatef (Angle, 0.0, 1.0, 0.0); glCallList(object); glFlush(); glutSwapBuffers(); }

北方工业大学 计算机图形学实验 几何变换

北方工业大学 计算机图形学实验  几何变换

北方工业大学计算机图形学课程实验报告题目:实验二几何变换学院:专业:指导教师:学生班级:学生学号:学生姓名:教师评定:学号:班级:姓名:实验报告二几何变换实验一.实验目的1.熟悉OpenGL图形库;2.掌握几何变换算法。

二.实验环境1.软件环境:操作系统:Win7应用软件:VC6.0,OpenGL2.硬件环境CPU:显卡:三.用矩阵计算实现二维几何变换写程序实现基本矩阵运算,同时实现平移、放缩、旋转等几何变换。

要求自己设计实例验证平移、放缩、旋转函数,采用键盘交互。

已给出二维点坐标结构体、单位矩阵赋值函数。

已给出:二维点坐标结构体struct Point2D{float x, y;}已给出:宏定义3×3数组typedef float Matrix3x3 [3][3];Matrix3x3 matComposite;已给出:单位矩阵赋值函数void matrix3x3SetIdentity(Matrix3x3 matIdent3x3){int row, col;for(row=0; row<3;row++){for(col=0; col<3; col++){matIdent3x3[row][col] = (row==col);}}}要求给出以下函数及实例截图。

1.矩阵左乘运算函数Void matrix3x3PreMultiply(Matrix3x3 m1, Matrix3x3 m2){int row, col;Matrix3x3 temp;for(row=0; row<3;row++){for(col=0; col<3; col++){temp[row][col] = m1[row][0]*m2[0][col] +m1[row][1]*m2[1][col] + m1[row][2]*m2[2][col];}}for(row=0; row<3;row++){for(col=0; col<3; col++){m2[row][col]=temp[row][col];}}2.平移函数void Translate2D (float tx, float ty){Matrix3x3 matTransl;matrix3x3SetIdentity (matTransl);matTransl[0][2]=tx;matTransl[1][2]=ty;matrix3x3PreMultiply(matTransl,matComposite);}3.顶点矩阵左乘合成函数void TransformVerts2D(int nVerts,Point2D * verts){GLint k;GLfloat temp1, temp2;for (k=0;k<nV erts; k++){temp1=matComposite [0][0]*verts[k].x + matComposite[0][1]*verts[k].y + matComposite [0][2];temp2=matComposite [1][0]*verts[k].x + matComposite[1][1]*verts[k].y+matComposite [1][2];verts[k].x=temp1;verts[k].y=temp2;}}4.绘制三角形函数void RenderTriangle (Point2D* verts){int k;glBegin (GL_TRIANGLES);for (k=0;k<3;k++){glVertex2f(verts[k].x,verts[k].y);}glEnd();}5.旋转函数void Rotate2D (Point2D fixedPt, float theta){Matrix3x3 matRot;matrix3x3SetIdentity (matRot);matRot [0][0]=cos(theta);matRot [0][1]=-sin (theta);matRot [0][2]=fixedPt.x*(1-cos (theta))+fixedPt.y*sin(theta);matRot [1][0]=sin (theta);matRot [1][1]=cos (theta);matRot [31][2]=fixedPt.x*(1-cos (theta))-fixedPt.y*sin(theta);matrix3x3PreMultiply(matRot,matComposite);}6.缩放函数void scale2D (GLfloat sx,GLfloat sy,wcPt2D fixedPt){ Matrix3x3 matScale;matrix3x3SetIdentity(matScale);matScale [0][0]=sx;matScale [0][2]=(1-sx)*fixedPt.x;matScale [1][1]=sy;matScale [1][2]=(1-sy)*fixedPt.y;matrix3x3PreMultiply(matScale,matComposite); }7.平移实例及截图8.旋转实例及截图9.缩放实例及截图四.用OpenGL函数库实现几何图元旋转特效在Nehe教程Lesson04基础上,修改程序,在屏幕上画两个三角形、两个四边形,并完成相应动画效果,三角形A绕X轴旋转,三角形B绕Y轴旋转,四边形C绕Z轴旋转,四边形D绕X轴旋转。

几何图形变形实训报告

几何图形变形实训报告

几何图形变形实训报告几何图形变形实训报告一、实训概述本次实训内容为几何图形变形,主要包括平移、旋转和缩放等几种常见的图形变形方式。

实训目的是通过实际操作,加深对几何图形变形的理解和应用,提高实践能力。

二、实训过程1. 平移变形首先,我们选择一个简单的图形,比如正方形,使用尺子和铅笔在纸上画出一个正方形。

然后,在尺子的辅助下,将图形沿着一个方向(比如向右)平移一段距离,并用铅笔画出平移后的图形。

我们重复这个过程,将图形平移至不同位置,观察图形的变化。

通过实践,我们发现,平移变形并没有改变图形的形状和大小,只是改变了图形的位置。

2. 旋转变形接下来,我们选择一个三角形,并在纸上画出三角形的样子。

然后,我们使用斜尺作为旋转角的辅助工具,在图形的一个顶点上固定斜尺,并以这个顶点为中心,以一定角度将图形旋转。

在每次旋转之后,我们都使用铅笔画出旋转后的图形。

通过实践,我们发现,旋转变形使图形保持了形状和大小不变,只是改变了图形的方向。

3. 缩放变形最后,我们选择一个圆形,并在纸上画出圆形的样子。

然后,我们使用尺子作为辅助工具,在图形的中心点上固定尺子,并将尺子的一段放在圆形上,然后围绕中心点进行缩放。

在每次缩放之后,我们使用铅笔画出缩放后的图形。

通过实践,我们发现,缩放变形改变了图形的大小,但保持了图形的形状。

三、实训感悟通过这次实训,我对几何图形的变形有了更深入的理解。

平移变形、旋转变形和缩放变形是我们日常生活中常见的变形方式,而这次实训让我亲身体验了这些变形的过程,加深了对几何图形变形的认识。

同时,这次实训也让我意识到几何图形变形在实际生活中的应用广泛,比如建筑设计、机械制造等领域都离不开几何图形变形的运用。

四、实践意义几何图形变形是数学中的重要内容,而通过实际操作,我们可以更好地理解和应用这些概念和方法。

几何图形变形在实际生活和工作中有着广泛的应用,比如建筑设计、艺术创作等领域都需要运用几何图形变形的知识。

实验三 几何图形变换实验

实验三 几何图形变换实验
这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。
另一个函数是:
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);//使用双缓存模式
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
三、实验内容
1、下面的代码采用GLUT库,使用了双缓存,在按下鼠标左键后,程序在空闲时一直不停地调用spinDisplay函数,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动)。请修改代码,实现矩形在窗口内沿着水平线移动。
/*
* double.c

计算机图形学 实验 利用OpenGL实现图形的平移、旋转、缩放

计算机图形学 实验 利用OpenGL实现图形的平移、旋转、缩放

XXXXXXXX大学(计算机图形学)实验报告实验名称利用OpenGL实现图形的平移、旋转、缩放实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:1.了解OpenGL下简单图形的平移、旋转、缩放变换的编程的基本思想;2.掌握OpenGL下简单图形的平移、旋转、缩放变换的编程的基本步骤;二、实验原理:在OpenGL中,可以使用下面三个函数便捷地实现简单图形平移、旋转、缩放变换的功能:glRotatef(theta, vx, vy, vz);glTranslatef(dx, dy, dz);glScalef(sx,sy,sz);三、实验内容:// 1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "glut.h"#include "math.h"void display(){glClear( GL_COLOR_BUFFER_BIT); // Clear the frame bufferglColor3f( 0.0, 1.0, 1.0); // Set current color to greenglBegin( GL_POL YGON); // Draw the triangleglVertex2f( 0.0, -0.2);glVertex2f( 0.2, 0.0);glVertex2f( 0.0, 0.0);glEnd();glFlush();}void dsp()glClear( GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Clear the frame bufferglColor3f( 0.0, 1.0, 1.0); // Set current color to greendisplay();//-------------------------- //平移glPushMatrix();glTranslatef(0.5,0.5,0.0);display();glPopMatrix();//-------------------------- //缩放glPushMatrix();glScalef(0.5,0.5,0.0);display();glPopMatrix();//-------------------------- //旋转glPushMatrix();glRotatef(60,0.0,0.0,1.0);display();glPopMatrix();}void init(){glClearColor( 0.0, 0.0, 0.0, 0.0); // Set the clear color to black// Specify the boundaries of the viewing windowglMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0); // The para are: (left, right, bottom, top)glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);glEnable(GL_DEPTH_TEST);glutCreateWindow("simple");glutDisplayFunc(dsp);init();glutMainLoop();return 0;原图:平移:缩放:旋转:四、实验总结:1.在分别查看图像的平移、缩放、旋转中的其中一个功能时,需要将其他两个的代码注释掉,否则只会显示旋转一个功能。

计算机图形学OpenGL版实验1-4

计算机图形学OpenGL版实验1-4

实验1 OpenGL初识一、实验目的:熟悉编程环境;了解光栅图形显示器的特点;了解计算机绘图的特点;利用VC+OpenGL作为开发平台设计程序,以能够在屏幕上生成任意一个像素点为本实验的结束。

二、实验内容:(1)了解和使用VC的开发环境,理解简单的OpenGL程序结构。

(2)掌握OpenGL提供的基本图形函数,尤其是生成点的函数。

三、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点,如图所示。

下面对各行语句进行说明:首先,需要包含头文件#include <GL/glut.h>,这是GLUT的头文件。

然后看main函数。

int main(int argc, char *argv[]),这个是带命令行参数的main函数。

这种以glut开头的函数都是GLUT工具包所提供的函数,下面对用到的几个函数进行介绍;1)glutInit,对GLUT进行初始化,这个函数必须在其它的GLUT使用之前调用一次。

其格式比较固定,一般都是glutInit(&argc, argv)就行;2) glutInitDisplayMode,设置显示方式,其中GLUT_RGB表示使用RGB颜色,与之对应的还有GLUT_INDEX(表示使用索引颜色)。

GLUT_SINGLE表示使用单缓冲,与之对应的还有GLUT_DOUBLE(使用双缓冲)。

更多信息,以后的实验教程会有讲解介绍;3) glutInitWindowPosition,设置窗口在屏幕中的位置;4) glutInitWindowSize,设置窗口的大小;5) glutCreateWindow,根据前述设置的信息创建窗口。

参数将被作为窗口的标题。

注意:窗口被创建后,并不立即显示到屏幕上。

需要调用glutMainLoop才能看到窗口;6) glutDisplayFunc,设置一个函数,当需要进行画图时,这个函数就会被调用。

(暂且这样理解);7) glutMainLoop,进行一个消息循环。

广工图形学实验基本图形几何变换的OpenGL实现

广工图形学实验基本图形几何变换的OpenGL实现

计算机学院计算机科学与技术专业班学号姓名协作者教师评定实验二基本图形几何变换的OpenGL实现1、实验目的与要求1.通过实验掌握OpenGL中的三种基本图形几何变换;2.通过实验掌握例子lesson4.c,并验证两种OpenGL基本图形几何变换,即平移、旋转;3.通过实验设计修改例子lesson4.c的参数,分别达到以下要求:(1)三角形旋转的速度是正方形旋转速度的两倍;(2)三角形每旋转到一周(2∏)后,反向旋转;4.验证并解释矩阵堆栈的作用,即注释掉语句:观察实验结果,并作出分析和解释。

2、实验方案1.在程序中,设置了两个全局变量rtri和rquad,这个是用来分别控制三角形和四边形的旋转速度的;其中角度增加的话,图形是逆时针方向转动;角度减小的话,图形是顺时针方向旋转。

2.实现实验1:1)让rtri的值自增1.22)让rquad的值自增0.63)这样子就实现了三角形速度是正方形的两倍,应为rtri每转动1.2度时,rquad才转动0.6度。

3.实现实验21)在实验1的基础上增加了一些判断语句。

2)判断rtri的值是否大于360,如果大于了,就设置为0,然后就执行自减,直到小于-360。

3)判断rtri的值是否小于-360,如果小于了,就设置为0,然后就执行自增,直到大于360。

4)不断地重复1)和2),从而实现了三角形每旋转到一周(2∏)后,反向旋转;3、实验结果和数据处理1.实验1实验结果:1)实验中修改过的函数void display ( void ) // Create The Display Function{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth BufferglLoadIdentity(); // Reset The Current Modelview MatrixglPushMatrix();glTranslatef(-1.5f,0.0f,-6.0f); // Move Left 1.5 Units And Into TheScreen 6.0glRotatef(rtri,0.0f,1.0f,0.0f); // Rotate The Triangle On The Y axis glBegin(GL_TRIANGLES); // Drawing Using Triangles glColor3f(1.0f,0.0f,0.0f); // Set The Color To RedglV ertex3f( 0.0f, 1.0f, 0.0f); // TopglColor3f(0.0f,1.0f,0.0f); // Set The Color To GreenglV ertex3f(-1.0f,-1.0f, 0.0f); // Bottom LeftglColor3f(0.0f,0.0f,1.0f); // Set The Color To BlueglV ertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglEnd(); // Finished Drawing The TriangleglPopMatrix(); //在此恢复矩阵,这样才不会影响正方形的旋转//glLoadIdentity();// Reset The Current Modelview Matrix//平移与平移,旋转与旋转之间是会相互影响的!!!glTranslatef(1.5f,0.0f,-6.0f); // Move Right 1.5 Units And Into The Screen 6.0glRotatef(rquad,0.0f,1.0f,0.0f); // Rotate The Quad On The X axisglColor3f(0.5f,0.5f,1.0f); // Set The Color To Blue One Time OnlyglBegin(GL_QUADS); // Draw A Quad glV ertex3f(-1.0f, 1.0f, 0.0f); // Top LeftglV ertex3f( 1.0f, 1.0f, 0.0f); // Top RightglV ertex3f( 1.0f,-1.0f, 0.0f); // Bottom RightglV ertex3f(-1.0f,-1.0f, 0.0f); // Bottom LeftglEnd(); // Done Drawing The Quad //glPopMatrix();rtri+=1.2f; // Increase The Rotation V ariable For The Triangle ( NEW )rquad-=0.6f; // Decrease The Rotation V ariable For The Quad ( NEW )//printf("\n%f:",rtri);glutSwapBuffers ( );// Swap The Buffers To Not Be Left With A Clear Screen}2)实验结果截屏显示:○1正面时候的截图:○2转动一定角度之后的截图:3)结果分析实验结果与实验要求一致,报告里面无法展示实验的动态旋转图,只是某个状态图截图了,但是实验结果是:三角形的旋转速度是正方形的两倍。

关于opengl实验报告

关于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 图形基本变换

OpenGL 图形基本变换

实验名称OpenGL 图形基本变换一、实验目的学习基于OpenGL的图形基本变换的原理与实现方法。

二、实验内容利用前面实验生成的应用程序,编写新的函数实现基本图形的平移、缩放、旋转等操作,并分析结果正确与否。

三、实验步骤1、添加相应的函数,实现前面所绘制的人像图形的平移、缩放、旋转。

2、编写菜单控制程序,实现上述功能的选择操作。

实验代码及程序运行结果截图如下:在没有使用菜单控制时的平移、缩放、旋转:// 2008.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "gl/glut.h"#include "math.h"void head();void display(){glClear( GL_COLOR_BUFFER_BIT);head();glPushMatrix();glRotatef( 45.0, 0.0, 0.0, 1.0);head();glPopMatrix();glPushMatrix();glTranslatef( -2.0, -1.0, 0.0);glScalef( 1.5, 2.0, 1.0);head();glPopMatrix();glColor3f( 1.0, 1.0, 1.0);head();}void head(){glColor3f( 1.0, 0.0, 0.0);glBegin( GL_POLYGON); //Draw the mouth画嘴glVertex2f( 0.53, 0.16);glVertex2f( 0.67, 0.17);glVertex2f( 0.72, 0.25);glVertex2f( 0.45, 0.22);glEnd();glBegin( GL_TRIANGLES); //Draw the nose画鼻子glColor3f( 1.0, 1.0, 0.0);glVertex2f( 0.58, 0.52);glVertex2f( 0.5, 0.3);glVertex2f( 0.66, 0.3);glEnd();glBegin(GL_TRIANGLE_FAN); //Draw the hear 画头发glColor3f( 0.4, 0.2, 0.1);glVertex2f( 0.7, 0.95);glVertex2f( 0.3, 0.9);glVertex2f(0.15, 0.65);glVertex2f( 0.55, 0.75);glVertex2f( 0.6, 0.6);glVertex2f( 0.8, 0.75);glVertex2f( 0.99, 0.7);glEnd();glBegin(GL_LINE_STRIP ); //Draw the face画脸glColor3f( 0.5,0.5, 0.5);glVertex2f( 0.25, 0.68);glVertex2f( 0.30, 0.23);glVertex2f( 0.6,0.05);glVertex2f( 0.85,0.23);glVertex2f(0.89,0.72);glEnd();glBegin( GL_LINES);//Draw the eyebrow画眉毛glColor3f( 0.0, 1.0, 1.0);glBegin( GL_LINES);glVertex2f( 0.35, 0.60);glVertex2f( 0.50, 0.55);glVertex2f( 0.65, 0.55);glVertex2f( 0.8, 0.60);glEnd();glPointSize(7.0); //Draw the eyes 画眼glColor3f( 0.0, 1.0, 1.0);glBegin(GL_POINTS);glVertex2f( 0.42,0.50);glVertex2f( 0.73,0.51);glEnd();glFlush();}void init(){glClearColor( 0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-2.0, 2.0, -2.0, 2.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit( &argc, argv);glutInitWindowPosition( 200, 100);glutInitWindowSize(800,800);glutCreateWindow( "Green Triangle");glutDisplayFunc( display);init();glutMainLoop();return 0;}在使用菜单控制时的平移、缩放、旋转:// yd.cpp : Defines the entry point for the console application. //#include "stdafx.h"#include"gl\glut.h"#include"math.h"void display();void init();void display1() //平移操作{glClear( GL_COLOR_BUFFER_BIT);glPushMatrix();glTranslatef( -0.8 ,-0.8, -0.8);display();glPopMatrix();glEnd();glFlush();}void display2() //缩放操作{glClear( GL_COLOR_BUFFER_BIT);display();glPushMatrix();glScalef( 1.5-0.9, 2.0-0.9,1.0*5);display();glPopMatrix();glEnd();glFlush();}void display3() // 旋转操作{glClear( GL_COLOR_BUFFER_BIT);display();glPushMatrix();glRotatef( 180, 0.0, 0.0, 2.0);display();glPopMatrix();glEnd();glFlush();//}void menuf( int i){if (i == 1){display1();}else if (i == 2){display2();}else if (i == 3){}}void keyboard(unsigned char key,int x,int y){init();if(key=='q'||key=='Q') exit(0);display1();display2();display3();}void display(){glClear( GL_COLOR_BUFFER_BIT);glColor3f( 1.0, 0.0, 0.0);glBegin( GL_POLYGON); //Draw the mouth画嘴glVertex2f( 0.53, 0.16);glVertex2f( 0.67, 0.17);glVertex2f( 0.72, 0.25);glVertex2f( 0.45, 0.22);glEnd();glBegin( GL_TRIANGLES); //Draw the nose画鼻子glColor3f( 1.0, 1.0, 0.0);glVertex2f( 0.58, 0.52);glVertex2f( 0.5, 0.3);glVertex2f( 0.66, 0.3);glEnd();glBegin(GL_TRIANGLE_FAN); //Draw the hear 画头发glColor3f( 0.4, 0.2, 0.1);glVertex2f( 0.7, 0.95);glVertex2f( 0.3, 0.9);glVertex2f(0.15, 0.65);glVertex2f( 0.55, 0.75);glVertex2f( 0.6, 0.6);glVertex2f( 0.8, 0.75);glVertex2f( 0.99, 0.7);glEnd();glBegin(GL_LINE_STRIP ); //Draw the face画脸glColor3f( 0.5,0.5, 0.5);glVertex2f( 0.25, 0.68);glVertex2f( 0.30, 0.23);glVertex2f( 0.6,0.05);glVertex2f( 0.85,0.23);glVertex2f(0.89,0.72);glEnd();glBegin( GL_LINES);//Draw the eyebrow画眉毛glColor3f( 0.0, 1.0, 1.0);glBegin( GL_LINES);glVertex2f( 0.35, 0.60);glVertex2f( 0.50, 0.55);glVertex2f( 0.65, 0.55);glVertex2f( 0.8, 0.60);glEnd();glPointSize(7.0); //Draw the eyes 画眼glColor3f( 0.0, 1.0, 1.0);glBegin(GL_POINTS);//glBegin(GL_POINT_SMOOTH);glVertex2f( 0.42,0.50);glVertex2f( 0.73,0.51);glEnd();glFlush();}void init() {glClearColor( 0.0, 0.0, 0.0, 1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char* argv[]){glutInit( &argc, argv);glutInitWindowSize( 400, 400);glutInitWindowPosition( 200, 200);glutCreateWindow( "图形基本变化");glutCreateMenu( menuf );glutAddMenuEntry("平移操作", 1);glutAddMenuEntry("缩放操作", 2);glutAddMenuEntry("旋转操作", 3);glutAttachMenu( GLUT_RIGHT_BUTTON);glutDisplayFunc( display);glutDisplayFunc( display1);glutDisplayFunc( display2);glutDisplayFunc( display3);glutKeyboardFunc(keyboard);init();glutMainLoop();return 0;}。

Opengl实验报告及源代码实验五 几何变换

Opengl实验报告及源代码实验五  几何变换

实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:2018.11 实验成绩:一、实验名称实验五几何变换二、实验内容1.编写程序绘制若干三维物体,将其放置在场景的不同位置,并让物体绕自身的某条轴做旋转运动;2.编写一个可在三维场景中自由移动和改变观察方向的摄像机,利用键盘和鼠标控制摄像机实现三维场景的动态漫游。

三、实验目的1.了解缩放、平移和旋转等模型变换的实现原理,掌握模型变换矩阵的使用方法,能够利用模型变换建立三维场景;2.了解视点变换的实现原理,掌握视点变换与摄像机功能的具体关系和利用视点变换矩阵构造摄像机的具体方法。

3.了解投影变换和视口变换的实现原理,掌握投影变换与视口变换在场景缩放和显示中的作用。

四、实验步骤1.建立立方体几何模型。

定义立方体顶点的位置坐标和纹理坐标,设置不同立方体在世界坐标系中的位置。

// Set up vertex data and attribute pointersGLfloat vertices[] = {-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,0.5f, -0.5f, -0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 1.0f,-0.5f, 0.5f, 0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, -0.5f, 1.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, 0.5f, 0.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,0.5f, -0.5f, 0.5f, 1.0f, 0.0f,-0.5f, -0.5f, 0.5f, 0.0f, 0.0f,-0.5f, -0.5f, -0.5f, 0.0f, 1.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f,0.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.5f, 0.5f, 0.5f, 1.0f, 0.0f,-0.5f, 0.5f, 0.5f, 0.0f, 0.0f,-0.5f, 0.5f, -0.5f, 0.0f, 1.0f };// World space positions of our cubes glm::vec3 cubePositions[] = {glm::vec3(0.0f, 0.0f, 0.0f),glm::vec3(2.0f, 5.0f, -15.0f),glm::vec3(-1.5f, -2.2f, -2.5f),glm::vec3(-3.8f, -2.0f, -12.3f),glm::vec3(2.4f, -0.4f, -3.5f),glm::vec3(-1.7f, 3.0f, -7.5f),glm::vec3(1.3f, -2.0f, -2.5f),glm::vec3(1.5f, 2.0f, -2.5f),glm::vec3(1.5f, 0.2f, -1.5f),glm::vec3(-1.3f, 1.0f, -1.5f)};2.加载立方体模型的顶点数据。

opengl算法学习---图形几何变换

opengl算法学习---图形几何变换

opengl算法学习---图形⼏何变换图形⼏何变换图形变换是计算机图形学中的⼀个重要内容。

通过对简单图形进⾏多种变换和组合,可以形成⼀个复杂图形,这些操作也⽤于将世界坐标系中的场景描述转换为输出设备上的观察显⽰中。

应⽤于对象⼏何描述并改变它的位置、⽅向或⼤⼩等⼏何信息的操作称为⼏何变换(Geometric Transformation)。

这种变换⼀般维持图形的拓扑关系(构成规则)不变,只改变图形的⼏何关系(⼤⼩、形状及相对位置),主要包括平移、放缩、旋转及投影等操作。

平移变换\[P=\begin{bmatrix} x \\ y \end{bmatrix} {P}'=\begin{bmatrix} {x}' \\ {y}' \end{bmatrix} T=\begin{bmatrix} t_{x} \\ t_{y} \end{bmatrix}\]\[{P}'=P+T \]通过齐次坐标变换矩阵表⽰\[{P}'=\begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix}1 & 0 & t_{x}\\ 0 & 1 & t_{y} \\ 0 & 0& 1 \end{bmatrix}\cdot\begin{bmatrix}x\\ y \\ 1 \end{bmatrix}= T(t_{x},t_{y})\cdot P \]绕坐标原点的旋转变换旋转⾓定向:逆时针为正,顺时针为负\[cos(\alpha + \theta )= cos(\alpha)cos(\theta) - sin(\alpha)sin(\theta) \]\[sin(\alpha + \theta )= sin(\alpha)cos(\theta) + cos(\alpha)sin(\theta) \]\[OA=\begin{bmatrix} rcos(\alpha) \\ rsin(\alpha) \end{bmatrix} OB=\begin{bmatrix} rcos(\alpha + \theta ) \\ rsin(\alpha + \theta ) \end{bmatrix} T=\begin{bmatrix} cos\theta & -sin\theta \\ sin\theta & cos\theta \end{bmatrix}\]\[OB=OA \cdot T \]通过齐次坐标变换矩阵表⽰\[{P}'=\begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix}cos \theta & -sin \theta & 0\\ sin \theta & cos \theta & 0 \\ 0 & 0& 1\end{bmatrix}\cdot\begin{bmatrix}x\\ y \\ 1 \end{bmatrix}= R(\theta) \cdot P \]以坐标原点为基准点的缩放变换\[{x}'=x \cdot s_{x} \]\[{y}'=y \cdot s_{y} \]\[{P}'=\begin{bmatrix}{x}'\\ {y}' \end{bmatrix} =\begin{bmatrix}s_{x} & 0\\ 0 & s_{y} \end{bmatrix}\cdot\begin{bmatrix}x\\ y \end{bmatrix}= s \cdot P\]通过齐次坐标变换矩阵表⽰\[{x}'=x \cdot s_{x} \]\[{y}'=y \cdot s_{y} \]\[{P}'=\begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix} s_{x} & 0 & 0\\ 0 & s_{y} & 0 \\ 0 & 0& 1 \end{bmatrix}\cdot\begin{bmatrix}x\\ y \\ 1 \end{bmatrix}= S(S_{x},s_{y}) \cdot P \]反射变换产⽣对象镜像的变换称为反射(reflection),变换通过将对象绕反射轴旋转180°来⽣成反射镜像1 相对于x轴的反射\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix} =\begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]2 相对于y轴的反射\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix}= \begin{bmatrix} -1 & 0 \\ 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]3 相对于坐标原点的反射\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix}= \begin{bmatrix} -1 & 0 \\ 0 & -1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]通过齐次坐标变换矩阵表⽰\[{P}'=\begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix} a & b & 0\\ c & d & 0 \\ 0 & 0& 1 \end{bmatrix} \cdot \begin{bmatrix}x\\ y \\ 1 \end{bmatrix} =R(a,b,c,d) \cdot P \]4 相对于任意点的反射\[{P}'=\begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix} -1 & 0 & 2u\\ 0 & -1 & 2v \\ 0 & 0& 1 \end{bmatrix} \cdot \begin{bmatrix}x\\ y \\ 1 \end{bmatrix} =T \cdot P \]5 关于对⾓线 y= x 的反射\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix}= \begin{bmatrix} 0 & 1 \\ 1 & 0 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]6 关于对⾓线 y= -x 的反射\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix}= \begin{bmatrix} 0 & -1 \\ -1 & 0 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]7 相对于任意直线 y=mx+b 的反射\[p'= \begin{bmatrix} x'\\ y' \\ 1 \end{bmatrix} = \frac{1}{1+m^{2}} \begin{bmatrix} 1-m^{2} & 2m & -2mb\\ 2m & m^{2}-1 & 2b\\ 0 & 0 & 1+m^{2} \end{bmatrix} \cdot \begin{bmatrix} x\\ y \\ 1 \end{bmatrix} =T\cdot P \]错切变换错切(shear)是⼀种使对象形状发⽣变化的变换,经过错切的对象好像是由相互滑动的内部夹层组成相对于x轴的x⽅向错切由下列变换产⽣\[ \begin{bmatrix} {x}' \\ {y}' \end{bmatrix} =\begin{bmatrix} 1 & sh_{x} \\ 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \end{bmatrix} \]该变换对应的坐标转换为\[{x}'=x+sh_{x} \cdot y \]\[{y}'=y \]通过齐次坐标变换矩阵表⽰相对于线\(y=y_{ref}\)的x⽅向错切\[ \begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix} 1 & sh_{x} & -sh_{x} \cdot y_{ref} \\ 0 & 1 & 0 \\ 0 & 0& 1 \end{bmatrix} \cdot\begin{bmatrix}x\\ y \\ 1 \end{bmatrix} \]相对于线\(x=x_{ref}\)的y⽅向错切\[ \begin{bmatrix}{x}'\\ {y}' \\ 1 \end{bmatrix} =\begin{bmatrix} 1 & 0 & 0 \\ sh_{y} & 1 & -sh_{y} \cdot x_{ref}\\ 0 & 0& 1 \end{bmatrix} \cdot\begin{bmatrix}x\\ y \\ 1 \end{bmatrix} \]逆变换通过齐次坐标变换矩阵表⽰平移逆变换\[T^{-1} =\begin{bmatrix} 1 & 0 & -t_{x} \\ 0 & 1 & -t_{y} \\ 0 & 0& 1 \end{bmatrix} \]旋转逆变换\[R^{-1} =\begin{bmatrix} cos \theta & -sin \theta & 0 \\ sin \theta & cos \theta & 0 \\ 0 & 0& 1 \end{bmatrix} \]缩放逆变换\[S^{-1} =\begin{bmatrix} \frac{1}{s_{x}} & 0 & 0 \\ 0 & \frac{1}{s_{y}} & 0 \\ 0 & 0& 1 \end{bmatrix} \]⼆维复合变换利⽤矩阵表达式,可以通过计算单个变换的矩阵乘积,将任意的变换序列组成复合变换矩阵。

计算机图形学变换实验报告

计算机图形学变换实验报告

实验二图形几何变换过程的设计1设计依据:本课程设计是依据教材<<计算机计算机图形学>>一书的第4章图形几何变换为设计依据, 制作图形几何变换的程序。

2设计要求:编制程序实现多边形的平移、比例、旋转、错切和对称二维变换。

实验目的:图形变换是计算机图形学中一个基本而重要的内容,它是将图形的几何信息经过几何变换后产生的新的图形。

一个简单的图形,通过各种变换可以形成一个复杂的、丰富多彩的图形图案;通过变换还可以改变形体的形状。

这次的实验主要是要求我们掌握图形变换的一些最基本的变换,编写程序来实现二维图形的基本变换。

题目:编制程序实现多边形的平移、比例、旋转、错切和对称二维变换。

设计思想:由于二维图形是由点或直线段组成,其中直线可由其端点坐标定义,因此二维图形的几何变换可以归结为对点或对直线端点的变换。

同时我们知道每种变换都有其变换矩阵,因此在画出坐标轴以后,将图形的每个端点乘以相应的变换矩阵就可以实现图形的变换。

原程序:一、平移变换:二、比例变换:三、对称变换四、错切变换:五、旋转变换:运行结果:一、平移变换二、比例变换:三、对称变换:四、错切变换:五、旋转变换体会:在这次的实验刚开始,由于第一次接触编译的环境觉得无从下手,在老师的指导下才逐渐了解,按照图形变换的基本原理,我简单实现了图形的几种变换。

但是由于自己对函数的运用的不太熟悉,因此,在这次的实验中没有用到对函数的调用,使得总的程序相对来说有点复杂,以后要在这方面有所改进。

通过这次的实验,知道了如何利用程序进行二维图形的一些基本变换,在以后的学习过程中要不断努力。

初中数学几何图形的变换组合创新实验

初中数学几何图形的变换组合创新实验

初中数学几何图形的变换组合创新实验在初中数学的学习中,几何图形一直是一个重要的组成部分。

而通过对几何图形进行变换组合的创新实验,不仅能够加深我们对几何知识的理解,还能培养我们的空间想象力、逻辑思维能力和创新能力。

几何图形的变换组合,包括平移、旋转、轴对称等基本变换,以及将不同的几何图形进行拼接、组合等操作。

这些操作看似简单,实则蕴含着丰富的数学原理和规律。

比如说平移,它是指在平面内,将一个图形上的所有点按照某个方向作相同距离的移动。

在实际生活中,我们可以看到很多平移的例子,比如电梯的上下运动、抽屉的推拉等。

通过平移实验,我们可以发现,平移后的图形与原图形形状和大小完全相同,只是位置发生了改变。

而且,对应点所连的线段平行且相等,对应线段平行且相等,对应角相等。

再来说旋转,旋转是指一个图形绕着一个定点,按照一定的方向,旋转一定的角度。

像风扇的叶片转动、钟表的指针走动,都是旋转现象。

在旋转实验中,我们能了解到旋转中心、旋转方向和旋转角度这三个要素决定了图形的旋转。

旋转后的图形,其形状和大小不变,对应点到旋转中心的距离相等,对应线段的长度相等,对应角相等,对应点与旋转中心所连线段的夹角等于旋转角。

轴对称则是指一个图形沿着一条直线对折后,直线两旁的部分能够完全重合。

生活中的轴对称图形随处可见,如蝴蝶、京剧脸谱等。

经过轴对称实验,我们知道对称轴是对称点连线的垂直平分线,轴对称图形的对应线段相等,对应角相等。

而将不同的几何图形进行组合拼接,则能创造出更多新奇有趣的图形。

比如,我们可以用两个完全相同的等腰直角三角形,将它们的斜边拼接在一起,就能得到一个正方形;用两个相同的等边三角形,可以拼出一个平行四边形。

在进行这些变换组合创新实验时,我们可以通过手工制作、计算机软件模拟等多种方式来实现。

手工制作是一种非常直观且有趣的方式。

我们可以准备一些卡纸、剪刀、胶水等工具,剪出各种几何图形,然后按照自己的想法进行变换和组合。

计算机图形学OpenGL实验一

计算机图形学OpenGL实验一
精品资料一实验目的理解图形元素显示的基本原理掌握扫描转换直线段的常用算法原理扫描转换圆弧的常用算法原理
实验报告
学院(系)名称:\
姓名
学号
专业
班级
实验项目
实验一:绘制基本图形
课程名称
计算机图形学
课程代码
实验时间
实验地点
批改意见
成绩
教师签字:
一、实验目的
1.理解图形元素显示的基本原理,掌握扫描转换直线段的常用算法原理,扫描转换圆弧的常用算法原理。
2.分别实现港口起重机、工程车、等设备的绘制。
3.颜色的设置要合适,且易于更换。
#include <math.h>
#include <gl/glut.h>
int SCREEN_HEIGHT = 480;//屏幕高度
//跟踪鼠标点击次数,达到3次后绘制Bezier曲线
int NUMPOINTS = 0;
Point POld = abc[0];
//绘制Bezier曲线段,控制t的增量可以控制曲线精度
for(double t = 0.0;t <= 1.0; t += 0.1) {
Point P = drawBezier(abc[0], abc[1], abc[2], t);
drawLine(POld, P);
2.熟悉glut常用几个功能函数
3.熟悉glut的函数回调机制
4.掌握绘制不同大小和颜色的点的方法
5.掌握绘制不同线型和颜色的直线的方法(直线,折线,环线)
6.掌握绘制彩色多边形边框的方法(各种设备)
7.熟悉OpenGL的编程环境(OpenGL+GlUT/SDK/MFC+C++)
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//输出五芒星信息
//设置缩放 //绘制纹理木箱
//输出木箱信息
4、分析讨论 OpenGL 是通过矩阵相乘实现图形的几何变换的, 由于矩阵乘法不满足交换律, 因此 在进行图形的复合几何变换时,特别要注意矩阵相乘的顺序。连续的平移变换、连续的 旋转变换、或者连续的比例变换是允许的,但是像“平移 1→旋转→平移 2”与“平移 1 →平移 2→旋转” 的几何变换则可能会出现截然不同的变换结果, 而实际上我们需要的结 果往往是后者。 为了避免这种情况,利用 OpenGL 提供的 glPushMatrix()函数对原始图形的矩阵 S 压 栈,然后把所有平移矩阵累乘得到矩阵 A、所有旋转矩阵累乘得到矩阵 B、所有比例矩 阵累乘得到矩阵 C,最后在视窗上绘制 S*A*B*C 的变换矩阵图形,最后用 glPopMatrix() 弹栈恢复变换前矩阵 S,准备下一次的几何变换。
void Display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(iMenu==1) //绘制五芒星 { glPushMatrix(); glTranslatef(Tx_2D,Ty_2D,0); glRotatef(Rz_2D,0,0,1); glScalef(Sx_2D,Sy_2D,1); DrawStar(); glPopMatrix(); glColor3f(1,1,1); ShowStar(); } else { //绘制木箱 glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); glPushMatrix(); glTranslatef(Tx_3D,Ty_3D,0); glRotatef(Rx_3D,1,0,0); glRotatef(Ry_3D,0,1,0); glRotatef(Rz_3D,0,0,1); glScalef(Sx_3D,Sy_3D,Sz_3D); DrawTexTureCube(); glPopMatrix(); glDisable(GL_DEPTH_TEST); glDisable(GL_TEXTURE_2D); glColor3f(1,1,1); ShowCube(); } glutSwapBuffers(); return; } //设置平移 //设置旋转 //设置平移 //设置旋转 //设置缩放 //绘制五芒星
2、二维图形几何变换的计算 几何变换均可表示成 P’=P*T 的形式 (1)点的变换:先将点表示为规范化齐次坐标形式,再乘以变换矩阵。
(2)直线的变换:将直线的两个端点表示为规范化齐次坐标形式,再乘以变换矩阵。
(3)多边形的变换:将多边形的顶点表示为规范化齐次坐标形式,再乘以变换矩阵。
(4)曲线的变换:将曲线的每个点表示为规范化齐次坐标形式,再乘以变换矩阵。
图 6-4 旋转变换 推导:利用极坐标方程
逆时针旋转 θ 角的矩阵如下:
(4)对称变换 对称变换后的图形是原图形关于某一轴线或原点的镜像。
图 6-5 对称变换 ①关于 x 轴对称
图 6-6 关于 x 轴对称 ②关于 y 轴对称
图 6-7 关于 y 轴对称
③关于原点对称
图 6-8 关于原点对称 ④关于 y=x 轴对称
注:1、实验报告的内容: 一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析 (完成指定的思考题和作业题) ;六、改进实验建议。 2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设 计的实验报告在使用前需交实践教学管理科备案。
五、实验步骤
1、复习有关算法,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用 C/C++语言编写源程序并调试、执行(任意指定一个图形) ; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。
六、实验报告要求:
1、分析各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析 4、实验总结(含问题分析及解决方法)
七、实验原理
1、二维基本几何变换 二维基本几何变换都是相对于坐标原点和坐标轴进行的几何变换, 有平移、 比例、 旋转、反射和错切等。 (1)平移变换 是指将 p 点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。 他是 一种不产生变形而移动物体的刚体变换(rigid-body transformation) ,如下图所示。
void Menu(void) { int MainMenu=glutCreateMenu(ProcessMenu); //创建主菜单 glutAddMenuEntry("二维图形几何变换 - 五芒星",1); glutAddMenuEntry("三维图形几何变换 - 纹理木箱",2); glutAttachMenu(GLUT_RIGHT_BUTTON); return; } void ChangeSize(int w,int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); if(iMenu==1) //二维图形映射规则 { if(w<=h) gluOrtho2D(-2,2,-2*h/w,2*h/w); else gluOrtho2D(-2*h/w,2*h/w,-2,2); } else //三维图形映射规则 { if(w<=h) glOrtho(-3,3,-3*h/w,3*h/w,-8,8); else glOrtho(-3*3/w,3*h/w,-3,3,-8,8); } glMatrixMode(GL_MODELVIEW); glLoadIdentity(); return; } //将主菜单与鼠标右键关联
图 6-9 关于 y=x 轴对称 ⑤关于 y=-x 轴对称
图 6-10 关于 y=-x 轴对称 (5)错切变换 错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。
图 6-11 错切变换
错切变换的变换矩阵为:
①沿 x 方向错切:b=0 ②沿 y 方向错切:c=0 ③两个方向错切:b 和 c 都不等于 0。
二、实验设备及实验环境
1、计算机(每人一台) 2、VC++6.0 或其他 C/C++语言程序设计环境(可使用 OpenGL)
三、实验学时
2 学时
四、实验内容
1、在 VC++编程环境下建立平面几何图形实现其常见几何变换; 2、在 VC++编程环境下建立三维立方体,实现其几何变换,包括缩放\平移\旋转.
Exp - University

课程名称 实验项目 专业班级 指导教师



计算机图形学实验 几何图形变换实验 姓 名 成 绩 Exp 学 号 QQ:289065406 日 期 2011.12.06
一、实验目的
1、通过实验,掌握计算机图形变换的基本知识、原理; 2、掌握二维和三维图形几何变换; 3、通过使用 VC++编程环境实现指定图形的常见几何变换;
十、实验总结
这次实验难度其实并不大,用到的都是以往的 OpenGL 绘图知识,例如绘制五芒星 时的描点连线、逼近法画圆、通过插值方式给图形填涂颜色、绘制木箱的纹理贴图、 OpenGL 视窗显示文字、右键菜单等等。 由于我是用工程的文件组织形式编程,因此很多功能都是通过代码重用实现的,所 以实际编程耗时很短。而我觉得真正有难度的是通过菜单切换二三维的映射规则。在我 的程序中,我是通过 gluOrtho2D()函数映射二维区域,gluOrtho()函数映射三维区域。 刚开始时,我只是简单地在 ChangeSize()函数里面通过判断当前菜单 iMenu 的值来 决定应该采用哪种映射规则,但这样做存在的问题就是每次切换菜单后,由于窗口大小 并没有发生变化,ChangeSize()函数并没有被 glutReshapeFunc()函数马上调用,必须人为 地拉伸一下窗口才能切换映射规则,这显然是很不理想的。为了解决这个问题,我进行 了多种尝试方法,最终决定在切换菜单后,马上人为地调用一次 ChangeSize()函数,传 参为 OpenGL 窗口的大小,即调用 ChangeSize(WinWidth,WinHeight),问题解决。 另一个问题是,我最初绘制三维的木箱时,使用的是透视投影 glFrustum(),但后来 发现,使用透视投影无法在在 OpenGL 窗口上绘制文字,但绘制出来的木箱效果很有实 感;而使用平行投影 gluOrtho()则既能显示文字,又能绘制出木箱,只是实感度相对于 透视投影略差。 遗憾的是我还没找到在透视投影下显示文字的方法, 唯有采用后者方案。
(3)旋转变换 三维旋转满足右手定则:大拇指指向围绕旋转的轴向,四指转的方向为正向。
图 7-6 旋转变换的角度方向
①绕 z 轴旋转
图 7-7 绕 z 轴旋转 ②绕 x 轴旋转
图 7-8 绕 x 轴旋转 ③绕 y 轴旋转
图 7-9 绕 y 轴旋转 (4)对称变换 ①关于坐标平面对称 关于 xoy 平面进行对称变换的矩阵计算形式为:
关于 yoz 平面的对称变换为:
关于 zox 平面的对称变换为:
②关于坐标轴对称变换 关于 x 轴进行对称变换的矩阵计算形式为:
关于 y 轴的对称变换为:
关于 z 轴的对称变换为:
(5)错切变换
①沿 x 方向错切
②沿 y 方向错切
③沿 z 方向错切
(6)逆变换 所谓逆变换即是与上述变换过程的相反的变换。 ①平移的逆变换
②比例的逆变换 局部比例变换的逆变换矩阵为:
整体比例变换的逆变换矩阵为:
③旋转的逆变换
八、算法流程
1、二维基本几何变换算法流程
相关文档
最新文档