图形学 坐标系空间变换

3D物体从三维坐标映射到2D屏幕上,要经过一系列的坐标系变换,这些坐标系如下:

  1. model
    物体本身(local)的坐标系,是相对坐标。
    比如一个3D人物模型,头部某个点的坐标为(0,0,20),这是相对该模型的中心点(0,0,0)说的。当模型向前移动了5个单位,其中心点依旧是(0,0,0),头部那个点依旧是(0,0,20)
  2. world
    世界坐标系,即物体放在世界里的坐标,也就是大家最能理解的那个坐标。
    还是上面的例子,他沿Z轴移动了5个单位后,中心点在世界坐标里变成了(0,0,5),头部那个点变成了(0,0,25)。
    物体的位移,缩放,旋转会改变它的世界坐标,不会改变它的model坐标。
  3. image
    相机坐标系。
    相机也是世界里的一个物体,相机坐标就是以相机位置为坐标原点,相机的朝向为Z轴方向的坐标系。因为我们在电脑里看到的物体其实都是“相机”帮助我们看的,“相机”就是我们的眼睛,所以要以相机为标准进行坐标转换。
    在model,world,image坐标系下,X,Y,Z的范围都是无穷大,只是坐标系的基准不一样而已。
  4. perspective (NDC, Normalized Device Coords)
    透视坐标系。
    这一步是将三维坐标向二维平面进行映射,经过透视变换之后,(x, y)的范围在[-1, 1],z的范围在[0, 1]
    可能有点难以理解,本文后面会有专门解释。
  5. screen
    屏幕坐标系。
    因为屏幕是有分辨率的,比如1920×1080,所以还要再进行一次变换。
    该坐标系的原点在屏幕左上角,x轴朝右,y轴朝下。x的范围在[0, xres-1],y的范围在[0, yres-1],即x是[0, 1920),y是[0, 1080)。
    z值是[0, MAXINT],z=0就是屏幕那个平面,z=MAXINT就是无穷远。

经过这5个坐标系空间的变换,3维物体才最终投影到2维电脑平面上。

坐标系的变换矩阵

不清楚什么是变换矩阵,以及不清楚四维坐标的请看我之前的文章
1. 从model变到world
从模型本身的相对坐标变换到世界坐标,就是平移,旋转,缩放

2. 从world变到image(相机坐标)
这一步是将物体在世界的坐标转换为相对相机的坐标。
相机也是世界里的物体,我们假定相机的中心点在世界里的位置是C(Cx, Cy, Cz)
相机正在看着某个方向,我们假定相机正在看的点的位置是I(Ix, Iy, Iz)
那么,相机的Z轴就是它看的方向的向量,即CI向量,也就是I - C = (Ix-Cx, Iy-Cy, Iz-Cz),我们将其标准化(即让它的模为1),得到Z轴单位向量。
然后我们取世界坐标系里的up向量(0,1,0)


得到Z轴后求X, Y轴有两个方法:
方法1:
通过up叉乘Z(注意顺序),我们可以得到一个向量X1,将X1标准化(即使其模为1),我们就得到了X轴的单位向量。
在通过Z轴的单位向量与X轴的单位向量叉乘,即Z×X(注意顺序),我们就得到了Y轴的单位向量。
方法2:
up' = up - (up·Z)Z
注意:(Z的模是1)
将up'标准化得到Y,Y×Z = X

然后我们就可以构造Xiw这么一个将世界坐标系投影到相机坐标系的变换矩阵了。
如何构造?
1)世界坐标系中,相机原点为(Cx, Cy, Cz),在相机坐标系中为(0,0,0)
所以,(0, 0, 0) = Xiw*(Cx, Cy, Cz)
2)世界坐标系中,相机的三个轴为X+C(Xx+Cx, Xy+Cy, Xz+Cz), Y+C(Yx+Cx, Yy+Cy, Yz+Cz), Z+C(Zx+Cx, Zy+Cy, Zz+Cz),但在相机坐标系下为(1,0,0),(0,1,0),(0,0,1)
所以
(1, 0, 0) = Xiw*(Xx+Cx, Xy+Cy, Xz+Cz)
(0, 1, 0) = Xiw*(Yx+Cx, Yy+Cy, Yz+Cz)
(0, 0, 1) = Xiw*(Zx+Cx, Zy+Cy, Zz+Cz)

