2013-01-20 29 views
2

我想繪製一個2D形狀,我試圖用gluProject在3D和2D座標之間進行轉換。基本上我的目標是在(200,200)上畫一個點,並且適當地畫出點(因爲起始位置是0,0,0)。gluProject給出錯誤的座標

我初始化gluProject這樣的 -

GLdouble modelView[16]; 
GLdouble projection[16]; 
GLint viewport[4]; 
glGetDoublev(GL_MODELVIEW_MATRIX,modelView); 
glGetDoublev(GL_PROJECTION_MATRIX,projection); 
glGetIntegerv(GL_VIEWPORT,viewport); 

,我稱它在我生命的方法,這樣

double tx, ty, tz; 
gluProject(0.0,0.0,0.0,modelView,projection,viewport,&tx,&ty,&tz); 
cout<<"tx,ty,tz: "<<tx<<","<<ty<<","<<tz<<endl; 

我得到的值是怪異(-9e61,-9e61 ,-9e61)。我猜這是因爲我乘以一個不同的矩陣比我應該是。有什麼建議?

+2

嘗試打印'modelView','projection'和'viewport'並檢查它們的值是否合理。同時使用'glGetError'檢查OpenGL錯誤。 – Thomas

回答

1

我初始化gluProject這樣的 -

有你的錯誤就在這裏。 OpenGL是一個狀態機。沒有一次性初始化。您需要在OpenGL狀態機處於您想要取消投影的狀態時獲取矩陣和視口。如果你拿他們,例如在創建上下文之後,您只需獲取身份矩陣和一個可能不像您後來得到的視口。

如果您的願望是在特定位置繪製一個點,請查看radical7的答案。

0

您顯示的代碼是正確的。確保您有上下文綁定(通過調用wglMakeCurrentglxMakeCurrent或您使用的窗口工具包中的等效項),否則值(包括來自glGetError的值)將不會被定義。

這就是說,我認爲你並沒有像你那樣使用OpenGL。例如,如果你這樣做:

// Set up the projection transformation to match window coordinates 
glMatrixMode(GL_PROJECTION); 
glOrtho2D(0, windowWidth, 0, windowHeight); 

// No modeling transformation required for this rendering 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

glColor3f(1.0, 1.0, 1.0); // set the current color to white 
glBegin(GL_POINTS); 
glVertex2i(200, 200); 
glEnd(); 

你應該得到的像素(200,200),在窗口中的白點。