2013-03-06 48 views
1

因此,我使用gluProject獲取三維座標並告訴我他們在屏幕上渲染的位置。問題是我沒有得到與gluProject相同的座標,他們實際上結束了渲染。奇怪的部分是,如果攝像機的x,y和z與我測試的點之間的差異相等(例如攝像機在5,3,4和指向2,0,1),它會給出正確的值。我正在使用gluLookAt()進行相機轉換。我已經證實,我用於渲染的相同矩陣正被傳遞給gluProject。下面是我的渲染代碼,camera.look(),我與gluProject部分:爲什麼gluProject沒有給出正確的屏幕空間座標與LWJGL

渲染:

glEnable(GL_LIGHTING); 
glEnable(GL_NORMAL_ARRAY); 
glViewport(0, 0, Display.getHeight(), Display.getHeight()); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(90.0f, 1, .1f, 1000f); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
cam.look(); 
for (Cube cube : cubes) { 
    cube.draw(); 
} 
grid.draw(); 

Camera.look():

void look() { 
    calcPoints(xAng, yAng); 
    gluLookAt(x, y, z, x + dx, y + dy, z + dz, 0, 1, 0); 
} 

部分與gluProject:

glViewport(0, 0, Display.getHeight(), Display.getHeight()); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(90.0f, 1, .1f, 1000f); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
cam.look(); 

modelview = BufferUtils.createFloatBuffer(16); //floatbuffers, defined earlier 
projection = BufferUtils.createFloatBuffer(16); 
viewport = BufferUtils.createIntBuffer(16); 
FloatBuffer result = BufferUtils.createFloatBuffer(3); 

glGetFloat(GL_MODELVIEW_MATRIX, modelview); 
glGetFloat(GL_PROJECTION_MATRIX, projection); 
glGetInteger(GL_VIEWPORT, viewport); 

gluProject(1f, 0f, 0f, modelview, projection, viewport, result); 
//Utils.printFloatBuffer(projection); 
//Utils.printFloatBuffer(modelview); 
System.out.println(result.get(0) + " " + result.get(1) + " " + result.get(2)); 
+0

不知道這是否會影響,但您不需要16個條目的視口,4是所有它返回(開始x和y,然後寬度和高度)。 – james82345 2013-03-07 00:03:17

+0

哦,我們是在2013年,你仍然在使用固定管道?使用現代方法,然後它取決於你的投影矩陣是怎樣的...... – 2013-03-07 08:25:56

回答

0

也許試着讓攝像機的方向和位置成直角,而不是(0,1,0)不斷向上。

+0

爲什麼這會有所幫助?向上矢量指定哪個方向向上,所以如果我改變了我的視圖將會旋轉。 – user2141934 2013-03-07 21:11:44

相關問題