OpenGL学习笔记《六》坐标系统

  在前面的文章中咱们有了解到,opengl的顶点坐标要求是介于-1.0到1.0之间的NDC(标准化设备坐标)。可是咱们平常使用到的坐标可能有多种不一样的坐标系统,好比针对对象自己有一套坐标系统,描述对象内部各个组件的坐标关系。对象与对象之间有一套坐标系统,描述对象间的坐标关系等等。opengl针对不一样的状况提供了不一样的坐标系统,而且基于必定的转换将不一样坐标系统下的坐标转换为标准化的设备坐标(NDC)。spa

  

 

 

   上面这张图片,描述了在opengl中咱们主要会用到的坐标系统,和坐标系统的转换流程。code

LOCAL SPACE,MODEL MATRIXorm

  局部空间,描述的是对象内部的坐标系统。好比一张图片,咱们默认左下角是坐标原点(0,0),若是图片长度为1,右上角咱们会用(1,1)表述。局部空间坐标经过模型矩阵(MODEL MATRIX)转换为世界空间坐标,模型矩阵的转换包含对象的位移、旋转、缩放操做。对象

WORDL SPACE,VIEW MATRIXblog

  世界空间,描述的是对象与对象间的坐标关系,好比对象A坐标(0,0,0),对象B坐标(2,0,0),渲染的时候对象B就会在对象A的左边,隔着两个单位。默认每一个对象的世界坐标是(0,0,0),若是没有设置对象的世界坐标,那么渲染效果就是全部的对象都叠在一块儿了。世界空间坐标经过视图矩阵(VIEW MATRIX)能够转换为视图空间坐标,视图矩阵主要是经过一系列的旋转,位移计算,将对象描述到视图空间内,至关于将对象摆放到咱们眼睛前、摄像机前的合适位置。图片

  后面视图空间中会提到摄像机的概念,咱们对摄像机的不一样操做,如移动、旋转,也是为了生成不一样的视图矩阵(VIEW MATRIX)it

VIEW SPACE,PROJECTION MATRIXio

  视图空间,也能够称之为摄像机空间或者视觉空间,描述的是基于用户眼睛的角度所生成的坐标关系。即从咱们的眼睛出发,描述对象是在咱们的前面、左边、右边?视图空间(VIEW SPACE)也至关于摄像机拍摄到的空间。视图空间坐标经过投射矩阵(PROJECTION MATRIX)能够转换为裁剪空间坐标,投射矩阵将视图坐标转换为-1到1间的标准设备坐标(NDC),另外根据投射方式的不一样能够分为正射投影(orthographic projection)和透视投影(perspective projection)。在视觉表现上,透视投影描述的咱们眼睛看到的世界:离咱们近的看的更大,离咱们远的看的更小;而正射投影则没有远近的差别,直接将对象的坐标映射到屏幕上而已。form

CLIP SPACEclass

  裁剪空间,描述一个-1到1的坐标系统,在这个范围内的对象会被渲染出来,没有的就过滤掉。也是在这个空间内,将对象坐标最终转换为标准化设备坐标(NDC)。裁剪空间坐标经过视图转换,将裁剪空间坐标(NDC)装换为屏幕空间坐标。

SCREEN SPACE

  屏幕空间,即咱们经过glViewport定义的屏幕宽高所对应的坐标系统。

  opengl提供多种坐标系统,也是为了方便咱们在不一样的场景下有合适的坐标体系,在不一样场景下有方便的转换方式。而咱们常见到的MVP转换,就是从对象空间装换到裁剪空间的组合。另外咱们以前也了解过,顶点着色器主要处理的是对象顶点的坐标,因此咱们的MVP转换也是在顶点着色器内处理。

  以经常使用的透视投影为例,咱们描述一个在咱们眼睛前面3个单位,右边1个单位对象的MVP矩阵转换过程

// model matrix
glm::mat4 model = glm::mat4(1.0f);
model = glm::translate(model, glm::vec3(1.0f, 0.0f, 0.0f);
// view matrix
glm::mat4 view = glm::mat4(1.0f);
view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f);
// projection matrix
glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f);
// 传递给shader
// u_model = model; u_view = view; u_projection = projection;
...
... vertex shader
uniform mat4 u_model;
uniform mat4 u_view;
uniform mat4 u_projection;
void main(){
    gl_Position = u_projection * u_view * u_model * vec4(aPos, 1.0f);  
}

  模型矩阵咱们提到了是对象位移、旋转、缩放操做的转换;视图矩阵咱们能够引入摄像机概念进行更为复杂的效果表现;投射矩阵比较固定,设定哪一种投射方式,屏幕的宽高,远近参数的设定等。

相关文章
相关标签/搜索