因此,我使用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));
不知道這是否會影響,但您不需要16個條目的視口,4是所有它返回(開始x和y,然後寬度和高度)。 – james82345 2013-03-07 00:03:17
哦,我們是在2013年,你仍然在使用固定管道?使用現代方法,然後它取決於你的投影矩陣是怎樣的...... – 2013-03-07 08:25:56