初探计算机图形编程技术之OpenGL编程变换的秘密

变换的流程

通过之前的了解,我们知道OpenGL的变化包括:几何变换 -> 投影变换 -> 裁剪 -> 视口变换:
变换
变换2
  • 变换流程对应的OpenGL函数:
    对应的OpenGL函数

    下面详细的介绍下各个过程:

几何变换

几何变换包括三种:平移、缩放、旋转。
几何变换
  • 平移:
    平移

    例如点的平移:
    点的平移
  • 缩放:
    缩放
  • 旋转:
    旋转

    写成矩阵表达式:
    旋转矩阵表达
    按任意轴旋转解决方案:
    任意轴旋转
    将顶点从坐标系统oxyz 变换到oxˊyˊzˊ中可以表示为矩阵 A

    则绕任意向量 (Ax , Ay , Az ) 的旋转变换

    可以表示为:
    计算公式

几何变换的本质就是矩阵的变换

上面我们看到,几何变化都有对应的矩阵计算,其实OpenGL底层就是矩阵的计算(这么设计,应该是从GPU的计算能力方面考虑的):
矩阵计算

连续的几何变换就是矩阵的相乘:
矩阵相乘
结合OpenGL的函数来:
组合变换1
组合变换2

堆栈管理矩阵

  • 堆栈管理矩阵对应的OpenGL函数是:
    堆栈管理函数

    - 具体的应用及原理:
    堆栈管理函数的原理
    - 可以嵌套使用:
    嵌套使用
    - 堆栈函数的作用流程:
    作用流程1
    作用流程2
    作用流程3

模型变换与视点变换:

  • 模型变换(mode transformation):视点不变,变物体,对应的OpenGL函数:glMatrixMode(GL_MODELVIEW)。
  • 视点变换(view transformation):物体不变,变视点,对应的OpenGL函数:gluLookAt(eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz)。
  • 上面介绍的几何变换可以看作是模型变换,gluLookAt()函数模拟的是视点变换,其实两者的本质都是一样的,最后都是通过矩阵的组合计算来到达变换的目的。

全局变换和局部变换

先看下面的例子:
全局变换和局部变换

组合变换的,全局变换和局部变换可以通过调整变换顺序到达相同的效果:
全局变换和局部变换
可以得出如下结论:
  • 如果只有一次变换,局部变换和全局变换,效果是一致的;
  • 如果多个组合变化,局部变换和全局变换,效果基本是不相同的;
  • 局部变换通过相反的组合顺序可以达到全局变换的效果,反之也一样,即组合变换的情况下,两者的可以通过对方相反的组合顺序达到相同的效果。
  • 在OpenGL中的变换中,是全局变换呢还是局部变换呢?
    变换矩阵

    从上述矩阵计算的过程可以看出,OpenGL在只有一个变换的时候,是全局变换,当是组合变换的时候,最后变换的先计算,相当与是函数的调用顺序相反,总体来讲又是局部变换。

投影变换

  • 投影变换:给定视点,视线方向,计算出当前顶点对应投影点的坐标。
    投影变换
  • 对应的OpenGL函数:
    OpenGL函数
    glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
    gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
    glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
  • 投影变换也是通过矩阵来实现的;
  • 投影变换也有对应的矩阵管理堆栈;
  • glMatrixMode(GL_PROJECTION)。

视口变换

图像经过投影后,最总是要显示到屏幕上指定的区域的,这个指定的区域就是shi 视口。
图像显示在屏幕上的过程

OpenGL开发的编程函数是void glViewport (GLint x, GLint y, GLsizei width, GLsizei height)。设置当前窗口显示的区域,参数值都是以屏幕的像素为单位。
一般这个函数是与投影函数结合起来使用的,投影函数决定投影窗口的比例,只有当投影窗口的比例跟视口的比例一致时,才会保证图像不会因为窗口大小调整而变形。具体代码如下:

    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity ();
    gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 4, -10.0);

未完待续。。。

推荐阅读更多精彩内容

  • 1、 江林和夏雨菲商量结婚时,夏老爷子说:“我五个女儿,条件都一样。第一:女婿不参与家里的生意;第二:愿意入赘,房...
    点点圈儿阅读 1,110评论 10 25
  • 文:独栗 图源网络,侵删 为什么你终日感慨自己单身可悲?我从不这样认为。说俗一点,这种事本来就应该是随缘随遇。...
    独栗阅读 669评论 2 3
  • 公司:38磁疗饰品--林艳--378期反省1组塾生,439期感谢2组志工,531期努力3组志工 【经典诵抄】 抄经...
    林艳的阅读 92评论 2 0
  • 1.职业生涯规划无用论 快速变化的社会,无法预知1年后的变化。那写出 职业规划考虑两天主线:一条明线,收入的提高,...
    今宵说阅读 79评论 0 2