OpenGL座標轉換總結

2021-07-13 13:34:04 字數 2715 閱讀 8678

前面整理過乙個,不過後來感覺不是很對,這裡重新寫一下。先解釋一下這個問題,在opengl程式設計中,經常會需要與使用者的互動,比如對檢視進行指定點旋轉,獲取模型座標點等。而這些操作最方便的就是通過滑鼠進行操作,但滑鼠只能獲得螢幕座標,那麼如何轉換到opengl世界座標就成了乙個亟待解決的問題。

一、理論基礎

主要需要的是一些opengl觀察流程相關知識,但也不是十分必要,大致了解即可。

二、螢幕座標轉換成世界座標

// 資料結構

struct

point3d

;// 函式體

point3d

cmultiviewerview::wintogl(cpoint

winpt)

上面的函式的輸入引數cpoint winpt可以由mfc的滑鼠訊息響應函式直接得到,當然,用其他語言應該也有相應的方法得到。

注意,網上有人認為需要增加檢視已經做過的變換,個人認為不是很必要,因為modelview包含了需要的一切資訊。

上面函式的關鍵語句是

gluunproject(winx, 

winy, 

winz, 

modelview, 

projection, 

viewport, &posx, &posy, &posz);

這就是通過模型變換矩陣,投影矩陣,視口矩陣,由視窗座標得到gl世界座標的方法。

三、世界座標轉換成螢幕座標

語句類似,關鍵幾句為

glpushmatrix();

glgetdoublev(gl_modelview_matrix, modelview); 

// 檢視矩陣

glgetdoublev(gl_projection_matrix, 

projection); 

// 投影矩陣

glgetintegerv(gl_viewport, viewport); 

// 視口

glpopmatrix();

gluproject( 

(gldouble) x,

(gldouble) y,

(gldouble) z,

modelview,

projection,

viewport,

&posx,

&posy,

&posz);

四、計算固定點經過模型變換後坐標

這也是乙個常見的問題,這並不需要什麼特別的函式,只要將modelview乘以固定點的齊次座標即可,對於三維空間中的點,其齊次座標為[x, y, z, 1],另外前面說過,modelvew是乙個16個元素的陣列,就是乙個列序的4x4矩陣,因此正好可以進行矩陣相乘。

struct

point3d

; glgetfloatv( 

gl_modelview_matrix, 

m_mv);

point3d

cmecviewerview::transpoint(point3d

centerpt)

上面的m_mv獲取是用

[cpp]view plain

copy

glint    viewport[4];   

gldouble modelview[16];   

gldouble projection[16];   

glfloat  winx, winy, winz;   

gldouble posx, posy, posz;   

glpushmatrix();  

// 變換要繪圖函式裡的順序一樣,否則座標轉換會產生錯誤

glscalef(m_srtmatrix[0], m_srtmatrix[1], m_srtmatrix[2]); // 縮放、平移、旋轉變換

glrotatef(m_srtmatrix[3], 1.0f, 0.0f, 0.0f);  

glrotatef(m_srtmatrix[4], 0.0f, 1.0f, 0.0f);  

glrotatef(m_srtmatrix[5], 0.0f, 0.0f, 1.0f);  

gltranslatef(m_srtmatrix[6], m_srtmatrix[7], m_srtmatrix[8]);  

glgetintegerv(gl_viewport, viewport); // 得到的是最後乙個設定視口的引數

glgetdoublev(gl_modelview_matrix, modelview);   

glgetdoublev(gl_projection_matrix, projection);   

glpopmatrix();  

winx = x;   

winy = screenheight - y;  

glreadpixels((int

)winx, (

int)winy, 1, 1, gl_depth_component, gl_float, &winz);   

gluunproject(winx, winy, winz, modelview, projection, viewport, &posx, &posy, &posz);  

gluunproject()

gluproject()

螢幕座標到opengl世界座標轉換

OpenGL 座標轉換

在opengl繪圖過程中,需要通過座標轉換將模型座標點的座標轉換為世界座標。如圖,要把模型座標系o x y z 中的點a座標轉換為世界座標oxyz的點座標,需要得到本地座標到世界座標的轉換矩陣。如圖,模型座標系中原點在世界座標系的座標是 2,2,2 點a在模型座標中的座標是 3,2,1 根據模型座標...

螢幕座標向OpenGL座標轉換

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

螢幕座標向OpenGL座標轉換

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