Logjal A.S. Gilbargah Ed. Taha Qad

LWJGL 2.9 gluProject 3D to 2D

所以我一直在玩 LWJGL 3D object 坐标到 2D 屏幕 space 坐标使用 GLU.gluProject,但是我发现当 xyz的 3D object 在相机后面。屏幕 space 坐标似乎在屏幕上出现了两次,一次用于实际的药水,效果很好,但是当 object 落后时又一次,并且位置与 object 有点相反s真实位置(相机向左移动,屏幕坐标也是相机的两倍)。

这是我用于 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,并且相机间距正好位于 horizon.

的上方或下方

感谢任何帮助。

相机后面(或相机平面上)的点永远不会被正确投影。这种情况只能处理 primitives,例如直线或三角形。在渲染过程中,图元被裁剪到视锥体上,这样就可以生成新的顶点(和新的图元)。但这对于单个点是不可能的,您总是需要线或多边形边来计算任何有意义的交点。

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