OpenGL 3基本图形绘制

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


3.2 函数命名的语法

OpenGL函数都遵循一个命名约定,即采用以下格式: <库前缀><命令><参数个数><参数类型> 函数glColor3f(1.0,0,0),gl表示这个函数来自库gl.h,

color表示该函数用于颜色设定,3f表示这个函数采用了
三个浮点数参数。 GLfloat color[ ]={1.0,0,0} ; glColor3fv(color);
(1)确定当前矩阵栈 void glMatrixMode(Glenum mode); 参数取值:
GL_MODELVIEW:模型视图矩阵
GL_PROJECTION:投影矩阵 GL_TEXTURE:纹理矩阵 默认的选定矩阵为模型-视图变换。
矩阵栈及其操作(2/8)
清矩阵栈栈顶
void glLoadIdentity(void); •将栈顶矩阵替换为单位矩阵 •取消之前变换的作用 M … I
3.1 OpenGL的数据类型

所有的数据类型都以GL开头,表示是OpenGL。 紧跟在后面的大多是它们相应的C数据类型。 一些开始有个u表示是无符号的数据类型,如: ubyte表示是无符号的字节。也给出了更多的描述 名字的方法,如:size表示一个值的长度。 GLsizei表示是一个GL变量,且参数的大小是一 个整型。 Clamp是用于颜色的。这种数据类型以f和d结尾 表示实型或双精度型数据类型。GLboolean变量 用于标示True和False;GLenum用于枚举型变量 ; GLbitfield 用于包含二进制位的区域的变量。
OpenGL中的ModelView变换机制


Projection矩阵保存着描述视景体的投影变换矩 阵。一般情况下, Projection矩阵不需要复合, 因此在进行投影前需要调用函数 glLoadIdentity()。 用户可以通过函数glGetIntegerv()得到系统所允 许的最大矩阵数目: glGetIntegerv(GL_MAX_PROJECTION_STAC K_DEPTH);
透视投影的示意图
透视投影:“近大远小”,类似与人眼的视觉机制
透视投影
near
w fovy h
坐标原点
aspect = w/h
void gluPerspective(GLdouble fovy,GLdouble aspect, GLdouble near,GLdouble far);
far
正交投影
3.2 函数命名的语法

函数格式示例:定义点函数
函数的功能
glVertex3f(x, y ,z )
属于GL库
参数个数
参数的类型
glVertex3fv(p)
参数为指针
注意每部分的大小写
3.3 OpenGL是一种状态机

OpenGL的工作方式是一种状态机制,它可以进 行各种状态或模式设置,这些状态或模式在重 新改变它们之前一直有效。

对于二维图形向二维屏幕的投影,则应使用实 用库中的如下函数:
void gluOrtho2D(Gldouble left, Gldouble right,
Gldouble bottom, Gldouble top);

前面提到过,用二维顶点命令绘制的二维物体 的z坐标均为零,而gluOrtho2D()命令假定场景 中的 z 坐标介于-1.0和 1.0 之间。

其视景体是一个各面均为矩形的六面体
,用glOrtho命令创建正交平行的取景体

void glOrtho(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top, Gldouble near,Gldouble far);
正交投影的示意图
正交投影

模型-视图变换过程就是一个将顶点坐标从世界坐标变换到 视觉坐标的过程。这里很重要的是对两个坐标系的认识。 世界坐标系也称为全局坐标系。它是一个右手坐标系,可 以认为该坐标系是固定不变的,在初始态下,其x轴为沿屏

幕水平向右,y轴为沿屏幕垂直向上,z轴则为垂直屏幕面
向外指向用户。

视觉坐标系(即观察坐标系)也称为局部坐标系。它是一个
第3章
OpenGL基本图形绘制
1
3.1 OpenGL的数据类型
OpenGL类型 GLbyte GLshort GLint,GLsizei GLfloat,GLclampf GLdouble,GLclampd GLubyte,GLboolean GLushort GLuint,GLenum, GLbitfield 数据类型 8位整数 16位整数 32位整数 32位浮点数 64位浮点数 8位无符号整数 16位无符号整数 32位无符号整数 C语言类型 signed char short long float double unsigned char unsigned short unsigned long
void gluLookAt(GLdouble eyex, GLdouble eyey, GLdouble eyez, Gldouble centerx, GLdouble centery, GLdouble centerz, Gldouble upx, GLdouble upy, GLdouble upz); (eyex, eyey, eyez)为视点位置 (centerx, centery, centerz)为观察参考点的位置 (upx, upy, upz)为向上向量的方向
模型变换

平移变换 viod glTranslate{fd}(TYPE deltax,TYPE deltay,TYPE deltaz); 放缩变换

void glScale{fd}(TYPE sx,TYPE sy,TYPE sz); 旋转变换 void glRotate{fd}(TYPE angle,TYPE x,TYPE y,TYPE z); (x,y,z) o 逆时针为旋转正向
视口变换
void glViewport(GLint x,GLint y,GLint width,GLint height); •(x,y):视区左下角位置 •width,height:视区的宽和高
三维图形的变换流程
视图变换 模型变换 投影变换
窗口至视 区的变换
矩阵栈及其操作(1/8)
OpenGL中的多种变换(几何变换、投影变换等)是由矩 阵的乘积实现的。 OpenGL提供了一系列矩阵操作函数。
OpenGL中的ModelView变换机制

