《深入了解opengl》第二讲:顶点线性变换

上传人:ji****n 文档编号:48121354 上传时间:2018-07-10 格式:DOC 页数:11 大小:66.50KB
返回 下载 相关 举报
《深入了解opengl》第二讲:顶点线性变换_第1页
第1页 / 共11页
《深入了解opengl》第二讲:顶点线性变换_第2页
第2页 / 共11页
《深入了解opengl》第二讲:顶点线性变换_第3页
第3页 / 共11页
《深入了解opengl》第二讲:顶点线性变换_第4页
第4页 / 共11页
《深入了解opengl》第二讲:顶点线性变换_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《《深入了解opengl》第二讲:顶点线性变换》由会员分享,可在线阅读,更多相关《《深入了解opengl》第二讲:顶点线性变换(11页珍藏版)》请在金锄头文库上搜索。

1、深入了解深入了解 OpenGLOpenGL第二讲:顶点线性变换第二讲:顶点线性变换时间: 2010-05-11 12:56 点击: 2157 次上周发布了 深入了解 OpenGL第一讲:绘制基本图元,今天 CocoaChina 会员 zenny_chen 带来了OpenGL 知识第二讲。帖子地址 http:/ 这一章节可能会比较枯燥, 上周发布了深入了解 OpenGL第一讲:绘制基本图元,今天 CocoaChina 会员 “zenny_ chen” 带来了 OpenGL 知识第二讲。帖子地址 http:/ 知识夹杂其中。在本章中我们将对 3D 图形进行绘制。我们会介绍 顶点变换的过程,以及 法

2、线向量与绘制顺序。这里将首先介绍一下一个三维空间上的顶点被映射到二维屏幕坐标的步骤,请各位务必牢 记: 物体顶点坐标(顶点)模型视图变换 - 视觉坐标投影变换 - 裁剪坐标透 视划分 - 规格化设备坐标视口变换 - 窗口坐标 上图中,表示经过某种变换;- 表示得到某个坐标。下面我们将根据这个顺序来依次介绍各个变 换。这里将主要介绍模型视图变换和投影变换 。先介绍 OpenGL 中物体顶点坐标的表示。OpenGL 中,物体的顶点坐标是由一个四维的行向量来表示的,表示为:(x, y, z, w)。其 中,x, y, z 分别对应 x 轴、y 轴和 z 轴,而 w 用于辅助做线性变换。我们会理所当然

3、地认 为,三维坐标系只要三个分量就够了,w 到底有何用呢? 我们这里首先要说 明一下,在 OpenGL 中,线性变换矩阵的变换都是用矩阵的乘法,没有 加减法,因此所有线性变换都是通过矩阵的乘法来完成的。所以,比如说我们要把一个顶 点:(1, 1, 1)沿 x 轴向右平移 5 个单位,那要用三维变换矩阵表示的话就要是:M = 6, 0, 0; 0, 1, 0; 0, 0, 1。那么 v = v * M = (6, 1, 1)。 但很多场合下使用三维空间做变换将会使计算变得非常复杂,甚至很难进行变换,因此引 入 四维空间使得变换更加灵活。 比如,顶点 v = (1, 1, 1, 1)沿 x 轴向右

4、平移 5 个单位,那么变换矩阵 M = 1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0; 5, 0, 0, 1。 我们将看到这个 4x4 的变换矩阵与 3x3 的相比就显得简单很多。因 为对于平移来说,本身 就是加法,而三维空间中就需要使用乘法,从而加大了计算负荷。 在 OpenGL 中,物体的顶点坐标在进行计算时总是以行向量的 形式表示,并且计算时总是在最左边。下面将正式介绍视图各种变换。先贴代码:1.- (void)prepareOpenGL2.3. glShadeModel(GL_SMOOTH);4. 5. glClearColor(0.0, 0.0, 0.0, 0

5、.0);6. glViewport(0, 0, 320, 320);7. 8. glMatrixMode(GL_PROJECTION);9. glLoadIdentity();10. glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, 5.0);11. 12. glMatrixMode(GL_MODELVIEW);13. glLoadIdentity();14. glTranslatef(0.3f, 0.2f, 0.0f);15. glRotatef(-30.0f, 0.0f, 0.0f, 1.0f);16. 17. glFrontFace(GL_CCW);18. glEna

6、ble(GL_CULL_FACE | GL_DEPTH_TEST);19.20. 21.- (void)drawRect:(NSRect)dirtyRect 22. 23. static struct24. 25. GLubyte colours4;26. GLfloat vertices3;27. 28. vertexInfoList = 29. 255, 0, 0, 255, -0.5f, 0.5f, -1.0f ,30. 0, 255, 0, 255, -0.5f, -0.5f, -1.0f ,31. 0, 0, 255, 255, 0.5f, 0.5f, -2.0f ,32. 255,

