参考内容:
1. 这次,彻底搞懂 OpenGL 矩阵转换
2. Article - World, View and Projection Transformation Matrices
模型变换的基本流程图:
1. 模型变换
模型变换解决的是,把物体在世界坐标系下的位置拆分成平移、缩放、旋转的表达方式。
1. 平移矩阵
2. 缩放矩阵
3. 旋转矩阵
下图依次为分别绕X、Y、Z轴的旋转矩阵:
2. 视图变换
视图变换的作用可以理解为,指定一个照相机的位置和角度,然后去观察世界坐标系下的物体。
上图中左半部分,是将摄像机放进世界坐标系,右半部分则是将世界坐标内的所有Object变换到视图空间(又称摄像机空间)。
3. 投影变换
投影变换是把前面在三维空间中的坐标投影到二维屏幕坐标,但是计算结果也是一个三维坐标(严格来说是四维的,还有个齐次的 1),除了屏幕的横纵坐标之外,另一个维度就是垂直屏幕方向上的深度坐标,就是之后可以写入深度缓冲器的值。
1. 正交投影
为了确定摄像机所能观察到的范围,需要在X、Y轴上定义width值和height值,并在Z上分别定义near z值和far z值。
2. 透视投影
透视投影相对于正交投影多了一个fov量,即视角。
4. 视口变换
视口变换,这里只是一个非常简单的 X-Y 平面上的缩放,它决定了最终渲染到屏幕上的哪一块区域。
5. 变换结果
变换后的坐标 = 视口矩阵 x 投影矩阵 x 视图矩阵 x 模型矩阵 x 模型点坐标
其中模型点坐标和变换后的坐标是 1x4 的向量,其他矩阵都是 4x4 的。
规定:OpenGL的向量为列向量,矩阵和向量采用的方式又是“矩阵X列向量”的方式,当多个矩阵乘以向量时,应该从右向左计算。故上式的计算顺序为模型点坐标先与模型矩阵相乘,再与视图矩阵相乘,投影矩阵和视口矩阵,最后得到变换后的坐标 。
$. 补充内容
- OpenGL中的顶点一般用齐次坐标表示,且以列向量的形式呈现,矩阵变换采用的方式即为“矩阵x列向量”的方式。
- 旋转时的方向
OpenGL遵循右手坐标系,即有:
X轴正方向 | Y轴正方向 | Z轴正方向 |
---|---|---|
沿屏幕向右 | 沿屏幕向里 | 沿屏幕向上 |
空间姿态:
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
θ
θ
。下面为求解过程:
绕X轴旋转时,x值不变,故可将三维问题投影到Y-Z平面进行计算,如上图示点(y, z)旋转
θ
θ
到达点(y1, z1),推到过程如下所示:
4. 透视图画法