《计算机图形学基础》之观察变换

7.1 观察变换(Viewing Transformations)

观察变换是指将 3D 的物体映射到 2D 的过程。这是一个复杂的过程,我们将他拆解成几个过程:

  • 摄像机变换(camera transformation)或者 眼睛变换(eye transformation):在场景内的物体摆放好之后,将摄像机拜访到场景的原点,这是一个刚体变换,只跟旋转和平移有关,不会产生形变或者缩放。过程完成后为 相机空间(camera space)
  • 投影变换(projection transformation):将相机视野映射到 [-1,1]^3 的立方体中。叫做 规则观察体(canonical view volume) 或者 标准视景体(我就叫它 标准视图体积 了),也有的将过程完成后的空间叫做 裁剪空间(clip space) 或者 标准化设备坐标(normalized device coordinates)
  • 视口变换(viewport transformation) 或者 窗口变换(windowing transformation):将上面的立方体映射到屏幕像素空间。过程结束之后叫做 屏幕空间(screen space) 或者 像素坐标(pixel coordinates)

    (注意:有的 API 的 Viewing Transformations 只是单纯指这里的 camera transformation

先从视口变换开始讲起,比如现在物体都已经在裁剪空间了,如下图(右手系),我们需要将 x=-1 映射到屏幕最左边,将 x=+1 映射到屏幕最右侧,将 y=-1 映射到屏幕的最底部,将 y=+1 映射到屏幕的最顶部。也就是从上往下看,顺着 -z 的方向。


我们约定屏幕空间坐标:

所以假设我们的屏幕有 n_{x} \times n_{y} 个像素,那么它的范围有应该是 [-0.5,n_{x}-0.5],[-0.5,n_{y}-0.5],我们需要把 [-1,1],[-1,1] 映射到这个范围中。先将 [-1,1] 扩大到 [n_{x},n_{y}],然后再平移到屏幕的中心即可,公式为(注意,这里我们忽略了 z 轴,这并不影响现在的计算,关于 z 轴,我们后面再说):



正交视图体积(orthographic view volume)跟标准标准视图体积类似,但它不是 [-1,1]^3,而是 [l,r]\times [b,t] \times [f,n],如图:


字母代表的意思和所在轴如下所示:

我们观察的时候,其实是顺着 -z 看的,所以 near 离我们更近,far 离我们更远,并且 n>f,观察角度示意图如下:

将正交视图体积变成标准视图体积的矩阵如下:

推导过程如图(上面的 M_{vp} 也是类似的过程):

所以要将正交视图体积中的点映射屏幕上,整个过程就是:

汇编代码为:



介绍完了视口变化,正交投影变换(其实还有透视投影变换,后面会说),再前面就是摄像机变换。下图中 euvw 是一组正交基,我们的眼睛(摄像机)在 e 的位置,看向 g 的方向,t 是我们头顶的方向。


通过 g,t 来计算出 euvw,用两次叉乘即可(注意都是右手坐标系):

如下图所示,我们的目标就是把物体都转换到 euvw 坐标系中,但不幸的是(?),物体目前都是世界坐标,也就是在 oxyz 坐标。

现在我们需要把 oxyz 坐标转换到 euvw 坐标。公式如下(上一章学过了):

在这里写成:


我写一下完整过程:

总之 \begin{bmatrix}1 & 0 & 0 & x \\0 & 1 & 0 & y \\0 & 0 & 1 & z \\0 & 0 & 0 & 1\end{bmatrix}^{-1} = \begin{bmatrix}1 & 0 & 0 &-x \\0 & 1 & 0 &-y \\0 & 0 & 1 &-z \\0 & 0 & 0 & 1\end{bmatrix}可以直接用。(算了一圈才发现从几何意义来理解,平移 x,再平移 -x 不就回来了... )
我太蠢了

代码跟上面差不多,多乘了一个。

7.2 投影变换(Projective Transformations)

如图所示,相机的观测点还是在 e 点,目光像 g 看去,y_{s}y 应该在屏幕上的长度,用相似三角形可以得到 y_{s}=\frac{d}{z}y,这里有一个乘法,所以我们不能够像上面一样再多乘一个矩阵来保持算法不变,就完成投影变换。


回顾一下,没有其次坐标之前,我们可以完成这样的计算:

再引进其次坐标之后,多了平移,可以加上一个常数:

现在我们可以再进一步,把齐次坐标的最下面一行充分利用起来,让它不再一直是 0001,还有点的 w 也不必一直都是 1。这样就可以实现带除法的运算:

但是这样有一个限制,也就是对于每个分量,他们的分母都是相同的:

实现这种变换的矩阵写成这样:

当我们需要在笛卡尔坐标系中运用到变换后的点的时候,将 \widetilde{w} 归一,也就是同时除 \widetilde{w} 即可:

这个过程就叫做 投影变换(projective transformation) 或者 单应性矩阵(homography)

举个例子,这个矩阵


把下图的标准矩阵进行了透视投影。

对于 (1,0) 这个点,经过变化后为:

再将其 \widetilde{w} 归一化得到 (3,0) 这个点。还有更聪明的方法来解决这个问题,我们规定所有向量的标量倍乘都代表同一个点:

~ 代表 相等 的意思,也就是说 x\alpha x 这两个其次坐标在空间中代表同一个点。举个例子,下面是一个一维的齐次坐标,这一条线上的点我们在一维上都认为是同一个点,也就是 x=1.5 这个点。

下面是一个二维的齐次坐标,\alpha v这条直线上的所有点我们都认为是 v 点,其实这并没有问题,因为他们的不同是在三维的空间,但我们探究的是在二维上的相等性,只要我们的规则能让其在塌缩到二维的时候是一样的就 Ok。

这样我们就可以进行任意次变换,而不用担心 w 的值,甚至在某一瞬间 w=0 也是可以的,我们只需要在真正需要读出这个点的值的时候才将每个分量除 w 就可以了。

7.3 透视投影(Perspective Projection)


还是看这个图,里面的 d 换成 n,并且想象一下在屏幕的例外方向存在 x,根据相似三角形,我们知道y_{s}=\frac{d}{z}y,x_{s}=\frac{d}{z}x。所以写出下面的矩阵,它的第一行,第二行,第四行在计算中就保证了刚刚的式子,第三行关于 z 的,我们跟之前的正交投影和视口变换一样,先不管。

因为对于齐次坐标来说,同时乘常量没有关系,所以 ~ 两边的坐标我们看成是相等的,能够看出是满足 y_{s}=\frac{d}{z}y,x_{s}=\frac{d}{z}x 的。

上述矩阵对视椎体的作用如下面两个图所示,保证了在 z=n 这个平面上的点是不动的,并且在 z=f 这个平面上的点是被挤压到里面,中间的保持原本的顺序。

P 的逆矩阵是:


当然我们也可以让它的形式变得好看一点:

当把透视投影变成正交投影的样子之后就可以用正交投影的矩阵来完成后面的操作了:

其中 M_{per} = M_{orth}P

透视投影的整个观察变换代码如下:


除了多乘了一个矩阵之外,还要除 w

OpenGL 中,透视投影矩阵写法跟我们差不多:


还有一些地方,会把 n=0,f=1,变成 [0,1]^3 的形式。区别都不是很大。

7.5 视场角(FOV)


有时候我们会觉得 rltbnf 的表示方法太麻烦,第一步化简:

如果像素是正方形的,并且分辨率是定的,那么 rt 的比率其实也是定的:

最后有一个视场角的概念,可以看图,公式如下:

所以只需要屏幕分辨率、视场角、n,f,我们就可以求出透视投影矩阵。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容