2014-08-30 49 views
0

我想寫一個OpenGL應用程序,從一個點(在這種情況下是0,0,0)觸發一個對象,鼠標的x,y位置。這是我目前使用的系統: 在點0,0,0處創建一個對象 獲取鼠標的x,y位置。 將鼠標轉換爲三維座標。 獲取遠平面設置爲4,294,967,295的起點和(鼠標-X,m鼠標-Y,遠平面)之間的一條直線。 使用參數線方程沿該線移動物體。創建一個向量從一個點到鼠標的x,y,OpenGL,C++

問題是遠平面上的x,y似乎不對應於x,y鼠標位置,因此對象飛行錯誤。我很確定/ para,etric equation部分工作正常,但2d和3-d空間之間的轉換可能不行。這是我曾嘗試:

首先轉換爲窗口座標:

POINT *mouse = new POINT(); 
mouse->x = mousePosition3D.x; 
mouse->y = mousePosition3D.y; 
ScreenToClient(windowHandle, mouse); 

然後以3-d座標

GLint viewport[4]; 
GLdouble modelview[16]; 
GLdouble projection[16]; 
GLfloat winX, winY, winZ; 
GLdouble posX, posY, posZ; 
OBJ_TriCo returnMe; 

//All matrices in use need to be retrived 
glGetDoublev(GL_MODELVIEW_MATRIX, modelview); 
glGetDoublev(GL_PROJECTION_MATRIX, projection); 
glGetIntegerv(GL_VIEWPORT, viewport); 
//Set the co-ords to lookup, based on the mouse position passed to this 
winX = (float)x; 
winY = (float)viewport[3] - (float)y; 
//Set the z to 0.99, for some reason the object will fly totally incorrectly otherwise 
winZ = 0.999; //Get a point on the bettween FAR and NEAR-Clipping planes 
//Convert the co-ords 
gluUnProject(winX, winY, winZ, modelview, projection, viewport, &posX, &posY, &posZ); 
//Return there values 
returnMe.x = posX; 
returnMe.y = posY; 
returnMe.z = posZ; 
return returnMe; 

我想知道有任何的身體做類似的事情或者我可能需要做些什麼才能讓物體沿着正確的路線飛行。

回答

0

可以從屏幕空間座標計算世界空間的射線方向(歸一化到範圍[1,1])是這樣的:

vec4f r = projection_to_view_matrix * vec4f(screen_x, screen_y, 0, 1); 
vec3f rdir = transpose(world_to_view_rotation_matrix) * vec3f(r.x, r.y, r.z); 
相關問題