OpenGL ES系列六--座標系

概述

首先說明一下本篇文章主要是說明空間座標系轉換相關的知識點,主要涉及以下兩個個方面:

  1. 五個座標系統(哪五個,存在的意義,什麼時候使用)
  2. 這五個座標系統,我們是通過什麼來實現其轉化的

五個座標系

OpenGL希望在每次頂點着色器運行後,我們可見的所有頂點都爲標準化設備座標(Normalized Device Coordinate, NDC)。也就是說,每個頂點的xyz座標都應該在-1.01.0之間,超出這個座標範圍的頂點都將不可見。我們通常會自己設定一個座標的範圍,之後再在頂點着色器中將這些座標變換爲標準化設備座標。然後將這些標準化設備座標傳入光柵器(Rasterizer),將它們變換爲屏幕上的二維座標或像素。

在渲染流水線中,物體的頂點在最終轉化爲屏幕座標之前還會被變換到多個座標系統(Coordinate System)。將物體的座標變換到幾個過渡座標系(Intermediate Coordinate System)的優點在於,在這些特定的座標系統中,一些操作或運算更加方便和容易。對我們來說比較重要的總共有5個不同的座標系統:

  • 局部空間(Local Space,或者稱爲物體空間(Object Space))
  • 世界空間(World Space)
  • 觀察空間(View Space,或者稱爲視覺空間(Eye Space))
  • 裁剪空間(Clip Space)
  • 屏幕空間(Screen Space)

這就是一個頂點在最終被轉化爲片段之前需要經歷的所有不同狀態。

爲了將座標從一個座標系變換到另一個座標系,我們需要用到變換矩陣,最重要的幾個變換矩陣分別是模型(Model)、觀察(View)、投影(Projection)。我們的頂點座標起始於局部空間(Local Space),在這裏它稱爲局部座標(Local Coordinate),它在之後會變爲世界座標(World Coordinate),觀察座標(View Coordinate),裁剪座標(Clip Coordinate),並最後以屏幕座標(Screen Coordinate)的形式結束。下面的這張圖展示了整個流程以及各個變換過程做了什麼:

OpenGL ES座標轉換過程

下面我們針對開頭說到的那些空間進行說明、講解:

  1. 局部空間

    局部空間是指物體所在的座標空間,即對象最開始所在的地方。比如你在一個建模軟件(比如說3DMAX)中創建了一個立方體,你假設以某一個點爲立方體的原點(0, 0, 0),然後以原點爲參考繪製出一個立方體,即便它有可能最後在程序中處於完全不同的位置。我們在繪製立方體時,以自己定的原點爲參考定義頂點,都是在局部空間中定義的局部座標。

  2. 世界空間(模型矩陣)

    如果我們將局部空間中定義的所有物體導入OpenGL程序,它們可能會擠在世界的原點(0,0,0)上,爲了避免出現這種情況,我們需要將在局部空間中的物體在世界空間中重新擺放,這個擺放變換是由模型矩陣(Model Matrix)來實現的。

    模型矩陣:一種變換矩陣,它能夠通過對物體進行縮放、旋轉、平移來將它置於它本應該在的位置或朝向(世界座標系中)。你可以將它想像爲變換一個房子,你需要先將它縮小(它在局部空間中太大了),並將其位移至郊區的一個小鎮,然後在y軸上往左旋轉一點以搭配附近的房子。

  3. 觀察空間-視覺座標(觀察矩陣)

    觀察空間經常被人們稱之OpenGL的攝像機(Camera)(所以有時也稱爲攝像機空間(Camera Space)或視覺空間(Eye Space))。觀察空間是將世界空間座標轉化爲相對於觀察者視角而言的座標的結果。因此觀察空間就是從攝像機(觀察者)的視角所觀察到的空間。視覺座標通常作爲參考座標系使用。

  4. 裁剪空間(投影矩陣)

    在一個頂點着色器運行的最後,OpenGL期望所有的座標都能落在一個特定的範圍內,且任何在這個範圍之外的點都應該被裁剪掉(Clipped)。被裁剪掉的座標就會被忽略,所以剩下的座標就將變爲屏幕上可見的片段。這也就是裁剪空間(Clip Space)名字的由來。

    爲了將頂點座標從觀察變換到裁剪空間,我們需要定義一個投影矩陣(Projection Matrix),它指定了一個範圍的座標,比如在每個維度上的-1000到1000。投影矩陣接着會將在這個指定的範圍內的座標變換爲標準化設備座標的範圍(-1.0, 1.0)。所有在範圍外的座標不會被映射到在-1.0到1.0的範圍之間,所以會被裁剪掉。在上面這個投影矩陣所指定的範圍內,座標(1250, 500, 750)將是不可見的,這是由於它的x座標超出了範圍,它被轉化爲一個大於1.0的標準化設備座標,所以被裁剪掉了。

    由投影矩陣創建的觀察箱(Viewing Box)被稱爲平截頭體(Frustum)、視景體,每個出現在平截頭體範圍內的座標都會最終出現在用戶的屏幕上。將特定範圍內的座標轉化到標準化設備座標系的過程(而且它很容易被映射到2D觀察空間座標)被稱之爲投影(Projection),因爲使用投影矩陣能將3D座標很容易映射到2D的標準化設備座標系中。

  5. 屏幕空間

    屏幕空間就相當於我們的設備屏幕,比如移動端的手機屏幕、PC端的顯示器屏幕等。

如何轉化

介紹完了各個空間,現在我們就完整的講述一下座標的變化。

  1. 模型變換:包含縮放、旋轉和平移,應用在所有物體的頂點上(局部座標系),將物體變換到世界空間中。通過頂點座標乘以模型矩陣實現。結果是物體座標轉換爲以世界座標系爲參考的座標

  2. 觀察變換:在世界空間中,默認情況下,透視投影中的觀察點位於原點(0,0,0),並沿着z軸負方向進行觀察(向顯示器內部“看進去”),爲了使物體更方便得可見,我們需要設置相機(觀察者)的位置和方向,它是由觀察矩陣來實現的。結果是物體座標轉換爲以視圖座標系(觀察視覺座標系)爲參考的座標注意攝像機後移(z軸正方向),或者物體前移(z軸負方向),兩者效果是相同的。

    攝像機位置:簡單來說就是世界空間中一個指向攝像機位置的向量

    攝像機方向(攝像機指向哪個方向):假設讓攝像機指向場景原點(0, 0, 0),用場景原點向量減去攝像機位置向量的結果就是攝像機的指向向量。

    注意:在正交投影中,觀察者默認被認爲是在z軸正方向無窮遠的位置,能夠看到視景體紅的任何東西

  3. 投影變換:定義了一個視景體(平截頭體),落在這個視景體之外的頂點都會被裁減掉,剩下的座標將轉變爲屏幕上可見的片段(將3D座標映射到2D的標準化設備座標系中)。結果是物體座標系轉換爲裁剪空間座標系(歸一化)

  4. 視口變換:將裁剪空間轉換到屏幕空間,我們只要指定了視口的其實座標和大小,其它的OpenGL會在光柵化階段自動完成

發佈了44 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章