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

本文详细介绍了OpenGL中的变换流程,包括视点变换、模型变换、投影变换和平行及透视投影。视点变换通过gluLookAt()设置相机位置和方向;模型变换涉及平移、旋转和缩放,使用glTranslatef(), glRotatef()和glScalef()函数;投影变换中,glOrtho()用于平行投影,glFrustum()和gluPerspective()用于透视投影,定义视景体。最后,glViewport()定义视口变换,将三维图形映射到二维屏幕。这些变换是构建3D场景的关键步骤。

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进阶(一):多视口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KingsMan666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值