openGL中的坐标系
openGL中使用的是右手坐标系
openGL在每次顶点着色后,可见顶点都是标准化设备坐标,即每个顶点的x、y、z值都应该在-1到1之间,超出这个范围的顶点是不可见的
将坐标转换为标准化设备坐标,接着再转换为屏幕坐标的过程是分步进行的,这个过程中,物体的顶点在最终转换为屏幕坐标之前还会被转换到多个坐标系统。在这些过度的特定坐标系中,一些操作或运算更加方便。
为了将坐标从一个坐标系变换到另一个,我们需要用到几个变换矩阵,常用有 模型(Model)、观察(View)、投影(Projection)三个矩阵
栈顶是当前坐标变换矩阵,进入openGL管道的每个坐标都会先乘以这个矩阵,结果才是对应点在具体场景中的世界坐标。openGL中的坐标变换是通过矩阵运算完成的。变换中的矩阵乘法是叉乘,结果中包含方向,不符合交换律。
物体顶点的起始坐标是局部坐标,之后会转换为世界坐标、观察者坐标、裁剪坐标,最后以屏幕坐标的形式结束。可以参考下面这张图
指的是物体所在的坐标空间,即对象最开始所在的地方,相对于这个物体来说是局部的
是指物体的顶点相对于世界的坐标空间,物体分散在世界上摆放,则物体的坐标会从局部空间变换到世界空间。该变换是由模型矩阵(Model Matrix)实现的
观察空间也被称为openGL的摄像机Camera,所以有时候也称为摄像机空间(Camera space) 或视觉空间(Eye space)。观察空间是将世界空间坐标转换为用户视野前方的坐标而产生的结果。也就是说,观察空间,就是从摄像机的视角所观察到的空间。
而这通常是由一系列的位移和旋转的组合来完成的,平移/旋转场景从而使特定的对象被变换到了摄像机的前方。
这些组合在一起的变换通常存储在一个 观察矩阵(View Matrix) 里,它被用来将世界坐标变换到观察空间。
现实生活中,离观察者越远的东西看起来越小,这个现象称之为透视(Perspective)
openGL中的透视效果是由透视矩阵实现的。这个透视矩阵将给定的平截头体范围映射到裁剪空间,除此之外还修改了每个顶点坐标的w(深度)值,从而使得离观察者越远的顶点坐标的w分量越大。被变换到裁剪空间的坐标都会在-w到w之间。所以,一旦坐标在裁剪空间内之后,透视除法就会被应用到裁剪空间坐标上
当使用正投影时,每一个顶点坐标都会直接映射到裁剪空间中而不经过任何精细的透视除法(它仍然会进行透视除法,只不过w分量没有被改变,保持为1,所以不起作用)
我们为上述的每一个步骤都创建了一个变化矩阵: 模型矩阵、观察矩阵、投影矩阵 ,一个顶点坐标将会根据以下过程被变换到裁剪坐标
Vclip = Mpro * Mview * Mmodel * Vlocal
这一系列的矩阵变换需要从右向左,依次是M V P。最后的顶点应该被赋值到顶点着色器中的gl_Position,openGL会自动进行透视除法和裁剪
视口变换: openGL对裁剪坐标执行透视除法从而将它们变换到标准化设备坐标,然后openGL会使用glViewPort内部的参数来将标准化设备坐标映射到屏幕坐标,每个坐标都关联了屏幕上的一个点,这个过程称为视口变换
上述过程,裁剪之前的坐标变换可以由开发者参与,裁剪和裁剪后续的动作,是系统完成的
参考:
https://blog.csdn.net/meegomeego/article/details/8686816
https://www.cnblogs.com/tandier/p/8110977.html
2024-09-04 广告