齐次坐标和投影矩阵

齐次坐标和投影矩阵

在图形学中,常需要计算投影矩阵,在计算过程中会用到齐次坐标。本文是作者在学习相关资料时的笔记。

一、齐次坐标

在数学里,齐次坐标是指一个用于投影几何里的坐标系统,如同用于欧式几何里的笛卡尔坐标一般。1

简单的解释就是,齐次坐标就是用一个原本是n维的向量用一个n+1维向量来表示。2

1.1 引入齐次坐标的作用
  • 便于计算位移变换

    使用齐次坐标,平移、旋转、缩放等变换都可以通过矩阵乘法来表示。这使得我们可以将多个变换合并成一个变换矩阵,从而在一个步骤中应用多个变换。

  • 便于投影矩阵计算

    在计算投影矩阵得到裁剪坐标时,引入齐次坐标会更方便计算。见下文2.1。

  • 表示点和向量

    在三维空间中,一个点可以用(x,y,z,1)来表示,而向量可以用(x,y,z,0)来表示。这样我们可以使用统一数据结果和数学形式来处理点和向量。3

1.2 齐次坐标的性质

尺度不变性(sacle invariant)。如果我们要将欧式坐标的一个二维点 (1,2)(1,2) 转换为齐次坐标,根据规则,我们可以选择刚才用到的 (1,2,1)(1,2,1),也可以选择 (2,4,2)(2,4,2),还可以选择 (4,8,4),(8,16,8)…(4,8,4),(8,16,8)…,即 (k,2k,k),k∈R都是“合法”的齐次坐标表示,这些点都映射到欧式空间中的一点,即这些点具有 尺度不变性,是“齐性的”(同族的),所以称之为齐次坐标。3

在games101课程中红也有相关表述。4

1.3 其它相关

在图形学相关计算中,常指定w=1,这是图形学中一个约定5(可能是为了方便位移的计算)

二、投影矩阵

投影矩阵是为了将观察空间中的坐标转换为裁剪空间中的坐标。通常在顶点着色器中要用到该矩阵计算。

2.1 投影矩阵的推导

很受欢迎的一个博客文章:http://www.songho.ca/opengl/gl_projectionmatrix.html

翻译版:https://www.cnblogs.com/leixinyue/p/11166135.html

在《深入理解OpenGL之投影矩阵推导》6中,提到了games1014中的一种推导方式。

三、相关知识
3.1 涉及的相关渲染管线
3.1.1 顶点着色器两个主要的任务7
  • 计算顶点的位置
  • 计算任何程序员可能需想要的顶点输出数据,例如法线、纹理坐标
3.1.2 图元装配(Primitive Assembly)

图元装配在顶点着色后,光栅化前。包含裁剪、透视分割、视口变换。如下图所示。

图元装配

(图片来源:《OpenGL ES 3.0 Programming Guide》)

  • 裁剪(Clipping)

    在顶点着色器后,坐标在裁剪空间中。

    为了避免在可视景体之外处理图元,图元被裁剪到裁剪空间。执行顶点着色器之后的顶点位置处于裁剪坐标空间内。

    裁剪体如下:

在这里插入图片描述

注:这里的W值好像并不能从物理意义上理解,可以如此理解:

在这里插入图片描述

即理解为裁剪后,这些坐标落在标准化设备空间([范围在[-1,1])。

  • 透视除法(Perspective divide)

    从裁剪阶段返回的裁剪空间位置通过以下方程转换为标准化设备坐标 (NDC):8
    透视除法

  • 视口变换(Viewport transform)

​ 视口变换定义顶点位置从 NDC 空间到窗口空间的转换。这些是被光栅化为输出影像的坐标8

​ w和h由glViewport设置,n和f由glDepthRangef设置。
在这里插入图片描述

3.2 相关的坐标系统

下图展示了顶点通过顶点着色器和图元装配阶段时的坐标系统。

理解:

  • 物体坐标是建模时的局部坐标;
  • 裁剪坐标是经过顶点着色器处理后的坐标,此时w可能不等于1.0,x、y、z可能也大于1.0;
  • 规范化设备坐标是再经过裁剪和透视分割的坐标,此时w=1.0,且x、y、z的范围已经在[-1,1];
  • 窗口坐标是再经过视口变换后的坐标,此时的x、y坐标已经跟窗口大小有关。
    在这里插入图片描述

(图片来源:《OpenGL ES 3.0 Programming Guide》)

四、参考

  1. 维基百科-齐次坐标 ↩︎

  2. 为什么要引入齐次坐标,齐次坐标的意义(二) ↩︎

  3. 齐次坐标系入门级思考 ↩︎ ↩︎

  4. https://sites.cs.ucsb.edu/~lingqi/teaching/resources/GAMES101_Lecture_04.pdf ↩︎ ↩︎

  5. Explaining Homogeneous Coordinates & Projective Geometry ↩︎

  6. 深入理解OpenGL之投影矩阵推导 ↩︎

  7. 图形渲染管线简介 ↩︎

  8. Vertex Post-Processing ↩︎ ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值