OpenGL学习笔记:第二章 OpenGL变换(视点变换,模型变换,投影变换,视口变换)

OpenGL变换

三维物体在计算机上是以二维平面图形的形式表现的。因此,要对三维物体进行一系列的变换,这个过程类似于相机照像,下面的图说明了变换与照像能够对应的地方,同时也说明了OpenGL变换的大致流程。
三维图形显示和相机拍照之间的对应关系

各种各样的变换是通过矩阵乘法实现的每一个变换就是一个4*4的矩阵,与顶点坐标(x,y,z,w)(w在绝大多数情况下默认为1)相乘。

在设计程序之前,视点变换必须要在模型变换之前,而在绘图前的任何时候都可以投影变换和窗口变换。因为一般的变换都是把当前矩阵和指定矩阵相乘,然后把结果指定为当前矩阵,所以要指定视点变换之前,要用glLoadIdentity()把当前矩阵设为单位矩阵,如果没有用单位矩阵来清除当前矩阵,则所进行的变换是把当前变换和上一次变换进行组合。

视点变换

也叫视图变换,用函数gluLookAt()指定,函数原型
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 相机向上的方向在世界坐标中的方向

你把相机想象成为你自己的脑袋:

第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。

在默认情况下,照相机位于原点,指向z轴的负方向,朝上向量为(0,1,0)。

模型变换

具体就是指对模型的平移、旋转、缩放变换。

平移变换

void glTranslatef(GLfloat x, GLfloat y, GLfloat z);
void glTranslated(GLdouble x, GLdouble y, GLdouble z);

这两个函数将坐标原点移动到(x,y,z)处,即相当于物体右移x,上移y,前移z,而物体之间的相对位置不变。

旋转变换

void glRotatef(GLfloat angle,GLfloat ,GLfloat y,GLfloat z);
void glRotated(GLdouble angle, GLdouble, GLdouble y, GLdouble z);

绕着从原点指向(x,y,z)的射线,将原坐标逆时针旋转angle角度。

缩放变换

void glScalef(GLfloat a, GLfloat b, GLfloat c);
void glScaled(GLdouble a, GLdouble b, GLdouble c);

将坐标系的x,y,z轴分别缩放a,b,c倍,坐标轴内的物体同步缩放。

投影变换

投影变换把三维物体表示成二维物体,实际上就是确认视野/视场,因此确定哪些物体位于视场之内以及他们能被看到的程度,OpenGL假设屏幕存在并且为屏幕设定一个观察位置。

在定义投影变换之前,必须使用如下两个函数,才能让随后的变换作用于投影矩阵而不是模型变换矩阵,避免产生复合的投影变换:

GlMatrixMode(GL_PROJECTION); //启动投影矩阵
glLoadIdentity();                 //初始化为单位阵調

平行投影

平行投影示意
平行投影主要涉及到下面的函数:

glOrtho(GLdobule left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far)

六个参数,前面两个是x轴最小坐标和最大坐标,中间两个是y轴,最后两个是z轴,定义了构成视场的六个平面。

这个函数创建的是一个平行视景体,就是一个长方体区域,实际上是创建一个正射投影矩阵,并且用这个矩阵乘以当前矩阵,所有的near和far值同时为正,或者同时为负,但值不能相同,如果没有其他变换,正射投影的方向平行于z轴,且视点朝向z负轴,这意味着物体在视点前面时far和near都是负值,在视点后面时far和near都为正值,只有在视景体里面的物体才能显示出来。

透视投影

透视投影定义1

透视投影定义1
透视投影主要涉及到下面的函数:

void glFrustum(GLdouble left,GLdouble Right,GLdouble bottom, GLdouble top, GLdouble near, GLdouble far)

创建一个透视型的视椎体,其操作是创建一个透视投影的矩阵,并且用这个矩阵乘以当前矩阵。

这个函数的参数之定义,只定义近才见面的左下角点和右上角点的三维空间坐标,即(left,bottom,-near)和(right,top,-near),最后一个参数far是裁减面的,离视点的距离值,其左下角和右上角空间坐标由函数根据透视投影原理自动生成,near和far为正值,即必须>0

透视投影定义2

透视投影定义2

void gluPerspective(GLdouble fovy[添加链接描述](https://gameinstitute.qq.com/community/detail/117284),GLdouble aspect,GLdouble zNear,GLdouble zFar);

创建一个对称的透视型视椎体,其操作是创建一个对称的透视投影矩阵。参数fovy定义视野在Y-Z平面的角度,范围是[0.0, 180.0],参数aspect是投影平面宽度与高度的比例;参数near和far分别是近远裁剪面到视点的距离,沿Z负轴,总为正值。

视口变换

void glViewPort(Glint x, Glint y, Glsizei width, Glsizei height) 

定义了左边和上边的偏移及宽高,多视口的相关介绍可以参照下面这篇文章:OpenGL进阶(一):多视口

猜你喜欢

转载自blog.csdn.net/KingsMan666/article/details/112990013