OPENGL知识点整理(一)
概述内容为阅读相关博主文档后整理,因此,相当部分的内容直接引用自如下链接:
https://www.jianshu.com/p/5da5a17ad5cb
https://blog.csdn.net/u012861978/article/details/97833643
1.坐标系
在opengl中,根据处理的先后次序来分,主要有如下几个坐标系:
1.1 物体坐标系
就是以要被渲染物体的重心作为坐标体系,可以标识出该物体的各个定点的坐标(个人理解)
不同的物体都有其自己的物体坐标系
1.2 惯性坐标系
惯性坐标系原点域物体的物理坐标系相同,但是其x,y,z轴与世界坐标系平行,方向相同,并且可以通过平移转换成世界坐标系
物体坐标系中定点的坐标位置通过三轴转换(旋转矩阵)的矩阵可以转换到惯性坐标系中该顶点的坐标位置
1.3 世界坐标系
世界坐标系是用来描述OpenGL场景的坐标系。该坐标系的三轴方向以右手坐标系表示:
惯性坐标系下的定点的坐标位置可以通过平移转换成世界坐标系下的坐标位置。
1.4 眼坐标系
眼坐标系可以理解为相机坐标系,相机就是一个类似于人眼这样可以通过不同角度观察OpenGL场景的存在,根据其镜头的指向可以得到眼坐标系(相机坐标系)
将世界坐标系下定点的坐标位置转换成眼坐标系下的坐标位置可以理解为物体坐标系到世界坐标系的转换的逆操作,因为对于世界坐标系来说,眼(相机)也是一个模型。
1.5 裁剪坐标系
因为对于眼睛来说,其是有可视范围的,太近或者太远的内容就无法出现在视野中,因此需要将不在视野中的物体裁减掉。
这个裁剪动作是通过投影来做到的,投影是以在眼坐标系中的定点坐标进行操作的。
投影的方式有平行和透视两种:
平行的情况下,物体不会出现缩放的情况,只是有遮挡
透视的情况下,以眼坐标系为观察原点,物体定点的坐标位置还需要进行缩放
因此,根据不同的投影方式,可以将裁剪理解为两种不同的几何体:
平行的情况下,裁剪坐标系就是一个立方体
透视的情况下,裁剪坐标西是一个棱台
如下图(右侧为平行投影,左侧为正交投影):
1.6 归一化坐标系
将裁剪坐标系中的几何体的x,y,z轴的范围都所见到[-1,1]的范围内,这个操作叫做归一化操作。
因此,对裁剪坐标系下的物体的定点进行归一化操作后,每个定点的坐标的x,y,z的值范围都在[-1,1]内。
1.7 屏幕坐标系
屏幕坐标系是左手坐标系
以屏幕左上角为原点,向下为Y轴,向右为X轴,向屏幕内为Z轴
将归一化坐标系内的物体的定点坐标转换到屏幕坐标系下时,只需要将z轴的值取反即可。
函数glViewport()函数可以设置将物体渲染到屏幕的哪块区域。
2. 坐标系的转换
物体坐标系 * 旋转矩阵1 = 惯性坐标系
惯性坐标系 * 平移矩阵1 = 世界坐标系
世界坐标系 * (旋转矩阵2 * 平移矩阵2) = 眼坐标系
眼坐标系 * 投影矩阵= 裁剪矩阵
之所以只列出上面几个坐标的转换,是因为后面的归一化,屏幕坐标系的转换是由OpenGL来完成的。
其中,
旋转矩阵1 * 平移矩阵1 = 模型矩阵
旋转矩阵2 * 平移矩阵2 = 视图矩阵
因此,一共有三个重要的矩阵:模型矩阵,视图矩阵,投影矩阵,简称mvp (model view, projection)