LWJGL 2.9胶水项目3D到2D



所以我一直在使用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。

感谢您的帮助。

摄像机后面(或摄像机平面上)的点永远不能被正确投影。这种情况只能用于基本体,如直线或三角形。在渲染过程中,将基本体剪裁到查看平截头体上,以便可以生成新的顶点(和新的基本体)。但这对单个点来说是不可能的,你总是需要直线或多边形边来计算任何有意义的交点。

单个点,这就是gluProject处理的全部内容,可以在截头体的内部或外部。但gluProject并不在意这一点,它只是应用变换,将相机后面的点镜像到相机前面。调用方有责任确保要投影的点实际上在视锥体内。

最新更新