OpenGL(4)-Opengl矩阵变换
2016-01-05 14:05
302 查看
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()可以创建视口矩阵。 !前三个都是右手坐标系,最后一个是左手坐标系,下图是我盗来的图。
相关文章推荐
- Centos7编译安装MySQL5.5
- JNDI学习总结(4)——Tomcat下使用Druid配置JNDI数据源
- JNDI学习总结(3)——Tomcat下使用C3P0配置JNDI数据源
- JNDI学习总结(3)——Tomcat下使用C3P0配置JNDI数据源
- Windows Server Team Bonding与Cisco交换机端口聚合实现高可用
- Windows Server Team Bonding与Cisco交换机端口聚合实现高可用
- Linux系统下安装rz/sz命令及使用说明
- linux下vi编辑器backspace不能正确删除文字
- shell环境变量
- tomcat Unable to read TLD "META-INF/c.tld"
- 如何在Linux上使用命令行查看硬件信息
- OpenMesh学习笔记2 特点和开发目标
- hadoop起步之mapReduce
- 应用业务数据的监控 框架
- Popuwindow简单使用
- Centos7 创建服务
- Centos 7 Nginx 服务
- apache配置ssl证书
- 网站性能优化— WebP 全方位介绍
- 网站性能优化— WebP 全方位介绍