OpenGL-坐标系
笛卡爾坐標系
- 二維繪圖:笛卡爾坐標有一個X軸和一個Y軸組成,X軸為水平方向,Y軸為垂直方向,X和Y相互垂直
?
二維笛卡爾坐標系
- 三維繪圖:笛卡爾坐標多了一個Z軸,Z軸同時垂直于X和Y軸。Z軸的實際意義代表著三維物體的深度
?
三維笛卡爾坐標系
- 坐標裁剪:窗口是以像素為單位進行度量的。開始在窗口中繪制點、線和形狀之前,要把指定的笛卡爾坐標對翻譯成屏幕坐標,我們可以通過指定占據(jù)窗口的笛卡爾區(qū)域來轉換,這個區(qū)域叫做裁剪區(qū)域。
PS:
x,y,z,w:指的不是四維,其中w指的是縮放因子
視口
在顯示器的屏幕窗口上定義一個對齊的矩形的視口,OpenGL會自動建立世界窗口和視口的變換(包括縮放和平移)。當世界窗口中所有對象都被繪制時,對象在世界窗口中的部分會被自動地映射到視口中————換句話說,被映射到屏幕坐標中,即像素在顯示器上的坐標。
視口就是窗口內部用于繪制裁剪區(qū)域的客戶區(qū)域
坐標系統(tǒng)從笛卡爾坐標到物理屏幕像素的映射是通過視口(viewport)的設置來指定
?
// 視口的設定通過glViewport()函數(shù),它的原型是:void glViewport(GLint x,GLint y,GLint width,GLint ehignt); //它設置窗口的左下角,以及寬度和高度。視口一般和窗口是等比的
投影方式
正投影(Orthographics Projection)或平行投影
- 視景體:正方形/長方形
- 不存在近大遠小
- 適合平面圖形/2D圖形渲染
透視投影
- 視景體:平截體
- 近大遠小
- 適合使3D圖像渲染
?
左側-透視投影,右側-正投影
左右手坐標系
?
左/右手坐標系
- OpenGL坐標系(物體、世界、照相機坐標系)屬于右手坐標系
- 設備坐標系使用的是左手坐標系
坐標系
OpenGL里每個頂點的z,y,z都應該在?1到1之間,超出這個范圍的頂點將是不可見
頂點坐標->著色器處理->設備坐標->光柵器->變換為屏幕二維坐標和像素
頂點坐標在轉換為屏幕坐標之前會變換多個坐標系統(tǒng)(Coordinate System),之所以引入過渡坐標系是為了更加方便操作和運算
共有5中比較重要的坐標系系統(tǒng)
- 局部空間(Local Space,或者稱為物體空間(Object Space))
- 世界空間(World Space)
- 觀察空間(View Space,或者稱為視覺空間(Eye Space))
- 裁剪空間(Clip Space)
- 屏幕空間(Screen Space)
將頂點從一個坐標系轉換到另一個坐標系需要用到幾個變換矩陣,其中幾個比較重要的是模型(Model)、觀察(View)、投影(Projection)三個矩陣。
物體頂點的起始坐標按序經過上述5個坐標系系統(tǒng)最終轉換為屏幕坐標
圖形學中的幾個比較重要的坐標系:
1.世界坐標系
它是一個特殊的坐標系,它建立了描述其他坐標系所需要的參考系。也就是說,可以用世界坐標系去描述其他所有坐標系或者物體的位置。所以有很多人定義世界坐標系是“我們所關心的最大坐標系”,通過這個坐標系可以去描述和刻畫所有想刻畫的實體。
世界坐標系又稱全局坐標系或者宇宙坐標系。
2.物體坐標系
物體坐標系與特定的物體關聯(lián),每個物體都有自己特定的坐標系。不同物體之間的坐標系相互獨立,可以相同,可以不同,沒有任何聯(lián)系。同時,物體坐標系與物體綁定,綁定的意思就是物體發(fā)生移動或者旋轉,物體坐標系發(fā)生相同的平移或者旋轉,物體坐標系和物體之間運動同步,相互綁定。
舉例說明一下物體坐標系:我們每個人都有自己的物體坐標系,當我們決定要往前走的時候,每個人實際前行的絕對方向都不一樣,可能是向北,也可能向南,或者其他方向。這里前后左右是物體坐標系中的概念。當告訴張三往前走,就是張三同學沿著自己物體坐標系的前方運動。至于張三往前走是往東還是向北,這是張三的運動在世界坐標系下的描述。
?
坐標系
這個立方體的物體坐標系如圖所示,不論該立方體位于世界坐標系的任何位置,處于什么角度,物體坐標系與物體都是綁定在一起。
物體坐標系又稱模型坐標系
3.攝像機坐標系
- 在坐標系的范疇里,攝像機坐標系等同于照相機坐標系
- 照相機坐標系是和觀察者密切相關的坐標系
- 照相機坐標系和屏幕坐標系相似,差別在于照相機坐標系處于3D空間中,而屏幕坐標系在2D平面里。
4.慣性坐標系
慣性坐標系是為了簡化世界坐標系到物體坐標系的轉化而產生的。慣性坐標系的原點與物體坐標系的原點重合,慣性坐標系的軸平行于世界坐標系的軸。引入了慣性坐標系之后,物體坐標系轉換到慣性坐標系只需旋轉,從慣性坐標系轉換到世界坐標系只需平移。
從慣性坐標系轉換到世界坐標系只需要平移
坐標轉換
物體坐標/對象坐標(Object Space)
|
模型變換(transformation)
|
世界坐標(World Space)
|
視變換(Viewing)
|
觀察者坐標/攝像機坐標(Eye Space)
|
投影變換(Projection transformation)
|
裁剪坐標(Clip Space)
|
透視除法(Perspective divide)
|
規(guī)范化設備坐標(NDC Space)
|
視口變換(ViewPort mapping)
|
屏幕坐標(Screen space)
-
OpenGL只定義了裁剪坐標系、規(guī)范化設備坐標系和屏幕坐標系
-
局部坐標系(模型坐標系)、世界坐標系和照相機坐標系都是為了方便用戶設計而自定義的坐標系
用戶自定義變換(在頂點著色器中完成)
Attribute->Vertex->模型變換(Model Space) ->World Space>Camera Space->Clip Space
|
OpenGL變換(頂點著色器處理后的階段完成)
透視除法(Clipping)->NDC Space->Window Space->Render
視口變換:
使用 glViewPort 內部的參數(shù)來將標準化設備坐標映射到屏幕坐標,每個坐標關聯(lián)一個屏幕上的點的過程
作者:Tobesky
鏈接:https://www.jianshu.com/p/e25bf6dc12af
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。
總結
以上是生活随笔為你收集整理的OpenGL-坐标系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: html简单父子页面,js 的 ifra
- 下一篇: 网申民生女人花信用卡额度一般是多少