结合上面2步的四个式子,可以求出Xiw



它的几何意义就是先把坐标系移动到相机的原点处(最后一列Cx,Cy,Cz),然后再旋转来调整到相机的X,Y,Z轴。

3. 从image变到perspective


当x=0时,yz平面如上图所示。
z = -d是我们的观察点,而Z=0就是相机的胶片,或者我们的视网膜,场景要投射到Z=0这个二维平面上。
我们需要将在相机坐标系里的(0,Y,Z)这个点投到Z = 0这个平面上,即a点,a点坐标为(0,y,0)。
根据三角形相似可知:
y/d = Y/(Z+d)
y = Yd/(Z+d) = Y/[(Z/d)+1]
我们对X和Z做同样的操作,最终,一个相机坐标系里的点(X, Y, Z)会变成
(X/[(Z/d)+1],Y/[(Z/d)+1],Z/[(Z/d)+1]),这样就投射到了Z=0这个平面上了。

注意
我们也不一定非要投到Z=0这个平面,投到Z=1,Z=d的平面都可以,式子是一样的。

我们可以看出来,这个变换就是将坐标除了一个(Z/d)+1。
因此,将四维坐标转换为Perspective坐标的变换矩阵为



经过该矩阵变换之后的四维坐标为(X, Y, Z, Z/d+1),转换为三维坐标即为(X/[(Z/d)+1],Y/[(Z/d)+1],Z/[(Z/d)+1])

Perspective矩阵的定义的X, Y的范围在[-1,1],而X/[(Z/d)+1],Y/[(Z/d)+1]的范围是负无穷到正无穷,所以一旦X/[(Z/d)+1],Y/[(Z/d)+1]超出[-1, 1]的范围,就直接扔掉不显示在屏幕上了。

Perspective矩阵定义的Z的范围在[0,1],所以还要将Z进一步限制,所以最终的矩阵为


这样子z的值就成了(Z/d)/[(Z/d)+1],即1/[1+d/Z],满足[0,1]这个范围了。
而这个d又是多少呢?

FOV (Field of View)是定义相机视锥垂直方向(y轴方向)的张角(它是个角度),该张角与Z=0这个投影平面的交点是-1和1,因为x,y的范围是[-1,1]。
从上图可以看出,1/d就是tan(FOV/2)

4. 从perspective变到screen
定义屏幕分辨率为xs × rs
要将透视坐标系里的点映射过来,这个变换矩阵怎么构造?(参考Xiw)
1)首先我们先构造一个4维标准矩阵,即对角线都是1,其余都是0。
2)屏幕坐标系的原点是左上角,而perspective里的原点(0,0)在屏幕中应该位于屏幕中央,即(xs/2, ys/2)。那么perspective里的原点(0,0)会映射为(xs/2, ys/2),即位移一个(xs/2, ys/2,0)。
所以4维矩阵的最后一列是(xs/2, ys/2,0,1)
3)屏幕坐标系中x的范围是[0, xs),y的范围是[0, ys)。而Perspective坐标系中x和y的范围是[-1,1],所以这个映射还要满足-1映射到0,1映射到xs或ys。
目前为止,我们的4维矩阵变成了这样:


注意:我们可以很明显的发现矩阵第二行第二列是负的,这是因为之前的坐标系都是y轴正方向朝上的,而屏幕坐标系是y轴正方向朝下的,是反的,所以是负号,即perspective里的-1映射到屏幕里的ys,1映射到屏幕里的0。
4)屏幕坐标系中z的范围是[0, MAXINT],Perspective坐标系中z是[0,1],所以再对z进一步限制,即1映射到MAXINT,得到最终结果。

所以,一个3D物体显示到电脑屏幕上,要经过4重坐标系变换。
screen Xsp perspective (NDC) Xpi image Xiw world Xwm model
在实际的渲染引擎运行中,Xsp和Xpi基本不会变,因为你的屏幕分辨率很少会变动。Xiw会在相机移动和旋转时改变。Xwm会在物体平移,旋转,缩放时改变。

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

推荐阅读更多精彩内容