LWJGL 2.9 gluProject 3D到2D

时间:2015-12-11 19:51:28

标签: opengl rendering lwjgl

所以我一直在使用GLU.gluProject使用LWJGL 3D对象坐标到2D屏幕空间坐标,但是我发现当3D对象的xyz在摄像机后面时会出现相当大的问题。屏幕空间坐标似乎在屏幕上两次,一次用于实际部分工作正常,但是当对象落后时,位置稍微颠倒对象的真实位置(摄像机向左移动,屏幕坐标也是如此)比相机快两倍。

以下是我用于3D到2D的代码:

public static float[] get2DFrom3D(float x, float y, float z) {
    FloatBuffer screen = BufferUtils.createFloatBuffer(3);
    IntBuffer view = BufferUtils.createIntBuffer(16);
    FloatBuffer model = BufferUtils.createFloatBuffer(16);
    FloatBuffer proj = BufferUtils.createFloatBuffer(16);

    GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, model);
    GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, proj);
    GL11.glGetInteger(GL11.GL_VIEWPORT, view);

    boolean res= GLU.gluProject(x, y, z, model, proj, view, screen);

    if (res) {
        return new float[] {screen.get(0), Display.getHeight() - screen.get(1), screen.get(2)};
    }
    return null;
}

另一个查询是screen.get(2)值的用途,因为它主要在0.8到1.1之间变化,但是当位置刚好在相机下方时,偶尔会达到-18或30,并且相机间距是坐的就在地平线上方或下方。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

相机(或相机平面)上的点可以从不正确投影。只能对线条或三角形等基元处理此情况。在渲染期间,基元被截取到视锥体上,从而可以生成新的顶点(和新的基元)。但是对于单个点来说这是不可能的,你总是需要线条或多边形边来计算任何有意义的交点。

个别点,这就是gluProject处理的所有点,可以在平截头体内部或外部。但是gluProject并不关心这一点,它只是应用变换,镜像摄像机前面的摄像头。调用者的责任是确保项目中的点实际上位于视锥体内。