一个简单光栅器的实现(三) 几何阶段的坐标变换

顶点空间(Model Space)->世界空间(World Space)

从顶点空间到世界空间的变换实际上就是平移、旋转和缩放的组合,如果用过Unity,你会发现Transform组件中对应的Position、Rotation和Scale对应的就是这平移、旋转和缩放变换。

所以我们可以用之前的编写数学库轻易的构造出一个世界变换矩阵(World Transform)。

Unity中的Transform

世界空间(World Space)->相机空间(Camera Space)

这一步我们要根据摄像机(Camera)的位置和朝向来构造一个视图变换矩阵(View Transform),摄像机的三个方向分别为direction,up和horizontal,其中摄像机的位置、三个朝向中的direction和up需要我们手动制定,水平方向horizontal可以通过direction和up向量做叉积得到

摄像机的朝向

视图变换矩阵的作用是将整个世界变为“以摄像机为中心”,下图形象的解释了什么是以“摄像机为中心”

视图变换(View Transform)

通过上面这张图我们知道,整个视图变化的过程分为两步:

  • 将相机移动到世界坐标原点
  • 将相机与z轴正方向对齐

V为视图变换矩阵,diruphor分别代表摄像机的direction,up和horizontal三个方向的基向量

先考虑平移的情况,根据摄像机的位置p我们只需要把它平移回原点就好了

然后考虑把相机与z轴正方向对齐,所谓对齐,就是说使得基向量两两正交且为单位向量,需要注意,这里的三个基向量都是相对于世界坐标系的,那么最简单的一种情况就是:

把②中向量展开成分量并写成一个等式

首先摄像机的三个基向量无论怎么设置都是两两正交的,所以由hor,updir组成的矩阵是一个正交矩阵

如果矩阵A是正交矩阵,那么矩阵A的逆矩阵等于矩阵A的转置。

③的右边是一个单位矩阵,所以

最后将两个矩阵相乘,组合成最终的视图变换矩阵

相机空间(Camera Space)->裁剪空间(Clip Space)

这个阶段要做的就是把视锥体变为长方体(正方体),然后把空间中的点投影到变换后的视锥的近裁剪平面上,变换视锥体的过程中场景内的顶点也要发生相应的变化,而透视矩阵要做的就是变换场景中的顶点。

透视变换(Perspective Transform)

从图中可以发现,在变换的过程中,近处的点之间的距离被拉大了,而远处的点之间的距离被相对地缩小了,这也就是透视变换产生“近大远小”感觉的原因。

上面的描述可以帮助你感性的理解这个过程。实际在计算的时候我们要则是先将空间中的点直接投影在近裁剪平面上,然后再在该屏幕上进行缩放的。

变换后,x坐标和y坐标表示的是点最终在屏幕上的位置的归一化坐标,其次坐标中的z分量会被映射到[0,1],用来进行顶点剔除,w分量则会存储顶点的深度信息。

首先考虑把点先投影到近裁剪平面上

侧视图

三角形PQO和三角形P'Q'O相似,并且近裁剪平面到原点的距离是知道的,所以可以求出P'点的坐标

求出P'点的y坐标后同理可以求出其x坐标

接下来考虑将P'在近裁剪平面上进行缩放

正视图

变换之前的近裁剪平面的宽和高并不是2(而是你渲染出来缓慢的宽和高),首先按屏幕大小进行缩放求P''点的y坐标

相机的视角与近裁剪屏幕的关系如下图

相机视角与近裁剪屏幕

我们可以利用θ角来消去①中的Height

同理可以求的P''点中的x坐标,这里消去Width的时候还需要利用屏幕宽高比Aspect

但是还有一个问题,PP'点上所有的点变化得到的坐标都相同,那么怎么知道到底要渲染哪一个点呢?一般来说只会渲染离我们最近的点,即z值最小的点,即通过z值来存储点的深度来告诉我们哪些点在前面哪些在后面,方便渲染的时候进行处理。

在后面进行光栅化的时候,我们需要对三角形的顶点进行插值计算以求得实际渲染时三角形内部某个点的纹理坐标,如果直接进行线性插值,产生的图像是不正确的。

相机空间俯视图*<<Mathematics.for.3D.Game.Programming.and.Computer.Graphics,.Lengyel,.3ed,.Course,.2012>>*

这张图告诉我们在插值的时候,屏幕上的x是等距离变化,如果进行线性插值,那么采样得到的点的纹理分布也是线性的,但实际上纹理的分布是不均匀的

考虑(x,z)是直线上的一点,从相机原点发射一条射线到这个点上,射线与近裁剪平面会有一个交点,假设这个交点的z坐标是-e(这张图引用于<<Mathematics.for.3D.Game.Programming.and.Computer.Graphics,.Lengyel,.3ed,.Course,.2012>>一书,上面的相机是朝向z轴负方向的,不过这并不影响推导的结果)

由三角形相似可得(和前面的计算原理相同)

设直线(x1z1)(x2z2)的方程为ax+bz=c,将①带入直线方程,消去x,得到

然后改写②为下面的形式

假设我们对(p1-e)(p2-e)之间进行插值得到点(p3-e),那么有:

把④带入③得到

对⑤进行下列变化即可得到

这样就证明了对空间上纹理坐标与1/z是线性的关系,所以为了便于计算,我们将变化后新的点的z坐标用1/z做映射

z坐标的取值范围是从近裁剪平面到原点的距离n到远裁剪平面到原点的距离f,同时变换后的z''的范围是[0,1],将其代入①得到

再将②代入①,得到

这样我们通过计算得到了变换后的顶点的坐标

由于其次坐标w分量表示了物体在投影时的深度信息,在变换为普通坐标的时候需要将x,y,z坐标除以w,所以我们在对①右侧的其次坐标的每一个分量乘以Pz并不会改变坐标的大小,得到

w=1解上述方程,可以得到透视变换矩阵为

CVV裁剪

完成了上述三个变换后,还需要进行裁剪工作,将不再变换后的长方体内的顶点给剔除

变换完成后的顶点为其次坐标,二长方体的xy的取值为-11,z的取值为01,那么有

不等式两边同时乘以w可以得到

这样在进行顶点剔除的时候就不需要进行除法运算了,当剔除掉不在摄像机范围内的点后进行其次除法操作,得到像素点的归一化坐标,然后根据归一化坐标以及屏幕的宽高就能得到顶点在屏幕中实际的位置了。

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

推荐阅读更多精彩内容