OpenGL: 螢幕座標到物體三維座標的轉換
阿新 • • 發佈:2018-12-17
直接看程式碼吧,有註釋。
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);