1. 程式人生 > >OpenGL: 螢幕座標到物體三維座標的轉換

OpenGL: 螢幕座標到物體三維座標的轉換

直接看程式碼吧,有註釋。

GLint		viewport[4] = { 0 };
GLdouble	modelview[16] = { 0 };
GLdouble	projection[16] = { 0 };
GLfloat		winX = 0.0f; 
GLfloat		winY = 0.0f;
GLfloat		winZ = 0.0f;
GLdouble	posX = 0.0f;
GLdouble	posY = 0.0f;
GLdouble	posZ = 0.0f;

glPushMatrix();//入棧:儲存當前矩陣資訊

// 引數要和繪圖的時候一模一樣
glOrtho(......);//注意這裡,我這裡是正交投影,請根據情況而定。
gluLookAt(......);

// 這裡的變換要和你繪圖的時候的變換順序和引數一樣,且必須要一樣。 
glScalef(......); // 縮放、平移、旋轉變換
glRotatef(..., 1.0f, 0.0f, 0.0f);
glRotatef(..., 0.0f, 1.0f, 0.0f);
glRotatef(..., 0.0f, 0.0f, 1.0f);

glTranslatef(......);
		
glGetIntegerv(GL_VIEWPORT, viewport); // 這個地方你仔細觀察,會發現viewport就是你視窗的大小範圍
glGetDoublev(GL_MODELVIEW_MATRIX, modelview);//獲取模型檢視矩陣
glGetDoublev(GL_PROJECTION_MATRIX, projection);//獲取投影矩陣

glPopMatrix();//出棧,恢復剛剛入棧的矩陣資訊

winX = sx;
winY = width - sy;    //width為螢幕的寬度(在Qt中需要更改為height,既高度)
		
//讀取螢幕深度            
glReadPixels((int)winX, winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

//座標轉換
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ);