OpenGL(4)-Opengl矩阵变换

Opengl矩阵变换

矩阵变换

    Opengl中有很多坐标系,但实际上他们只是思考方式的不同。opengl渲染图形耳朵过程可以和照相机照相的过程类比起来。用照相机照相的过程分为如下几个步骤:
 1. 把照相机固定在三脚架上面,对准场景(视图变换)
 2. 对场景进行安排调整(模型变换)
 3.  选择照相机的镜头,调整放大倍数(投影变换)
 4. 确定最终照片的尺寸(视口变换)
*!注意,上述顺序只是程序制定的变换顺序,而不是实际的数学操作顺序*
**!在代码中,视图变换必须出现在模型变换之前**

奇次坐标

    为了更好地表示上述的矩阵变换,可以创建一个4*4的矩阵。(一个点只有x,y,z三个坐标,为什么会是四维的呢?)这里,就要引出其次坐标的概念了。
    通常的矩阵变换,P=M*P0+C,也叫做仿射变化。这样表示的变换存在一种不便:需要乘法和加法两次计算才能完成转换。回想多项式乘法会发现,(a+b)^n 的展开式相当之长,这样,当变换的次数很多时,这样的计算就会很复杂且不直观。由此,引入了齐次坐标的概念:对于某个三维坐标点(x, y, z),增加一维 w != 0,并对原三维坐标进行同样的缩放,形成新的四维坐标(wx, wy, wz, w),即是所谓齐次坐标。引入了齐次坐标后,原式就可以改写为:P'=M'*P0',这样,仿射变化只需要进行乘法运算即可完成了。因此,在OpenGL中,每个顶点都有四个坐标,每个矩阵都是4*4的矩阵。
    !注意,在OpenGL中,所有的矩阵都是列主序。

矩阵变换的顺序

    首先,我们可以考虑两个最基本的变换,(1)一个是沿着原点绕在z轴旋转45度,(2)另一个是沿着x轴向下平移。分别执行(1)(2)和(2)(1),我们会发现,变换的结果完全不同。这是为什么呢?OK,我们从下面的代码块探讨原因。
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glMutlMatixf(N);//apply transformation N
glMutlMatixf(M);//apply transformation M
glMutlMatixf(L);//apply transformation L
glBegin(GL_POINTS);
glVertex3f(v);
glEnd();
    从上述代码块我们可以看出,程序中,矩阵的变换顺序是N-M- L;而实际上先和顶点v的坐标作用的是矩阵L,Lv再和M相乘,MLv再和M相乘。因此,每一次的矩阵变换都是左乘,实际执行的顺序与程序的顺序是相反的。这也不难理解上面两个基本变换的结果完全不同了。

矩阵变换的实现方式

每一种矩阵变换只需要把对应的矩阵左乘当前的矩阵,从而实现对应的矩阵变换。
 1. 模型变换(局部坐标-->世界坐标)
    opengl中有三个函数定义模型矩阵。glTranslate(),glRotate()以及glScale(),这三个函数封装了glMultMatrix(),速度比不封装更快。这三个函数中的坐标都是局部坐标。
2. 视图变换(世界坐标-->视图坐标)
    gluLookAt()函数可以定义视图矩阵,这个函数中的坐标是世界坐标。除此之外,由于顺时针转动物体相当于逆时针转动照相机,因此,glTranslate(),glRotate()组合也可以实现视图变换。
3. 投影变换(视点坐标->投影坐标)
    glFrustum()以及glPerspective()函数可以创建投影矩阵。(针对透视投影)glOritho()也可以创建投影矩阵(正交矩阵)。
4. 视口变换
glViewPoint()可以创建视口矩阵。
!前三个都是右手坐标系,最后一个是左手坐标系,下图是我盗来的图。

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值