OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵

OpenGL的渲染流水线:


OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第1张图片

OpenGL的坐标系

在3D图形学里,OpenGL为右手坐标系(准确来说,OpenGL的世界空间和相机空间是右手坐标系)。随便提一下,D3D11为左手坐标系。

(1) 右手坐标系

OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第2张图片


(2) 左手坐标系
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第3张图片

OpenGL的矩阵和向量结合方式

OpenGL的向量为列向量,矩阵和向量采用的方式为“矩阵X列向量”的方式,而D3D11为"行向量X矩阵"的方式。OpenGL的向量矩阵结合如下所示:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第4张图片


当多个矩阵乘以向量时,应该从右向左计算,比如存在三个矩阵:Proj,View,Model    向量:Pos

Proj*View*Model*Pos 代表 向量Pos先进行Model的变换,然后在进行View的变换,最后进行Proj的变换


OpenGL的各个空间的变换矩阵


世界变换矩阵

我一般称世界矩阵为SRT矩阵,SRT分别是"Scale","rotate","translate"三个单词的缩写,也就是世界矩阵由缩放矩阵,旋转矩阵,平移矩阵构成的

(1)缩放矩阵 (ScaleMatrix)

假设在X轴缩放Sx倍,在Y轴缩放Sy倍,在Z轴缩放Sz倍,缩放如下所示:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第5张图片


顶点乘以矩阵的公式如下:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第6张图片

(2)旋转矩阵

在说明旋转矩阵之前,我得说明一下,在右手坐标系如何判断哪个方向为顺时针方向旋转。

先来看下面的图,我们先用右手的拇指朝向Y的正方向,则四指所绕的方向也就是饶Y轴渲染的顺时针方向了,其它轴的顺时针方向同理也就是这样判断。

OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第7张图片

一,绕X轴顺时针旋转Θ度数

OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第8张图片

二,绕Y轴顺时针旋转Θ度数


OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第9张图片


三,绕Z轴顺时针旋转Θ度数


OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第10张图片



(3)移动矩阵(TranslateMatrix)

假设某个顶点在X轴方向移动dx个单位,Y轴移动dy个单位,在Z轴移动dz个单位
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第11张图片


二,相机变换矩阵(ViewMatrix)

在此之前看看UVN相机模型,如图所示:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第12张图片
注视向量N的方向跟相机空间(ViewSpace)的Z轴方向是一致的,而竖直向量V的方向与相机空间(ViewSpace)的Y轴方向是一致的,右向量U的方向与相机空间(ViewSpace)的X轴方向是一致的。
计算UVN向量的公式如下:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第13张图片

这里的“X”为叉乘的意思,并且一样可以通过右手规则(OpenGL世界空间为右手坐标系)得到叉乘向量的方向,也就是用右手从叉乘符号左边那个向量绕向叉乘符号右边的那个向量,拇指所指方向即为叉乘得到向量的方向。

相机矩阵如下所示:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第14张图片



具体推导见文章:推导相机变换矩阵,当然这篇博客对于OpenGL的相机矩阵计算是有些错误的。

三,透视投影矩阵(PerspectiveMatrix)



在推导透视投影矩阵前先看看视截体(Frustum)是怎么样的:
OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第15张图片
视截体在YZ平面的投影如下面图所示,

OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第16张图片

n为原点到近截面的距离,f为原点到远截面的距离,α为视截体在YZ平面投影的FOV视角,r为投影平面的宽高比,则透视投影矩阵为:

OpenGL渲染流水线之世界矩阵,相机变换矩阵,透视投影变换矩阵_第17张图片


具体推导参见文章:  
深入探索透视投影变换 和 深入探索透视投影变换(续)




你可能感兴趣的:(OpenGL,computer,graphics)