实验 OpenGL几何变换
opengl实验报告
opengl实验报告OpenGL实验报告引言:OpenGL(Open Graphics Library)是一种跨平台的图形编程接口,被广泛应用于计算机图形学、游戏开发和科学可视化等领域。
本实验报告将介绍我对OpenGL的实验研究和学习成果。
一、实验目的本次实验的主要目的是掌握OpenGL的基本概念和使用方法,了解图形渲染的原理和过程,以及学习如何在OpenGL中创建和操作图形对象。
二、实验环境本次实验使用的是OpenGL的最新版本,并在Windows操作系统下进行开发。
使用的开发工具是Visual Studio和OpenGL的开发库。
三、实验过程1. 熟悉OpenGL的基本概念在开始实验之前,我先学习了OpenGL的基本概念,包括OpenGL的坐标系统、图形渲染管线、着色器等。
了解这些概念对于后续的实验非常重要。
2. 创建窗口和上下文在OpenGL中,我们需要先创建一个窗口和一个OpenGL上下文,以便进行图形渲染。
通过调用相关的OpenGL函数,我成功创建了一个窗口,并初始化了OpenGL的上下文。
3. 绘制基本图形接下来,我开始尝试绘制一些基本的图形,比如点、线和三角形。
通过设置顶点坐标和颜色,我成功绘制出了这些基本图形,并在窗口中显示出来。
4. 添加纹理为了使图形更加逼真和丰富,我学习了如何在OpenGL中添加纹理。
通过加载图片并设置纹理坐标,我成功将纹理贴在了绘制的图形上,使其具有了更加真实的效果。
5. 光照和阴影效果为了增加图形的立体感和真实感,我学习了如何在OpenGL中添加光照和阴影效果。
通过设置光源的位置和属性,以及材质的属性,我成功实现了光照和阴影的效果,使图形看起来更加逼真。
6. 动画效果为了使图形具有动态效果,我学习了如何在OpenGL中实现简单的动画效果。
通过每帧更新顶点的位置和纹理坐标,我成功实现了图形的旋转和平移动画,使其具有了动态的效果。
四、实验结果和分析通过以上的实验过程,我成功掌握了OpenGL的基本概念和使用方法,并实现了一些基本的图形渲染效果。
opengl 图形的变换与裁剪
12
0 1/ sx 1 1 S −1 = S ( , ) = 0 1/ s y sx s y 0 0
复合二维变换
复合二维平移
3
关于齐次坐标
用一个n+1维向量表示一个n维向量
二维点(x,y),用(X,Y,ω)表示: (2,3)的齐次坐标表示可 以是(4,6,2)、(3,4.5,1.5) ω可以任意选取
齐次坐标与普通坐标之间是一一对应关系
x=X/ω y=Y/ω
ω
P
齐次坐标表示点的优势
防止浮点数溢出 矩阵变换的统一表示
X ω=1 平面 Y
局部坐标系可以简化物体的定义 物体={标准体素,变换}
造型变换:
物体从局部坐标系到世界坐标系的变换 三维线性和非线性变换
28
三维模型变换:平移
三维平移T:三维点P(x,y,z)移动(tx,ty,tz)后, 得到点P'(x',y',z')
x′ 1 ′ y = 0 z′ 0 1 0 0 1 0 0 0 t x x 0 t y y 1 t z z 0 1 1
y
P
P'
x
z
32
三维模型变换
绕z轴逆时针旋转θ角的旋转变换Rz (注: θ可以是(x,y,z)的函数)
x′ cosθ ′ y = sin θ z′ 0 1 0 − sin θ cosθ 0 0 0 0 x 0 0 y 1 0 z 0 1 1
计算机图形学实验报告
计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
第四章OpenGL图形变换-gluLookAt用法
gluLookAt 的用法1、设置视点(设置相机位置及形态) 视点设置相当于把相机放到一定的位置上,镜头对准场景。
如图1所示。
图1 视点变换与相机定位在OpenGL 中,默认情况下,设置视点(视点变换)相当于把相机放到世界坐标系的原点(0,0,0),相机水平,镜头指向Z 轴的负方向,相当于从世界坐标系的原点向屏幕内部的虚拟场景观察。
2、选择视景体方式一:通过函数glFrustum()指定,如图2所示。
图2 glFrustum 生成的透视投影体YXZ Y YXZ观察方向方式二:通过函数gluPerspective 指定视景体,如图3所示。
图4-7 平行投影模型图图3 gluPerspective 生成的透视投影体YXZ Y3、移动景物(已实现)(借助于glTranslate 、glRotate 、glScale 等)移动前:图4 移动前物体移动后:图5 移动后物体(模型变换)XYX观察方向4、移动视点(移动相机)此处是我们要实现的功能。
用到的函数是:gluLookAt.函数原型:gluLookAt(GLdouble eyex, GLdouble eyey, Ldouble eyez,GLdouble centerx , GLdouble centery ,GLdouble centerz ,GLdouble upx , GLdouble upy ,GLdouble centerz );图6 gluLookAt示意图移动视点,就是调整相机的位置和形态,然后在新位置和方向处选择视景体,如下图所示。
图7 任意位置和形态的相机原始(默认)的相机位置可用如下语句来表述:gluLookAt(0, 0 , 0 ,0 , 0 , -1 ,0 , 1 ,0);简单的做法是:(1(2)在与Z轴负向平行的方向上选择观察中心点;也就是相机与观察中心点的连线形成的向量与X轴正向夹角为90度。
(3)移动相机假定此时,相机的位置为(eyex , eyey , eyez), 观察中心点的位置为(centerx , centery , centerz),R与X轴的夹角为90度。
第四章OpenGL图形变换(一)
第四章 OpenGL 图形变换OpenGL 图形变换是OpenGL 技术体系的核心内容之一,它的最主要功能是让虚拟世界里的物体动起来,是虚拟世界的动力驱动系统,也可以称之三维图形系统的引擎!OpenGL 图形变换的主要内容包括几何变换、投影变换、裁剪变换、视口变换等,本章尽量以通俗易懂的方式来讲解各技术要点。
4. 1 图形变换浅说OpenGL 图形变换和照相是非常相似的,它们之间的关系大致描述如下。
1、视点变换(View Transformation ) 视点变换相当于把相机放到一定的位置上,镜头对准场景。
如图4-1所示。
图4-1 视点变换与相机定位在OpenGL中,默认情况下,视点变换相当于把相机放到世界坐标系的原点(0,0,0),镜头指向Z轴的负方向,相当于从世界坐标系的原点向屏幕内部的虚拟场景观察。
2、模型变换(Model Transformation)模型变换相当于场景中人物或对象位置的变化、角度的改变和大小的改变。
图4-2 虚拟照相场景中的人物YXZ观察方向X照相时场景中的人物或对象需要作调整,以便他们位于场景中合适的位置上。
有此时候人物不在视野范围内时,还要走动一下,进入镜头场景内,方向不对时,还要转动一下,眼睛转向镜头。
比如图4-2所示,照相时,警察不在镜头场景内,他需要向后向移动。
中间的企鹅背对镜头,他需要转过向来面向镜头。
企鹅向左边的气球中吹气,气球变大。
调整后的场景如图4-3所示。
图4-3 虚拟照相场景中的调整后人物或对象上述调整过程中的人员移动 和企鹅的转身动作 和气球充气变大 都属于模型变换。
3、投影变换(Projection Transformation ) 投影变换相当于调整相机镜头焦距,放大或缩小景物(如图4-4所示)。
图4-4 投影变换与相机焦距调整OpenGL 中投影变换的本质功能是定义一个视景体,使视景体外的多余部分被裁剪掉,再把景物变换到一个规则投影体(高、宽、深均为2个单位的立方体)。
基于OpenGL几何变换的虚拟漫游视点控制及应用
第2卷 8
Vo. 8 12
第2 4期
N O. 4 2
计算 机 工程 与设 计
Co mp t r g n e i g a d D e i n u e En i e rn n sg
20 年 1 月 07 2
D e .2 0 c 0 7
i c e t dt ee t o l in i a p id i o l iu l l t r u h b s d o a t l y tm n l . T ee e t f lt r u h h s i i s r a e d t c l so p l n s i v s a kh o g a e n p ri es se f al h f c k h o g a v d o c i s e wa c i y o wa v fe i g a d p e e a l e l i , wh c r v st a i t o a s a c f l n p l d v le t o x e t e l r f r b er a - me n n t i hp o e t h smeh d h s e e r h u d a p i a u s mee t n . h t r a e o K e r s wak h o g ; v e o n ; g o ti a s o ma i n ; Ocr e c l so e e to ; p ril se ywo d : ltru h iwp i t e merctn f r t s r o te ; o l i n d t ci n i atces tm y
T e iwp i t o to l g i l t r u h i c iv db s do r e dm e so a e me r a so a i n f e GL. T eOc e a h e o n n l n wak h o g a h e e a e nt e i nin l o ti tn f r t so Op n v c r i n s h g cr m o h t eht r t
计算机图形学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空间(坐标系)变换⽹友的《3D图形学的学习策略》⼀⽂使我深受启发,在图形学以及openGL学习⽅⾯给了我很有价值的指导性意见,在此对前辈们的不吝赐教表⽰感激,谢谢你们的⽆私分享。
如⽂章所说,API是⼯具,不是本质,OpenGL/Direct3D的本质是图形学,⽽不是OpenGL/Direct3D的本⾝,API的本⾝只是⼀些Interface⽽已。
最重要的,最根本的是,你要明⽩这些API背后的图形学的原理---因为那才是根本中的根本。
其实很多事情,包括学习也涉及到⽣活,只有抓住了本质,才能体会到其中的真谛。
带着这种希望探究本质的学习⽅法,结合图形学原理,通过阅读书⽬和⽹友们的⽂章,我对OpenGL⼏何空间变换进⾏了总结性的学习。
OpenGL处理管线的⽬的是将对象的三维描述转换为可以显⽰的⼆维图像。
为了完成这个从三维到⼆维的转换,OpenGL 使⽤了多个空间(坐标系),每个空间完成特定的任务,从⼀个空间到另⼀个空间需要进⾏空间转换。
理解OpenGL所使⽤的各种空间以及它们间的变换是⾮常重要的。
如上图所⽰,openGL中使⽤的空间依次是:对象空间、世界空间、视点空间、裁剪空间、归⼀化设备空间、窗⼝空间、屏幕空间。
结合⾃⼰的理解,就每个空间完成的基本任务和空间的变换关系,总结如下。
对象空间。
对象空间中完成的最⼤任务是对象建模,三维对象的属性,包括顶点位置和表⾯法线等是在这个空间内指定的。
这个空间的坐标原点⼀般在对象上,有时候也在其他地⽅,主要是为了建模⽅便。
每⼀个对象都有⼀个⾃⼰的对象空间。
就openGL⽽⾔,我⽬前还没有接触到建⽴很复杂模型的应⽤,建模⼀般在其他地⽅如3DMAX中完成,然后读⼊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场景,包括绘制立方体、添加光照效果和材质、实现相机控制以及添加纹理贴图。
这些技术和知识对于今后的图形编程工作将会有很大的帮助。
计算机图形学实验报告
计算机图形学基础实验报告院系:计算机科学学院班级:2012级4班姓名:彭晓学号:21209010434实验二直线生成算法的实现1.实验目的:理解基本图形元素光栅化的基本原理,掌握一种基本图形元素光栅化算法,利用OpenGL 实现直线光栅化的DDA算法。
2.实验内容:(1)根据所给的直线光栅化的示范源程序,在计算机上编译运行,输出正确结果;(2)指出示范程序采用的算法,以此为基础将其改造为中点线算法或Bresenham算法,写入实验报告;(3)根据示范代码,将其改造为圆的光栅化算法,写入实验报告;(4)了解和使用OpenGL的生成直线的命令,来验证程序运行结果。
3.实验原理:示范代码原理参见教材直线光栅化一节中的DDA算法。
下面介绍下OpenGL画线的一些基础知识和glutReshapeFunc()函数。
(1)数学上的直线没有宽度,但OpenGL的直线则是有宽度的。
同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。
可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。
这里的线由一系列顶点顺次连结而成,有闭合和不闭合两种。
前面的实验已经知道如何绘“点”,那么OpenGL是如何知道拿这些顶点来做什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?或是做其它事情呢?为了解决这一问题,OpenGL要求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略),并由glBegin来指明如何使用这些点。
例如:glBegin(GL_POINTS);glVertex2f(0.0f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd();则这两个点将分别被画出来。
如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。
还可以指定更多的顶点,然后画出更复杂的图形。
实验一 opengl高级图形图像实验报告
高级图形图像第一次实验报告一、实验描述以及关键步骤1.opengl编程环境组建(基于VC6.0)1)下载opengl开发库文件夹;2)复制glut32.dll和glut.dll到…\windows\system32;3)复制glut.h到...\Microsoft Visual Studio\VC98\Include\GL;4)复制glut32.lib和glut.lib到…\Microsoft Visual Studio\VC98\Lib;5)新建工程后,进入Project菜单,选Settings项,弹出 Settings 对话框,选Link项,在 Libraries 栏目中加入OpenGL库:opengl32.lib glu32.lib glaux.lib。
2.基本图形绘制首先运行一个Windows环境下的一个基本OpenGL程序,直接打开60version文件夹内的工程,它将显示一个空的OpenGL窗口,可以在定制窗口大小和全屏模式下切换(按F1),按ESC退出,该程序为以后的应用程序提供了实验平台,并预留了绘图接口。
根据教材P67-70,了解绘制函数,根据附件2提供的源码baseshape.cpp,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,修改图形绘制命令和参数,显示出点、线、矩形、三角形等,可设置不同线宽。
3.图形的二维变换根据附件3提供源码,将该文件内的场景绘制函数Drawsence()替代空窗口程序中的同名函数,通过调用glTranslate*, glRotate*,glscale*等二维变换函数实现平移、旋转、缩放等变换,通过参数操作和矩阵操作两种方式执行。
glTranslatef:在opengl中,函数glTranslatef的作用就是移动坐标原点。
glRotatef:glRotatef( angle, x, y, z )函数的作用是将当前坐标系以a( x, y, z )向量为旋转轴旋转angle角度,满足右手法则,即沿着右手握拳时四个手指指向的方向旋转。
OpenGL图形变换
OpenGL图形变换OpenGL图形软件包是为三维应用设计的,其中包含了大量的有关三维变换的操作,二维变换则可以看作是三维变换的特例。
OpenGL中常用的变换包括模型视图变换、投影变换和视见区变换。
一、矩阵堆栈在计算机图形学中,所有的变换都是通过矩阵乘法来实现的,即将三维形体顶点构成的齐次坐标矩阵乘以三维变换矩阵就得到了变换后的形体顶点的齐次坐标矩阵,这样只要求出形体的三维变换矩阵,就可以得到变换后的形体。
在OpenGL中,对象的坐标变换也是通过矩阵来实现的。
OpenGL中包含了两个重要的矩阵:模型视图矩阵和投影矩阵,其中模型视图矩阵用于物体的模型视图变换,投影矩阵用于投影变换。
一般来说,在进行矩阵操作之前,需要指定当前操作的矩阵对象,这可以使用函数:glMatrixMode(GLenum mode);定义。
其中当mode取GL_MODELVIEW时,表示对模型视图矩阵进行操作;当mode取GL_PROJECTION时表示对投影矩阵进行操作,并且一旦设置了当前操作矩阵,它就将保持为当前的矩阵对象,直到再次调用函数glMatrixMode修改它为止。
默认情况下,系统处理的当前矩阵是模型视图矩阵。
OpenGL为模型视图矩阵和投影矩阵各维护着一个“矩阵堆栈”,其中堆栈的栈顶矩阵就是当前的模型视图矩阵或投影矩阵。
在调用变换函数的时候,系统自动计算变换函数对应的变换矩阵与当前操作的矩阵堆栈栈顶矩阵的乘积,并置为栈顶矩阵,绘制图形时使用栈顶矩阵作为图形的变换矩阵。
矩阵堆栈主要用来保存和恢复矩阵的状态。
OpenGL中利用函数:void glPushMatrix(void);void glPopMatrix(void);实现矩阵堆栈的操作。
其中函数glPushMatrix将当前矩阵堆栈的栈顶矩阵复制一个,并将其压入当前矩阵堆栈,以保存当前变换矩阵。
函数glPopMatrix用于将当前矩阵堆栈的栈顶矩阵弹出,这样,堆栈中的下一个矩阵变为栈顶矩阵(当前变换矩阵),用来恢复当前变换矩阵原先的状态。
OpenGL坐标 逆变换和模拟变换
逆变换和模拟变换几何处理管线擅长使用视图和投影矩阵以及用于裁剪的视口把顶点的世界(物体)坐标变换为窗口(屏幕)坐标。
但是,在有些情况下,需要反转这个过程。
一种常见的情形就是应用程序的用户利用鼠标选择了三维空间中的一个位置。
鼠标只返回一个二维值,也就是鼠标光标的屏幕位置。
因此,应用程序必须反转变换过程,确定这个屏幕位置源于三维空间的什么地方。
OpenGL工具函数库中gluUnProject()和gluUnProject4()函数用于执行这种逆变换操作。
只要提供一个经过变换的顶点的三维窗口坐标以及所有对它产生影响的变换,gluUnProject()就可以返回这个顶点的源物体坐标。
如果深度范围不是默认的[0, 1],应该使用gluUnProject4()函数。
int gluUnProject(GLdouble winx, GLdouble winy, GLdouble winz,const GLdouble modelMatrix[16],const GLdouble projMatrix[16],const GLint viewport[4],GLdouble *objx, GLdouble *objy, GLdouble *objz);这个函数使用由模型视图矩阵(modelMatrix)、投影矩阵(projMatrix)和视口(viewpo rt)定义的变换,把指定的窗口坐标(winx, winy, winz)映射到物体坐标。
它产生的物体坐标是在o bjx、objy和objz中返回的。
这个函数返回GL_TRUE(表示成功)或GL_FALSE(表示失败,例如矩阵不可逆)。
这个函数并不会使用视口对坐标进行裁剪,也不会消除那些位于glDepthRange()范围之外的深度值。
对变换过程进行逆操作存在一些固有的难度。
二维屏幕上的一个位置可以来自于三维空间中一条直线上的任意一点。
为了消除这种歧义,gluUnProject()要求提供一个窗口深度坐标(win z),它是根据glDepthRange()函数指定的。
计算机图形
华北电力大学科技学院实验报告实验名称基于OpenGL的综合性实验课程名称计算机图形学专业班级:软件07K2 学生姓名:解文龙学号:0719******** 成绩:指导老师:张荣华实验日期:2010年5月10-12日实验一:使用OpenGL及Glut库编写程序绘制二维数学曲线。
一、实验目的1.熟悉OpenGL基本图元函数的使用,进一步理解计算机图形学直线段和多边形的光栅化原理;2.熟悉OpenGL的图形几何变换函数、观察函数以及投影函数的使用,进一步理解计算机图形学中一个完整的三维绘制流程的工作原理;3.通过编程,在Visual C++环境下结合OpenGL标准图形库实现图形的几何变换(平移、旋转、缩放、对称及错切);二、实验要求1.每个学生单独完成;2.开发语言规定为C++,平台为Visual C++;3.使用OpenGL及Glut库编写程序绘制二维数学曲线。
4.编写的一个要求程序中显式地使用后面的OpenGL函数:gluOrtho2D或gluPerspective、gluLookAT、glViewport;三、实验原理该实验基于OpenGL编写的图形绘制程序基本综合了图形绘制流程各阶段涉及的主要图形学算法及原理,所以我们设置一个因子factor,把所有的坐标值等比例缩小,这样就可以画出更多个正弦周期。
程序代码如下:#include <math.h>#include <GL/glut.h>const GLfloat factor = 0.1f;void myDisplay(void){GLfloat x;glClear(GL_COLOR_BUFFER_BIT);glBegin(GL_LINES);glV ertex2f(-1.0f, 0.0f);glV ertex2f(1.0f, 0.0f); //可以画出x轴glV ertex2f(0.0f, -1.0f);glV ertex2f(0.0f, 1.0f); //可以画出y轴glEnd();glColor3f(1.0, 0.0, 0.0);glBegin(GL_LINE_STRIP);for(x=-1.0f/factor; x<1.0f/factor; x+=0.01f){glV ertex2f(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("正弦函数的图形");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}四、实验结果与数据处理Factor=0.1fFactor=0.2f五、讨论与结论修改factor的值,显示周期变化。
详解OpenGL的坐标系、投影和几何变换
详解OpenGL的坐标系、投影和几何变换作者:charlee 按:我也是在迷茫中走过来的,初学OpenGL时,略微了解了一些有关变换的基本知识,但是却不知道具体的使用方法,因此经常需要在布置场景时反复调整各种参数。
当我终于有一天明白了它们的用法时,就觉得应该把这些心得体会写下来,让那些和我一样曾经迷茫过的人能够迅速地找到出路。
本文的读者对象为那些初学OpenGL,了解了一些坐标系、几何变换等基本知识,但是又不知道具体应该如何运用这些操作的人。
如果你对OpenGL一无所知,建议你先去学学OpenGL的基本知识。
1 坐标系OpenGL中使用的坐标系有两种,分别为世界坐标系和屏幕坐标系。
世界坐标系即OpenGL内部处理时使用的三维坐标系,而屏幕坐标系即为在计算机屏幕上绘图时使用的坐标系。
通常,OpenGL所使用的世界坐标系为右手型,如下图所示。
从计算机屏幕的角度来看,x轴正方向为屏幕从左向右,y轴正方向为屏幕从下向上,z轴正方向为屏幕从里向外。
而进行旋转操作时需要指定的角度θ的方向则由右手法则来决定,即右手握拳,大拇指直向某个坐标轴的正方向,那么其余四指指向的方向即为该坐标轴上的θ角的正方向(即θ角增加的方向),在上图中用圆弧形箭头标出。
2 投影将世界坐标系中的物体映射到屏幕坐标系上的方法称为投影。
投影的方式包括平行投影和透视投影两种。
平行投影的投影线相互平行,投影的结果与原物体的大小相等,因此广泛地应用于工程制图等方面。
透视投影的投影线相交于一点,因此投影的结果与原物体的实际大小并不一致,而是会近大远小。
因此透视投影更接近于真实世界的投影方式。
B 平行投影B透视投影xzy 02.1 平行投影OpenGL 中使用下面的函数来设置投影方式为平行投影。
glOrtho(xleft, xright, ybottom, ytop, znear, zfar); 各参数的含义如下图所示。
注意,只有位于立方体之内的物体才可见。
实验3 OpenGL几何变换
实验3OpenGL几何变换1.实验目的理解并掌握O penGL二维平移、旋转、缩放变换的方法。
2.实验内容(1)阅读实验原理,运行示范实验代码,掌握0penGL程序平移、旋转、缩放变换的方法。
(2)根据示范代码,完成实验作业。
3.实验原理(1)OpenGL下的几何变换在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。
平移矩阵构造函数为glTranslate<f,d>(t x,ty,tz),作用是把当前矩阵和一一个表示移动物体的矩阵相乘。
t x、 ty、 tz指定这个移动物体的矩阵,它们可以是任意的实数值,后缀为f (单精度浮点fl oat)或d(双精度浮点double),对于二维应用来说, tz=0.0。
旋转矩阵构造函数为glRotate<f,d>(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。
theta, vx, vy, vz指定这个旋转物体的矩阵,物体将围绕(0,0,0)到(x,y,z) 的直线以逆时针旋转, 参数theta表示旋转的角度.向量 v=(v x,vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的方向,后缀为 f(单精度浮点f l oat)或d (双精度浮点double),对于二维旋转来说, vx=0.0, vy=0.0, vz=1.0。
缩放矩阵构造函数为glScale<f,d>(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。
sx, sy, sz指定这个缩放物体的矩阵,分别表示在x, y, z方向上的缩放比例, 它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为 f(单精度浮点fl oat)或d(双精度浮点double)。
注意这里都是说“把当前矩阵和一个表示移动<旋转, 缩放>物体的矩阵相乘”, 而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的, 马上就会讲到。
OpenGL的空间变换(下):空间变换
OpenGL的空间变换(下):空间变换通过本⽂的上篇,我们了解到矩阵的基础概念。
并且掌握了矩阵在空间⼏何中的应⽤。
接下来,我们将结合矩阵来了解 OpenGL 的空间变换。
在使⽤ OpenGL 的应⽤程序中,当我们指定了模型的顶点后,顶点依次会变换到不同的 OpenGL 空间中:世界空间模型空间(也称为对象空间)视图空间(也称为视点空间、摄像机空间)裁剪空间标准设备坐标空间窗⼝空间在经过这⼀系列的空间变换之后,顶点才会被显⽰在屏幕上。
世界空间(World Space)世界空间相对于其他坐标空间来说是固定不变的。
所以,它也被⽤作空间变换的参考系。
我们把它的坐标系称为世界坐标系。
在没有特别说明的情况下,我们⽤来描述⼀个⼏何对象(点、向量或坐标)的数值数据,都是基于世界坐标系来设定的。
世界坐标系⽤矩阵来表⽰就是⼀个单位矩阵。
模型空间(Model Space)模型空间,也称为对象空间。
如果把世界空间⽐作现实世界的话,那么模型就好⽐⼀座房⼦或者房⼦⾥的⼀个⼈等等。
假设以⼈的重⼼为原点,正⾯向前的⽅向为 z-轴,头顶的⽅向为 y-轴,左侧⽅向为 x-轴来构建⼀个坐标系。
我们可以⽤这个坐标系来描述这个⼈⾃⾝的模型空间。
这个坐标系也称为模型坐标系(或对象坐标系)。
模型坐标系并不是绝对的,如果以⼈的⿐尖为原点,头顶的⽅向改为 z-轴,正⾯向前的⽅向为 y-轴,右侧⽅向为 z-轴来构建其模型坐标系。
这个模型坐标系同样可以⽤来描述这个⼈⾃⾝的模型空间。
只不过⽤不同坐标系来描述时,描述出来的数据不⼀定相同。
⼀般来说,我们都是基于世界坐标系来描述模型坐标系的。
在这种情况下,世界坐标系可以看作是模型坐标系的⽗坐标系:其中,⿊⾊的坐标系为世界坐标系;灰⾊的坐标系为模型坐标系。
模型变换(模型-世界变换)默认情况下模型坐标系的原点位于世界坐标系的原点,并且坐标轴的⽅向与世界坐标系的坐标轴⼀致。
我们可以通过⼀系列的缩放、旋转和*移,将模型以任意⾓度摆在任意位置上。
计算机图形学OpenGL版实验5-8
实验5 OpenGL模型视图变换一、实验目的:理解掌握OpenGL程序的模型视图变换。
二、实验内容:(1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换;(2)根据示范代码,尝试完成实验作业;三、实验原理:在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。
1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。
2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。
如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。
在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。
3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube())。
display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。
4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。
由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。
reshape()会在窗口初次创建,移动或改变时被调用。
OpenGL中矩阵坐标之间的关系:物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标——〉窗口坐标(1)视图变换函数gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置。
把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验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)。
注意这里都是说“把当前矩阵和一个表示移动<旋转, 缩放>物体的矩阵相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。
假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到
的矩阵再乘上每一个顶点的坐标矩阵v。
那么,经过变换得到的顶点坐标就是((RT)v)。
由于矩阵乘法满足结合率,((RT)v) = R(Tv)),换句话说,实际上是先进行移动,然后进行旋转。
即:实际变换的顺序与代码中写的顺序是相反的。
由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要
特别注意这一点。
(2)OpenGL下的各种变换简介
我们生活在一个三维的世界——如果要观察一个物体,我们可以:
1、从不同的位置去观察它(人运动,选定某个位置去看)。
(视图变换)
2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它(物体运动,让人看它的不同部分)。
(模型变换)
3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。
另外,我们可能只希望看到物体的一部分,而不是全部(指定看的范围)。
(投影变换)
4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部(指定在显示器窗口的那个位置显示)。
(视口变换)
这些,都可以在OpenGL中实现。
从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。
在OpenGL 中,实现这两种功能甚至使用的是同样的函数。
由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。
设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
glMatrixMode(GL_MODELVIEW);
该语句指定一个4×4的建模矩阵作为当前矩阵。
通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。
把当前矩阵设置为单位矩阵的函数为:glLoadIdentity();
我们在进行矩阵操作时,有可能需要先保存某个矩阵,过一段时间再恢复它。
当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。
当需要恢复最近一次的保存时,调用glPopMatrix ()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。
OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。
因此不必过于担心矩阵的容量问题。
通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便,更快速。
注意:模型视图矩阵和投影矩阵都有相应的堆栈。
使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。
4.示范代码:
(1)、Translate示例
生成图形:
注意理解:myDraw1()和myDraw2()生成的图形完全相同,为什么?
(2)、Rotate示例
生成图形:
注意理解:myDraw1()和myDraw2()生成的图形完全相同,为什么?
(3)、Scale示例
生成图形:
注意理解:myDraw1()和myDraw2()生成的图形完全相同,为什么?
(4)、综合示例
生成图形:
5. 实验作业:
绘制如下图形:
(2)用几何变换绘制三个不同位置、旋转角度、颜色的菱形。