OpenGL 中的座標變換

2021-06-23 04:56:19 字數 2550 閱讀 1769

1 opengl中的變換 變換(transform),可以使3d空間中的物體投影到2d平面上。使用變換,你可以移動、旋轉、縮放甚至彎曲乙個物體。然而變換並沒有直接修改頂點 資料,取而代之,變換修改

1  opengl中的變換

變換(transform),可以使3d空間中的物體投影到2d平面上。使用變換,你可以移動、旋轉、縮放甚至彎曲乙個物體。然而變換並沒有直接修改頂點 資料,取而代之,變換修改了座標系。如果旋轉乙個座標系,然後再在旋轉後的座標系裡繪圖,繪製後的圖形就好像被旋轉了。在基本opengl渲染流程中,將 進行以下變換:

檢視變換 :用於指定觀察者的位置和方向;

模型檢視變換:移動和變換場景中的模型;

投影變換 :對視見空間進行裁剪和扭曲;

視見區變換:對最終輸出進行縮放。

1.1  檢視變換

在乙個場景中,我們希望改變觀察者的位置和觀察角度。用於改變觀察者方位和角度的變換,就是檢視變換。預設情況下(沒有執行任何變換時),觀察者位於點 (0,0,0),且視線朝著-z方向。也就是說,只有在z<0的地方繪圖,才有可能被觀察到。

1.2  模型檢視變換

此變換用於移動和旋轉場景中的物體。使用模型檢視變換完全可以代替檢視變換。道理是很簡單的:比如你想使用檢視變換將觀察者向-z軸移動10個單位,此時 場景中所有的物體都向+z軸移動了10個單位。這跟你直接使用模型檢視變換將場景中所有物體向+z方向移動10個單位的效果是完全一樣的。

1.3  投影變換

要把3d場景投影到2d平面上,就必須執行投影變換。投影變換有兩種形式,即平行投影變換和透視投影變換。關於平行投影和透視投影,在第3中已進行了具體 的介紹,這裡不在複述。現在要強調的是,投影也是一種變換,實現投影,本質上是對場景中所有物體進行特殊的變換,使得它們能夠被畫在乙個平面上。比如透視 投影變換會將場景中所有物體按照遠近不同進行縮放和扭曲,使它們看起來具有立體感。

1.4  視見區變換

這裡又回到了第二章中的主題。視見區變換就是對投影後的2d圖象進行縮放和剪裁,使它能夠被正確地顯示在視窗上。你可以回到第二章了解視見區的具體概念。

2  矩陣

opengl中的各種轉換是通過矩陣運算實現的,具體的說,就是當發出乙個轉換命令時,該命令會生成乙個4x4階的轉換矩陣(opengl中的物體座標一 律採用齊次座標,即(x, y, z, w),故所有變換矩陣都採用4x4矩陣),當前矩陣與這個轉換矩陣相乘,從而生成新的當前矩陣。

在opengl進行變換操作時,會首先把頂點轉換為1×4的矩陣(第1-3行分別存放頂點的x、y、z座標,第4行存放w座標,即縮放因子,一般總為 1.0),然後將這個點依次乘以模型檢視變換矩陣、投影矩陣、視見區變換矩陣……最後得到因出現在螢幕上的2d螢幕座標,完成變換。幸運的是,你不需要任 何數學基礎,哪怕你對矩陣一無所知,也能順利地完成這一流程。因為opengl已經封裝了高階函式,這使得你不用自己動手寫矩陣,就能完成所有的基本變 換。稍後就將介紹這些基本函式。

3  基本變換

模型變換是在世界座標系中進行的。預設時,物體模型的中心定位在座標系的中心處。opengl在這個座標系中,有三個命令,可以模型變換。

1、模型平移

gltranslate(type x,type y,type z);

該函式用指定的x,y,z值沿著x軸、y軸、z軸平移物體(或按照相同的量值移動區域性座標系)。

2、模型旋轉

glrotate(type angle,type x,type,y,type z);

該函式中第乙個變數angle制定模型旋轉的角度,單位為度,後三個變數表示以原點(0,0,0)到點(x,y,z)的連線為軸線逆時針旋轉物 體。例如,glrotatef(45.0,0.0,0.0,1.0)的結果是繞z軸旋轉45度。

3、模型縮放

glscale(type x,type y,type z);

該函式可以對物體沿著x,y,z軸分別進行放大縮小。函式中的三個引數分別是x、y、z軸方向的比例變換因子。預設時都為1.0,即物體沒變 化。程式中物體y軸比例為2.0,其餘都為1.0,就是說將立方體變成長方體。

4 變換的疊加性質

使用變換時,我們應該注意的是,變換是疊加在上次變換的基礎上的。也就是說,變換的效果會累積。每次呼叫變換函式時,會生成乙個新的函式來乘以當前的模型 檢視矩陣,隨後,新的矩陣將成為當前的模型變換矩陣,在下次執行變換時,會被新的矩陣相乘,因此作用效果將不斷累積。

我們可以呼叫glloadidentity();函式將當前模型檢視變換矩陣重置到初始狀態,再進行新的繪製:

5 視口變換

視口變換就是將視景體內投影的物體顯示在二維的視口平面上。運用相機模擬方式,我們很容易理解視口變換就是類似於**的放大與縮小。在計算機圖 形學中,它的定義是將經過幾何變換、投影變換和裁剪變換後的物體顯示於螢幕視窗內指定的區域內,這個區域通常為矩形,稱為視口。opengl中相關函式 是:

glviewport(glint x,glint y,glsizei width, glsizei height);

這個函式定義乙個視口。函式引數(x, y)是視口在螢幕視窗座標系中的左下角點座標,引數width和height分別是視口的寬度和高度。預設時,引數值即(0, 0, winwidth, winheight) 指的是螢幕視窗的實際尺寸大小。所有這些值都是以象素為單位,全為整型數。

**:

openGL座標變換

座標變換 opengl的每一種變換都是乙個矩陣的運算。假設當前某頂點座標為c,現在要做某種變換 設矩陣為m 得到新的座標c1,那麼運算過程就是c1 t c。opengl應用 左乘規則 座標的變換就是用變換矩陣乘以座標向量 opengl變換在程式設計的時候順序是反過來的。想對目標 glutwiresp...

OpenGL座標變換

1.x座標軸從左至右,y座標軸從下至上,z座標軸從裡至外。2.opengl螢幕中心的座標值是x和y軸上的0.0f點。3.中心左面的座標值是負值,右面是正值。移向螢幕頂端是正值,移向螢幕底端是負值。移入螢幕深處是負值,移出螢幕則是正值。glloadidentity,函式名。該函式的功能是重置當前指定的...

OPENGL場景座標變換

我們生活在乙個三維的世界 如果要觀察乙個物體,我們可以 1 從不同的位置去觀察它。檢視變換 2 移動或者旋轉它,當然了,如果它只是計算機裡面的物體,我們還可以放大或縮小它。模型變換 3 如果把物體畫下來,我們可以選擇 是否需要一種 近大遠小 的透視效果。另外,我們可能只希望看到物體的一部分,而不是全...