opengl 座標測試

2021-09-30 10:18:22 字數 3799 閱讀 9078

float ratio = 1.0* w / h;

// 投影在螢幕上顯示的位置,以及寬度,高度(現在即投影到螢幕(0,0)座標)

glviewport(0, 0, w, h);

// 看到的是乙個1的正方體

// 投影

glmatrixmode(gl_projection);

glloadidentity();

//正投影(左右下上前後的投影範圍)(這個是以攝像機為原點的座標)

// 看到的是眼前6.1 到 7.1 範圍的東西,看不到任何東西

//glortho(-2, 2, -2, 2, 6.1, 7.1);

glortho(-2, 2, -2, 2, 1, 10);

//透視投影

// 第乙個是眼睛睜開大小 第二個是寬高比 第三個是近裁面 第四個是遠裁剪面

//gluperspective(45,ratio,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

// 自定義觀察座標,不設定,則世界座標的原點為攝影機,z反方向為觀察方向,y正方向為上(右手系座標,右方為x,上為y,向外為z)

// 前三個是攝影機座標,觀察點(攝影機-觀察點為z軸正向)最後三個是y軸正方向(不可與z同向),確定yz,x方向就定了

glulookat(0,1, 5, 0,0,0, 0,1,0);

//---------------------正投影

// 投影面是-2 到 2,因為攝像機和觀察點都上移了2,所以觀察的範圍就是世界座標的0-4,所以只看到視窗下面1/4處有正方體

glmatrixmode(gl_projection);

glloadidentity();

glortho(-2, 2, -2, 2, 1, 100);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,1,0);

// 投影面是-2 到 2,因為攝像機和觀察點都上移了2,所以觀察的範圍就是世界座標的0-4,所以只看到視窗下面1/4處有正方體

glmatrixmode(gl_projection);

glloadidentity();

glortho(-2, 2, -2, 2, 1, 100);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,2, 5, 0,2,0, 0,1,0);

// 攝像機上移2,觀察點不變,上下看到的是斜著穿過正方體的平面,左右還是正方體,所以上下長,左右不變

glmatrixmode(gl_projection);

glloadidentity();

glortho(-2, 2, -2, 2, 1, 100);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,2, 5, 0,0,0, 0,1,0);

// 攝像機上移2,觀察點不變,而擷取範圍縮小,導致中間有部分投影為空

glmatrixmode(gl_projection);

glloadidentity();

glortho(-2, 2, -2, 2, 4.5, 5);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,2, 5, 0,0,0, 0,1,0);

// 看到的是眼前6.1 到 7.1 範圍的東西,而正方體位於-1到1,即4到6,所以看不到任何東西

glmatrixmode(gl_projection);

glloadidentity();

glortho(-2, 2, -2, 2, 6.1, 7.1);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,1,0);

-----------------透視投影---------------------------

// 觀察點為5,y軸為上,眼睛睜開90度,寬高比為1,近裁剪面為眼前1,即世界座標4,所以看到正方型佔螢幕1/5

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,1,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0, 0, 5, 0,0,0, 0,1,0);

// 眼睛睜開的小,等於正方向放大

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(30,1,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,1,0);

// 寬高比為2,因為視口沒變,所以感覺左右壓縮,上下邊長(正常顯示應該 glviewport(0, 0, w, h/2);即視口的寬高於此一致)

//glviewport(0, 0, w, h/2);

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,2,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,1,0);

// 裁剪改變,參考正投影

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,1,6.1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,1,0);

// 攝像機與觀察點同時下移2,等於正方體在頭頂,被眼睛看到(不是直視),參考正投影

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,1,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,-2, 5, 0,-2,0, 0,1,0);

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,1,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,-2, 5, 0,0,0, 0,1,0);

// 上方向為0 -1 0 等於上下顛倒,若是正方向有箭頭指向就可以看清

glmatrixmode(gl_projection);

glloadidentity();

gluperspective(90,1,1,566);

glmatrixmode(gl_modelview);

glloadidentity();

glulookat(0,0, 5, 0,0,0, 0,-1,0);

OpenGL 螢幕座標向OpenGL座標轉換

螢幕座標向opengl座標轉換 很多人用opengl繪圖會遇到乙個問題即螢幕座標向opengl座標轉換,在網上流傳著如下類似的 glint viewport 4 gldouble modelview 16 gldouble projection 16 glfloat winx,winy,winz g...

openGL座標變換

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

opengl 螢幕座標

建立opengl模型過程 opengl座標變換很有特點,為了簡單描述先定義2個座標系 1 世界座標系 無論如何變換,世界座標系都不動,以螢幕中心為原點 0,0,0 你面對螢幕,你的右邊是x正軸,上面是y正軸,螢幕指向你的為z正軸。2 當前繪圖座標系 即區域性座標系 當前繪圖座標系是繪製物體時的座標系...