OpenGL矩阵变换

参考内容:
1. 这次,彻底搞懂 OpenGL 矩阵转换
2. Article - World, View and Projection Transformation Matrices

模型变换的基本流程图:

OpenGL矩阵变换_第1张图片

1. 模型变换

模型变换解决的是,把物体在世界坐标系下的位置拆分成平移、缩放、旋转的表达方式。
OpenGL矩阵变换_第2张图片
1. 平移矩阵
这里写图片描述
2. 缩放矩阵
这里写图片描述
3. 旋转矩阵
下图依次为分别绕X、Y、Z轴的旋转矩阵:
这里写图片描述 这里写图片描述 这里写图片描述

2. 视图变换

视图变换的作用可以理解为,指定一个照相机的位置和角度,然后去观察世界坐标系下的物体。
OpenGL矩阵变换_第3张图片
上图中左半部分,是将摄像机放进世界坐标系,右半部分则是将世界坐标内的所有Object变换到视图空间(又称摄像机空间)。

3. 投影变换

投影变换是把前面在三维空间中的坐标投影到二维屏幕坐标,但是计算结果也是一个三维坐标(严格来说是四维的,还有个齐次的 1),除了屏幕的横纵坐标之外,另一个维度就是垂直屏幕方向上的深度坐标,就是之后可以写入深度缓冲器的值。
1. 正交投影
为了确定摄像机所能观察到的范围,需要在X、Y轴上定义width值和height值,并在Z上分别定义near z值和far z值。
OpenGL矩阵变换_第4张图片
2. 透视投影
透视投影相对于正交投影多了一个fov量,即视角。
OpenGL矩阵变换_第5张图片

4. 视口变换

视口变换,这里只是一个非常简单的 X-Y 平面上的缩放,它决定了最终渲染到屏幕上的哪一块区域。

5. 变换结果

变换后的坐标 = 视口矩阵 x 投影矩阵 x 视图矩阵 x 模型矩阵 x 模型点坐标
其中模型点坐标和变换后的坐标是 1x4 的向量,其他矩阵都是 4x4 的。
规定:OpenGL的向量为列向量,矩阵和向量采用的方式又是“矩阵X列向量”的方式,当多个矩阵乘以向量时,应该从右向左计算。故上式的计算顺序为模型点坐标先与模型矩阵相乘,再与视图矩阵相乘,投影矩阵视口矩阵,最后得到变换后的坐标

$. 补充内容

  1. OpenGL中的顶点一般用齐次坐标表示,且以列向量的形式呈现,矩阵变换采用的方式即为“矩阵x列向量”的方式。
    OpenGL矩阵变换_第6张图片
  2. 旋转时的方向

OpenGL遵循右手坐标系,即有:

X轴正方向 Y轴正方向 Z轴正方向
沿屏幕向右 沿屏幕向里 沿屏幕向上

空间姿态:
OpenGL矩阵变换_第7张图片

NULL 俯仰角(Pitch) 翻滚角(Roll) 偏航角(Heading)
0位置: Y轴正向 X轴正向 Y轴正向
方向: 从X轴正向看去逆为正 从Y轴正向看去逆为正 从Z轴正向看去逆为正

3. 旋转矩阵的求解方法
下面以绕X轴旋转为例,当模型顶点(x, y, z, w)绕X轴旋转时,有y1 = y × × cos cos θ θ - z × × sin sin θ θ 。下面为求解过程:
OpenGL矩阵变换_第8张图片
绕X轴旋转时,x值不变,故可将三维问题投影到Y-Z平面进行计算,如上图示点(y, z)旋转 θ θ 到达点(y1, z1),推到过程如下所示:
OpenGL矩阵变换_第9张图片
4. 透视图画法
OpenGL矩阵变换_第10张图片

你可能感兴趣的:(OpenGL)