ModelView矩阵保存着视点变换和模型 变换矩阵的累积乘积,每一次的视点变 换或模型变换矩阵与当前的ModelView 矩阵相乘就生成一个新的ModelView矩 阵。 ModelView矩阵堆栈至少包含32个4×4 的矩阵,初始状态, 最顶层的矩阵为单 位阵。 用户可以通过函数glGetIntegerv()得到系 统所允许的最大矩阵数目: glGetIntegerv(GL_MAX_MODELVIEW_ STACK_DEPTH);
矩阵栈及其操作(6/8)
矩阵相乘
void glMultiMatrix{fd}(const TYPE *matrix); •以矩阵matrix右乘栈顶矩阵并替换栈顶矩阵 •实现任意变换
M1 …
glMultiMatrix(M2)
M1*M2 …
矩阵栈及其操作(7/8)
基本几何变换的作用
– 平移变换

– 将要拍的场景置于所要求的位置上(模型变换)。
– 选择照相机镜头或调节焦距(投影变换)。 – 确定照片的大小,可以放大照片的某一部分(视口变换) 。 其中(1)、(2)顺序可看成照相馆中的照相过程;而在室外摄 影时,由于先有景物,再选择照相机的位置与方向,因此 照相顺序可看成(2)、(1)。
模型-视图变换
OpenGL就是实现将物体的各个顶点通过各种变换矩阵的 作用映射到屏幕的过程 。下图是顶点变换过程。注意: 在 模型视图变换过程中,顶点的法向量也自动地进行变换。
3.4 OpenGL变换

视点变换(视图变换)
模型变换 投影变换 视口变换 裁剪变换
OpenGL的变换过程

OpenGL的坐标变换过程类似于用照相机拍摄照片的过程。使 用照相机与坐标变换的步骤比较如下: 。 分为以下四步: – 支起三角架,把照相机放在场景中(视图变换)。
左手坐标系,该坐标系是可以活动的。在初始态下,其原
点及x、y轴分别与世界坐标系的原点及x、y轴重合,而z轴 则正好相反,即为垂直屏幕面向内。

默认:视点在原点,视线沿Z轴负方向。
坐标系
右手坐标系
y
窗口 x
o z
缺省的观察坐标系
视点变换

View变换可以改变视点的位置和方向,要在 Model变换之前调用。设置任意观察坐标点。
投影变换

就是要确定一个视景体,其作用有两个:
– 确定物体投影到屏幕的方式,即是透视投影还是正 交投影。
– 确定从图象上裁剪掉哪些物体或物体的某些部分。

投影变换包括透视投影和正交投影(平行投影

透视投影

其视景体是一个截头锥体,再这个体积
内的物体投影到锥的顶点,有 glFrustum命令定义这个截头锥体,这 个取景体积可以是不对称的 void glFrustum(Gldouble left,Gldouble right,Gldouble bottom,Gldouble top, Gldouble near,Gldouble far);
坐标系3 坐标系2 坐标系1
M2 M1 … glPopMatrix()
M1
坐标系2

坐标系1
矩阵栈及其操作(5/8)
设置栈顶矩阵
void glLoadMatrix(const TYPE *matrix); •将栈顶矩阵替换为matrix •实现任意变换
M1 …
glLoadMatrix(M2)
M2 …
glBegin(GL_POINTS);
glVertex3f(v); /* draw transformed vertex v */ glEnd(); 在这个过程中,在GL_MODELVIEW状态下,相继引入了I (单位阵),N,M,L矩阵。变换后的顶点为NMLv(顶点取列向 量)。因此,顶点的变换为N(M(Lv)),即是先作变换L,然后是 变换M,最后才是N。这里,顶点v 的实际变换顺序正好与指 wk.baidu.com的顺序相反。

状态变量可以通过glEnable()、glDisable()这
两个函数来设置成有效或无效状态 。 另外可以用下列四个函数来获取某个状态变量 的值:glGetBooleanv()、glGetDoublev()、 glGetFloatv()和glGetIntegerv()。

3.4 OpenGL变换
M … M*T
glTranslate{fd}()

– 放缩变换
M … M*S glScale{fd}() …
矩阵栈及其操作(8/8)
– 旋转变换
M …
glRotate{fd}()
M*R …
变换的顺序:
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glMultMatrixf(N); /* apply transformation N */ glMultMatrixf(M); /* apply transformation M */ glMultMatrixf(L); /* apply transformation L */


在调用投影变换命令前必须先在程序中加入下 述语句: glMatrixMode(GL_PROJECTION); glLoadIdentity(); 这两条命令一方面指定接下来的变换命令只影 响投影矩阵,同时也将当前投影矩阵设置为单 位阵。
OpenGL中的ModelView变换机制
矩阵 ModelView矩阵:描述了物体的旋转、平移、缩放等变换 Projection矩阵:描述了从三维空间到二维屏幕的变换
glLoadIdentity()

矩阵栈及其操作(3/8)
压栈
void glPushMatrix(void); •复制栈顶矩阵并压入栈 •记住位置
坐标系2 坐标系1
M …
M
glPushMatrix() M …
坐标系3 坐标系2 坐标系1
矩阵栈及其操作(4/8)
出栈
void glPopMatrix(void); •弹出栈顶矩阵 •回到记住的位置
相关文档
最新文档