opengl学习(四)坐标系统

  1. 总述
    OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐标范围的顶点都将不可见。我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将这些坐标变换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标或像素。
    将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的,也就是类似于流水线那样子。在流水线中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于,在这些特定的坐标系统中,一些操作或运算更加方便和容易。
    对我们来说比较重要的总共有5个不同的坐标系统:
    局部空间(Local Space,或者称为物体空间(Object Space))
    世界空间(World Space)
    观察空间(View Space,或者称为视觉空间(Eye Space))
    裁剪空间(Clip Space)
    屏幕空间(Screen Space)
    将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。
    我们之所以将顶点变换到各个不同的空间的原因是有些操作在特定的坐标系统中才有意义且更方便。例如,当需要对物体进行修改的时候,在局部空间中来操作会更说得通;如果要对一个物体做出一个相对于其它物体位置的操作时,在世界坐标系中来做这个才更说得通,等等。如果我们愿意,我们也可以定义一个直接从局部空间变换到裁剪空间的变换矩阵,但那样会失去很多灵活性。
  2. 空间坐标

局部空间:最开始的用户定义的物体所在的空间坐标。
世界空间:该变换是由模型矩阵实现的,通过位移、旋转、缩放,来将它置于本应该所在的位置和朝向。
观察空间:通过位移和旋转的组合完成的,也被称为OpenGL的摄像机,观察空间是将世界空间坐标转化为用户视野前方的坐标而产生的结果。因此观察空间就是从摄像机的视角所观察到的空间。平移/旋转场景从而使得特定的对象被变换到摄像机的前方。这些组合在一起的变换通常存储在一个观察矩阵(View Matrix)里,它被用来将世界坐标变换到观察空间。
裁剪空间:通过投影矩阵,投影到自己设定了一个有范围的坐标空间,超出范围的坐标将不会被显示在屏幕上(裁剪掉),在范围内的坐标最后会被映射到-1.0到1.0的屏幕的标准化设备坐标系。
观察坐标变换为裁剪坐标的投影矩阵分两种:正射投影矩阵和透视投影矩阵。

  • 正射投影矩阵

我们可以使用GLM的内置函数glm::ortho:
定义平截头(观察盒)

rotho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);

六个参数分别表示为:平截头的左坐标,右坐标,低坐标,顶坐标,近平面坐标和远平面坐标。
前两者定义它的宽,中间两者定义它的高,后两者定义它的长。
正射投影矩阵直接将坐标映射到2D平面中,即你的屏幕,但实际上一个直接的投影矩阵会产生不真实的结果,因为这个投影没有将透视(Perspective)考虑进去。所以我们需要透视投影矩阵来解决这个问题。

  • 透视投影

越远的东西看起来更小,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值