【问题标题】:Java LWJGL OpenGL 3 convert 3d point to 2d pointJava LWJGL OpenGL 3 将 3d 点转换为 2d 点
【发布时间】:2021-01-03 14:26:41
【问题描述】:

我正在尝试在 LWJGL 3 中将 3d 矢量转换为 2d 矢量。 目标是在 3d 世界中移动时在 2d 屏幕上呈现名称标签。

这是我在 LWJGL 2 上使用的:

public static Vector2d to2D(double x, double y, double z) {
    FloatBuffer screenCoords = BufferUtils.createFloatBuffer(3);
    IntBuffer viewport = BufferUtils.createIntBuffer(16);
    FloatBuffer modelView = BufferUtils.createFloatBuffer(16);
    FloatBuffer projection = BufferUtils.createFloatBuffer(16);

    GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelView);
    GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);
    GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);

    boolean result = GLU.gluProject((float) x, (float) y, (float) z, modelView, projection, viewport, screenCoords);
    if (result) {
        return new Vector2d(screenCoords.get(0), Display.getHeight() - screenCoords.get(1));
    }
    return null;
}

在 LWJGL 2 中,使用 GLU.gluProject() 是可行的,现在已删除,在新的 LWJGL 版本中是否有任何替代方案?

【问题讨论】:

    标签: java 3d 2d lwjgl


    【解决方案1】:

    您可以为此使用JOML(也是downloadable as an LWJGL 3 Addon)及其Matrix4f.project() 方法。以下是您为 LWJGL3 + JOML 显示的代码 sn-p 的功能端口:

    import java.nio.*;
    import org.joml.*;
    import org.lwjgl.opengl.GL11;
    import org.lwjgl.system.MemoryStack;
    public class Snippet {
        public static Vector2d to2D(double x, double y, double z, int displayHeight) {
            Vector3f screenCoords = new Vector3f();
            int[] viewport = new int[4];
            try (MemoryStack stack = MemoryStack.stackPush()) {
                FloatBuffer modelView = stack.mallocFloat(16);
                FloatBuffer projection = stack.mallocFloat(16);
                GL11.glGetFloatv(GL11.GL_MODELVIEW_MATRIX, modelView);
                GL11.glGetFloatv(GL11.GL_PROJECTION_MATRIX, projection);
                GL11.glGetIntegerv(GL11.GL_VIEWPORT, viewport);
                new Matrix4f(projection)
                    .mul(new Matrix4f(modelView))
                    .project((float) x, (float) y, (float) z, viewport, screenCoords);
            }
            return new Vector2d(screenCoords.x, displayHeight - screenCoords.y);
        }
    }
    

    在移植的基础上,我还遵循了 LWJGL 3 中有关本机内存管理的最佳实践:https://blog.lwjgl.org/memory-management-in-lwjgl-3/#strategy5

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多