7、 0, 255, 255, 0.5f, -0.5f, -2.0f 33. ;34. 35. / Drawing code here.36. glClear(GL_COLOR_BUFFER_BIT);37. 38. glInterleavedArrays(GL_C4UB_V3F, 0, vertexInfoList);39. 40. glCullFace(GL_BACK);41. glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);42. 43. glFlush();44.下面介绍视图模型变换。 视图模型变换是将三维物体的顶点做平移、旋转等操作。我们可以这么理解,我们把摄

8、像 机镜头固定好,然后观察物体的移动行 为。 在上述代码的第 12 行,glMatrixMode(GL_MODELVIEW);用于将当前矩阵变换的操作作用到 视图模型变换栈上。 glLoadIdentity();作用是将当前的矩阵作为单位矩阵,即:1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0; 0, 0, 0, 1。其实际效果就是:C = I;其中,C 表示 本矩阵模式的当前矩阵,I 表示单位矩阵。glTranslatef(0.3f, 0.2f, 0.0f);是平移变换,函数原型为:void glTranslated( GLdouble x,GLdouble y,GLd

9、ouble z); void glTranslatef( GLfloat x,GLfloat y,GLfloat z);其中,x 表示沿 x 轴平移多少单位;y 表示沿 y 轴平移多少单 位;z 表示沿 z 轴平移多少 单位。而,其对应的平移变换矩阵就是:1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0; x, y, z, 1。 那么 glTranslatef(0.3f, 0.2f, 0.0f);实际效果就是:C = T * C = T * I。因为我们 刚才调用了 glLoadIdentity,因此在调用此函数时的当前矩阵就是 I。而下面的 glRotatef(-30.0

10、f, 0.0f, 0.0f, 1.0f);则是将所要绘制的物体的每个顶点坐标 绕 z 轴,顺时针旋转 30 度。下面给出 glRotatef 的原型:void glRotated( GLdouble angle,GLdouble x,GLdouble y,GLdouble z); void glRotatef( GLfloat angle,GLfloat x,GLfloat y,GLfloat z);其中,angle 表示角度制的角度;x、y 和 z 表示绕着由 x、 y 和 z 构成的向量进行旋转。 如果 angle 大于 0,则做逆时针旋转,小于 0 做顺时针旋转,等于 0 不动。 由于

11、glRotate 所对应的变换矩阵比较 复杂,各位可以参考 OpenGL 官网上的手册。 如果将旋转变换矩阵表示为 R 的话,那么这里调用 R 的效果其实就是:C = R * C。那么 将上面所有的串起来就是:C = R * (T * I)。如果顶点单纯地只经过视图模型变换,那 么对于物体其中一个顶点 v 而言,变换后的顶点 v = v * (R * (T * I)。 我们这 里实际上是先对物体做绕 z 轴旋转,然后再平移。但是调用的时候必须先调平移函 数,再调旋转函数。下面在介绍投影变换前再介绍几个对矩阵操作的函数,首先是 glLoadMatrix,下面先给出 函数原型:void glLoa

12、dMatrixd( const GLdouble * m); / 只能用于 OpenGL void glLoadMatrixf( const GLfloat * m); void glLoadMatrixx( const GLfixed * m); / 只能用于 OpenGL ES该函数表示在当前变换矩阵模式下将矩阵 m 取代当前的变换矩阵。 比如,glLoadIdentity 可以用一下代码替换:glLoadMatrixf(const GLfloat)1.0f, 0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f, 0.0f,0.0f, 0.0f, 1.0f, 0.0f,0.

13、0f, 0.0f, 0.0f, 1.0f);然后是再介绍一下 glMultMatrix 函数,请参 看函数原型:void glMultMatrixd( const GLdouble * m); / 仅用于 OpenGL void glMultMatrixf( const GLfloat * m); void glMultMatrixx( const GLfixed * m); / 仅用于 OpenGL ES这个函数就很直白地表示用矩阵 m 与当前矩阵相乘,然后将结果再 给回当前矩阵。即:C = M * C。 我们可以用一下代码替换 glTranslatef:glMultMatrixf(cons

14、t GLfloat)1.0f, 0.0f, 0.0f, 0.0f,0.0f, 1.0f, 0.0f, 0.0f,0.0f, 0.0f, 1.0f, 0.0f,0.3f, 0.2f, 0.0f, 1.0f);将上述代码替换掉 3 楼的第 14 行,效果不变。下面介绍投影变换。 投影变换就好像为照相机选择镜头。我们可以认为这种变换的目的就是确定视野(或视景 体)。并且确定哪些物体位于视野之内以及它 们能够被看到的程度。 投影变换主要有两种,一种是透视投影(Perspective Projection)。这种投影效果就像 是玩第一人称游戏或是第一人称的赛车类游戏。你向前看具有透视效果,远处的物体显得 小,近处的物体显得大。 还 有一种投影是正交投影(Orthographic Projection)。这种投影是将顶点以平行于视 野的角度垂直地映射到屏幕上。物体不管离你多远,其大小都是一样的。 透视投影对应的函数 为:glFrustum,函数原型如下:void glFrustum( GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble nearVal,GLdouble farVal); / OpenGLvoid glFrustum

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 初中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号