所以我使用 gluProject 获取 3D 坐标并告诉我它们在屏幕上渲染的位置。问题是我没有得到与 gluProject 相同的坐标以及它们实际最终渲染的位置。奇怪的是,如果相机的 x、y 和 z 与我正在测试的点之间的差异相等(例如相机位于 5,3,4 和点位于 2,0,1),它会给出正确的结果值(value)观。我使用 gluLookAt() 进行相机变换。我已经确认我用于渲染的相同矩阵被传递到 gluProject。下面是我的渲染代码,camera.look(),以及我的 gluProject 部分:
渲染:
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();
相机.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));
最佳答案
也许尝试使向上 vector 与相机方向和位置成直角,而不是始终保持 (0, 1, 0)。
关于java - 为什么 gluProject 不使用 LWJGL 给出正确的屏幕空间坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15259798/