前面整理過乙個,不過後來感覺不是很對,這裡重新寫一下。先解釋一下這個問題,在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...