1.OpenGL图形管线(显示流程)
2.模型变换(Modeling Transformation)
MC(
模型坐标
, Child ->
Parent
) ->
WC(
世界坐标
)
标准C语言的矩阵为行主序,即M[i][j]表示第i行、第j列。 OpenGL中的矩阵为
列主序,即M[i][j]表示第i列、第j行。 以下所有矩阵都为列主序矩阵!
MC(
模型坐标) -> WC(世界坐标)
3.视点变换(Viewing Transformation)
WC(世界坐标) -> VC(观察坐标,即观察坐标系下的局部坐标)
设置视点
gluLookAt(eyex, eyey, eyez, //视点(相机)坐标
centerx, centery, centerz, //参考点(场景中心点)坐标
upx, upy, upz); //向上向量
OpenGL根据gluLookAt()的参数计算
视景矩阵。观察坐标系以视点为原点,以视线方向(参考点至视点方向)为+Z轴。下图中MgluLookAt为观察坐标转换为世界坐标的转换矩阵, OpenGL中的视景矩阵ModelViewMatrix为该矩阵的逆矩阵,世界坐标经逆矩阵变换后变为观察坐标。
4.投影变换(Projection Transformation)
VC(
观察坐标
)->
PC (
投影坐标
)->
NC(
归一化坐标
)
设置正交投影的投影范围
glOrtho(xmin, xmax, //观察坐标系中的X范围
ymin, ymax, //观察坐标系中的Y范围
znear, zfar); //观察坐标系中的Z范围
OpenGL根据glOrtho()的参数计算
投影矩阵。这个矩阵的作用就是将坐标进行正交投影并且将投影后的坐标归一化 (转换到-1到1之间),且六面体的中心在观察坐标系的原点。同时右手坐标系转换为左手坐标系!
投影示意图:
5.视口变化(Viewport Transformation)
NC(
归一化坐标
) ->
DC (
设备坐标
)
设置视口
glViewport(x, y, //视口的左下角坐标(像素单位)
width, //视口的宽度
height); //视口的高度
OpenGL根据glViewport()的参数计算
视口矩阵。将归一化的x,y坐标值转换为像素坐标,但z坐标值(深度值)转换为0到1之间!
6.OpenGL的像素坐标系
OpenGL中的像素坐标系,原点位于左下角,x轴向右,y轴向上。