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

变换的流程

通过之前的了解,我们知道OpenGL的变化包括:几何变换 -> 投影变换 -> 裁剪 -> 视口变换:
初探计算机图形编程技术之OpenGL编程变换的秘密_第1张图片
变换
初探计算机图形编程技术之OpenGL编程变换的秘密_第2张图片
变换2
  • 变换流程对应的OpenGL函数:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第3张图片
    对应的OpenGL函数

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

几何变换

几何变换包括三种:平移、缩放、旋转。
初探计算机图形编程技术之OpenGL编程变换的秘密_第4张图片
几何变换
  • 平移:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第5张图片
    平移

    例如点的平移:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第6张图片
    点的平移
  • 缩放:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第7张图片
    缩放
  • 旋转:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第8张图片
    旋转

    写成矩阵表达式:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第9张图片
    旋转矩阵表达
    按任意轴旋转解决方案:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第10张图片
    任意轴旋转
    将顶点从坐标系统oxyz 变换到oxˊyˊzˊ中可以表示为矩阵 A

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

    可以表示为:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第11张图片
    计算公式

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

上面我们看到,几何变化都有对应的矩阵计算,其实OpenGL底层就是矩阵的计算(这么设计,应该是从GPU的计算能力方面考虑的):
初探计算机图形编程技术之OpenGL编程变换的秘密_第12张图片
矩阵计算

连续的几何变换就是矩阵的相乘:
初探计算机图形编程技术之OpenGL编程变换的秘密_第13张图片
矩阵相乘
结合OpenGL的函数来:
初探计算机图形编程技术之OpenGL编程变换的秘密_第14张图片
组合变换1
初探计算机图形编程技术之OpenGL编程变换的秘密_第15张图片
组合变换2

堆栈管理矩阵

  • 堆栈管理矩阵对应的OpenGL函数是:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第16张图片
    堆栈管理函数

    - 具体的应用及原理:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第17张图片
    堆栈管理函数的原理
    - 可以嵌套使用:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第18张图片
    嵌套使用
    - 堆栈函数的作用流程:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第19张图片
    作用流程1
    初探计算机图形编程技术之OpenGL编程变换的秘密_第20张图片
    作用流程2
    初探计算机图形编程技术之OpenGL编程变换的秘密_第21张图片
    作用流程3

模型变换与视点变换:

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

全局变换和局部变换

先看下面的例子:
初探计算机图形编程技术之OpenGL编程变换的秘密_第22张图片
全局变换和局部变换

组合变换的,全局变换和局部变换可以通过调整变换顺序到达相同的效果:
初探计算机图形编程技术之OpenGL编程变换的秘密_第23张图片
全局变换和局部变换
可以得出如下结论:
  • 如果只有一次变换,局部变换和全局变换,效果是一致的;
  • 如果多个组合变化,局部变换和全局变换,效果基本是不相同的;
  • 局部变换通过相反的组合顺序可以达到全局变换的效果,反之也一样,即组合变换的情况下,两者的可以通过对方相反的组合顺序达到相同的效果。
  • 在OpenGL中的变换中,是全局变换呢还是局部变换呢?
    初探计算机图形编程技术之OpenGL编程变换的秘密_第24张图片
    变换矩阵

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

投影变换

  • 投影变换:给定视点,视线方向,计算出当前顶点对应投影点的坐标。
    初探计算机图形编程技术之OpenGL编程变换的秘密_第25张图片
    投影变换
  • 对应的OpenGL函数:
    初探计算机图形编程技术之OpenGL编程变换的秘密_第26张图片
    OpenGL函数
    初探计算机图形编程技术之OpenGL编程变换的秘密_第27张图片
    glFrustum(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
    初探计算机图形编程技术之OpenGL编程变换的秘密_第28张图片
    gluPerspective(GLdouble fovy, GLdouble aspect, GLdouble zNear, GLdouble zFar)
    初探计算机图形编程技术之OpenGL编程变换的秘密_第29张图片
    glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)
  • 投影变换也是通过矩阵来实现的;
  • 投影变换也有对应的矩阵管理堆栈;
  • glMatrixMode(GL_PROJECTION)。

视口变换

图像经过投影后,最总是要显示到屏幕上指定的区域的,这个指定的区域就是shi 视口。
初探计算机图形编程技术之OpenGL编程变换的秘密_第30张图片
图像显示在屏幕上的过程

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);

未完待续。。。

你可能感兴趣的:(初探计算机图形编程技术之OpenGL编程变换的秘密)