模型、视图和投影矩阵变换的含义

模型、视图和投影矩阵变换的含义

1. 前言
在openGL中操作三维物体经常用到移动、旋转、缩放。相关的功能实现需要你操作各种各样的矩阵来完成。物体最终显示到屏幕上会涉及若干的坐标系和矩阵操作。本文就先来说明这些坐标和矩阵操作的含义。我们在之后的文章中再通过具体的代码予以实现。
本文将会讲述如下内容:
1. openGL中的不同坐标系和矩阵
2. openGL中从物体坐标到屏幕坐标之间的变换过程

       如何有效地利用矩阵变换来对所有顶点进行转换。OpenGL希望

在所有顶点着色器运行后,所有我们可见的顶点都变为标准化设备坐标(Normalized Device
Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间,超出这个坐
标范围的顶点都将不可见。我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将
这些坐标转换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),再将
他们转换为屏幕上的二维坐标或像素。
将坐标转换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步,也就是类似于流
水线那样子,实现的,在流水线里面我们在将对象转换到屏幕空间之前会先将其转换到多个
坐标系统。将对象的坐标转换到几个过渡坐标系(Intermediate Coordinate System)的优点在
于,在这些特定的坐标系统中进行一些操作或运算更加方便和容易,这一点很快将会变得很
明显。对我们来说比较重要的总共有5个不同的坐标系统:
1. 局部空间(Local Space,或者称为物体空间(Object Space))
2. 世界空间(World Space)
3. 观察空间(View Space,或者称为视觉空间(Eye Space))
4. 裁剪空间(Clip Space)
5. 屏幕空间(Screen Space)
为了将坐标从一个坐标系转换到另一个坐标系,我们需要用到几个转换矩阵,最重要的几个
分别是模型(Model)、视图(View)、投影(Projection)三个矩阵。首先,顶点坐标开始于局部
空间(Local Space),称为局部坐标(Local Coordinate),然后经过世界坐标(World
Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐
标(Screen Coordinate)结束。下面的图示显示了整个流程及各个转换过程做了什么:

在这里插入图片描述

模型变换(Model Transform)
首先,建立一个模型的时候,每个模型有自己的坐标以及对应的坐标原点。比如一个立方体,其坐标原点通常位于立方体的中心(当然也可以位于其他地方),整个立方体上的顶点都相对于这个中心点而设置。当我们想移动这个立方体的时候,就需要一个矩阵来进行变换,这就是模型矩阵(model matrix)。当我们用模型矩阵乘上原有坐标点矩阵之后,所得到的新的坐标点便是经过移动之后的,相对于一个虚拟的世界坐标系的坐标点。参考下图:
在这里插入图片描述
物体坐标对于每个物体来说都是独立的、独有的。比如有两个立方体,两个立方体有各自的物体坐标。但是它们只有一个共享的世界坐标,有了世界坐标,物体和物体才有了相对位置的关系。

视图变换(View Transform)
下面的变换叫做视图变换,这是将之前的坐标系变换到一个新的,以视图为基准原点的坐标系。你可以把这个视图坐标系理解成我们的眼睛或者一部照相机,随着眼睛或照相机在物体不同位置的移动,这个坐标系都是在实时变化的。这个变换过程使用的矩阵称为视图矩阵(view matrix)。经过变换之后的坐标点是相对于视图坐标系的原点的。如下图:
在这里插入图片描述
投影变换(Projection Transform)
在这里插入图片描述
这六个平面是通过投影矩阵(projection matrix)决定的。经过变换之后,位于这个视锥体以外的顶点都会被剪裁掉,所得的坐标结果成为裁剪坐标(clipping coordinates)。视锥体的形状决定了3D到2D的投影类型,如果近平面和远平面尺寸一致,那么物体上的顶点不论远近都以统一的方式投影在屏幕上,这就是正交投影(orthographic projection)。否则就是透视投影(perspective projection)。简单来说,正交投影没有近大远小的效果,而透视投影则有。

到现在为止,我们始终都在操作齐次坐标,所以裁剪坐标也是个四元组:x、y、z和w。裁剪是通过将x、y、z的值与w的值作比较进行的,如果某个顶点的x、y、z其中任何一个值大于 +w 或者小于 -w,则该顶点就会被裁掉。

透视除法(Perspective division)
一旦决定了有多少顶点会被渲染之后,视锥体会映射到近平面上以便展示2D图像。在屏幕上显示的内容就是近平面上的内容。WebGL提供一个与硬件无关的坐标系统,用来描述映射到近平面上的坐标,这被称作是规范化设备坐标(Normalized Device Coordinates),简称NDC。

规范化设备坐标是通过将裁剪坐标除以w来获得的。所以这一步操作被叫做透视除法。经过除法后,4元组的坐标转变为3元组的坐标,因此NDC的顶点仅包含x、y和z三个信息。其中x、y表示规范化2D平面上的坐标,z则表示深度信息,也就是远近关系。现在WebGL就可以根据x和y来显示顶点,并根据z信息来确定覆盖、遮挡关系。

透视除法将视锥体变换到一个立方体空间,立方体空间坐标范围从 [-1, -1, -1] 到 [1, 1, 1]。另外z轴方向也进行了翻转。如下图所示:
在这里插入图片描述
这就是为什么默认的WebGL程序在屏幕上显示的时候,x和y的坐标范围都是-1到1,不论canvas元素尺寸和比例是什么样的。

视口变换(Viewport Transform)
在这里插入图片描述
由于这个坐标变换只涉及x和y,因此没有矩阵参与,它是通过WebGL的viewport方法来完成的。具体计算公式如下:

在这里插入图片描述

其中没有下脚标的x、y表示屏幕坐标的起始点。在WebGL中,x和y都取0。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值