java - 为什么 gluProject 不使用 LWJGL 给出正确的屏幕空间坐标

标签 java opengl 3d lwjgl

所以我使用 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/

相关文章:

java - Spring MVC JPA @ManyToMany 双向

c++ - 是否可以在 Qt 的顶级窗口之间使用相同的 OpenGL 上下文?

c# - 使用 SetTarget 方法针对多个对象的 Storyboard不起作用

歌剧中的 CSS 3D 导航不起作用

java - Jenkins 中的 Jetty/winstone 连接器配置

C# 等效的 java 代码

java.lang.NoClassDefFoundError : Failed resolution of: Landroid/webkit/SafeBrowsingResponse 错误

java - 使用 LibGdx 在 Java 中出现奇怪的 CPU 使用率

c++ - 其中 m_fLastX 和 m_fLastY 在 COpenGLControl 类中初始化

python - 在 3D 动画中在摄像机前绘制新的球体