OpenGL中的6种坐标系
1. Object or model coordinates 局部坐标系/模型坐标系
2. World coordinates 世界坐标系
3. Eye (or Camera) coordinates 眼坐标系/相机坐标系
4. Clip coordinates 剪裁坐标系
5. Normalized device coordinates 规范化坐标系/NDC坐标系(NDC中+z轴向内,为左手系)
6. Window (or screen) coordinates 窗口坐标系/屏幕坐标系
局部空间(Local Space,或者称为物体空间(Object Space)) | |
模型变换 | |
世界空间(World Space) | |
视变换 | |
观察空间(View Space,或者称为视觉空间(Eye Space)) | 相机坐标系为右手系 |
投影变换 | |
裁剪空间(Clip Space) | |
视口变换 | |
屏幕空间(Screen Space) | Screen Space(屏幕空间)中的点以像素为单位。屏幕的左下角坐标为(0, 0),右上角坐标为(pixelWidth, pixelHeight)。z方向的坐标为以相机为原点的相对坐标。 |
OpenGL最终的渲染设备是2D的,我们需要将3D表示的场景转换为最终的2D形式。
假设在空间中有一物体,我们可以根据物理尺寸得到物体的局部坐标;
- 通过模型变换,我们可以将物体看作是在世界坐标系中的,这里,如果假设我们的局部坐标和世界坐标的原点是重合的,那么我们的变换矩阵就是一个单位阵。对于4x4仿射变换矩阵,可以表示平移(仿射变换)、缩放、旋转等线性变换(一般地执行变换顺序为缩放–》旋转—》平移),其中矩阵的形式为: a11,a21,a31表示x轴的旋转(第一列),a12,a22,a32 表示y轴的旋转(第二列),a13,a23,a33 表示z轴的旋转(第三列)
- 通过视变换,可以把世界坐标系中的物体变换到相机坐标系中,一般这里主要是利用平移和旋转的关系构成modelview矩阵,详细分析
- 通过投影变换,将物体从相机坐标系变换懂到裁剪坐标系。投影变换包括透视投影(perspective projection)和正交投影( orthographic projection),这里需要构建project矩阵,详细分析;
- 通过透视除法后,将物体从相机坐标系变换到规范化设备坐标系(NDC)。将得到的齐次坐标中的x,y,z分别除以w 过程被称为透视除法;
- 最后通过视口变换,物体的3D坐标变为2D坐标,显示在屏幕坐标系中。这里需要设定viewport矩阵,指定可视化的尺寸,详细分析
这里附上一个可以直接调用的函数 glm::project();该函数可以直接利用结算局部坐标计算窗口坐标系中的坐标值
贴个图以及总结
在上面的图中,注意,OpenGL只定义了裁剪坐标系、规范化设备坐标系和屏幕坐标系,而局部坐标系(模型坐标系)、世界坐标系和照相机坐标系都是为了方便用户设计而自定义的坐标系。
来自https://blog.csdn.net/wangdingqiaoit/article/details/51570001
来自https://blog.csdn.net/lyx2007825/article/details/8792475
这一块的内容记录比较杂,小伙伴们多看几遍就好啦!