ronintao的专栏

【目标】:学习OpenGL中的坐标系统。

【参考】:

1、《计算机图形学(OpenGL版) (第三版)》 Francis著(本文主要涉及第三章~第七章)

2、《计算机图形学(OpenGL版) (第三版)》 Donald著

一、前言

坐标系应该是任何图像系统的基石。在学习Cocos2D的过程中,对着《权威指南》上草草结束的坐标系介绍,实在是看的一头雾水,找了本OpenGL书把这块研究了一下,大致算是清楚了其中的一些基本概念。这里总结一下,作为记录。

二、数学基础

1、齐次坐标

(对应图形学一书的第4.5节)

在三维空间中的一个点,通常用p = (x, y ,z) 这样的三维坐标来表示,如果要对这样一个点进行如下的简单的变换(即仿射变换,下面会提到)。那么其形式可以如下表示:

(式2.1 – 1)

或者用表示为

P2 = M * P1 + C (式2.1 – 2)

这样表示的变换存在一种不便:需要乘法和加法两次计算才能完成转换。回想多项式乘法会发现,(a+b)^n 的展开式相当之长,这样,当变换的次数很多时,这样的计算就会很复杂且不直观。

由此,引入了齐次坐标的概念:对于某个三维坐标点(x, y, z),增加一维w != 0,并对原三维坐标进行同样的缩放,形成新的四维坐标(wx, wy, wz, w),即是所谓齐次坐标。

引入了齐次坐标后,原式2.1-2 就可以改写为:

P2' = M' * P1' (式2.1 -3)

这样,只需要用乘法就可以完成所有的任务了。

2、点、向量 的齐次坐标表示

前面的齐次坐标表示实际上是“点”的齐次坐标表示。且在接触到投影矩阵之前(即在模型视图矩阵阶段),对于一个坐标点 P = (wx, wy, wz, w) 的 w值都是1,也必须是1。

而对于向量,若其原三维表示为 v = (x, y , z), 则在齐次坐标下的表示为 v’ = (x, y, z, 0)。即对于向量来说,齐次坐标表示就是在第四维上填0。

进一步的,从原来上来说,这里的第四维坐标w,实际上表示是否含有坐标轴原点O的信息。(坐标点可以理解为原点O移动向量p后的结果)

3、仿射变换

仿射变换的数学定义是:在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间,可以用式2.1-1表示。

那么在齐次坐标下, 由于在前面了解到点的齐次坐标表示都是 (x, y, z, 1),第四维必须是1。所以仿射变换可以表示为:

(式2.3 – 1)

4、基本的仿射变换

复杂的仿射变换可以通过多次进行基本的仿射变换来完成。这些基本的原子变换包括:平移、缩放、剪切、旋转变换。(Donald的书在这个地方讲的更数学一点,更加严谨)

4.1 平移

M =

其中,(mx, my, mz) 是平移量,也是新坐标系(移动后)的原点O,在原坐标系(移动前)下的坐标值。

注意,上面关于原点这个表述很有意思。如果变换看做点的移动,那么右边(式2.1-2中的P2)是原来的坐标,左边(P1)是新的坐标。但是如果看做是坐标系的移动,那么对于同一个点P,P2是老坐标,P1是新坐标。

在我们这里,新的原点O,其老坐标就是P2。

4.2 缩放

M =

其中,(Sx, Sy, Sz) 是缩放比例。很简单不解释了。

4.3 剪切

也有翻译为错位变换的,定义是某一维上(如Y)引入另一维的影响(如X),效果是方形变平行四边形。可以看 。根据两个维度的选择,矩阵略有不同。如果是Y上引入X的影响,则矩阵为:

M =

当f = 1时,效果图如下:

有山就有路,有河就能渡。

ronintao的专栏

相关文章:

你感兴趣的文章:

标签云: