为了账号安全,请及时绑定邮箱和手机立即绑定

glGetFloat(GL_MODELVIEW_MATRIX, modelview) 返回单位矩阵

glGetFloat(GL_MODELVIEW_MATRIX, modelview) 返回单位矩阵

跃然一笑 2021-09-29 17:20:27
我正在尝试将 3d 点坐标转换为 2d 屏幕坐标。但是,问题是当我实现它并运行程序时,即使我改变了相机位置,输出也没有变化。尽管我可以完全看到 3d 模型,但输出通常超出屏幕坐标范围(因此任何点或三角形都没有机会超出屏幕坐标)。将 3d 坐标转换为 2d 坐标的方法:public Vector2f get2DFrom3D(float x, float y, float z){    FloatBuffer screen_coords = BufferUtils.createFloatBuffer(4);    IntBuffer viewport = BufferUtils.createIntBuffer(16);    FloatBuffer modelview = BufferUtils.createFloatBuffer(16);    FloatBuffer projection = BufferUtils.createFloatBuffer(16);    GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelview);    System.out.println("modelview:");    displayFloatBuffer(modelview);    GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);    System.out.println("projection:");    displayFloatBuffer(projection);    GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);    System.out.println("viewport:");    displayIntBuffer(viewport);    boolean result = GLU.gluProject(x, y, z, modelview, projection, viewport, screen_coords);    if (result)    {        System.out.printf("Convert [ %6.2f %6.2f %6.2f ] -> Screen [ %4d %4d ]\n", x, y, z, (int)screen_coords.get(0), (int)(screen_coords.get(3)-screen_coords.get(1)));        return new Vector2f((int)screen_coords.get(0), (int)(screen_coords.get(3)-screen_coords.get(1)));    }    else    {        return null;    }}投影矩阵通过这个方法创建并直接加载到顶点着色器中:private void createProjectionMatrix(){        float aspectRatio = (float) Display.getWidth() / (float) Display.getHeight();        float y_scale = (float) ((1f / Math.tan(Math.toRadians(FOV / 2f))) * aspectRatio);        float x_scale = y_scale / aspectRatio;        float frustum_length = FAR_PLANE - NEAR_PLANE;        projectionMatrix = new Matrix4f();        projectionMatrix.m00 = x_scale;        projectionMatrix.m11 = y_scale;        projectionMatrix.m22 = -((FAR_PLANE + NEAR_PLANE) / frustum_length);        projectionMatrix.m23 = -1;        projectionMatrix.m32 = -((2 * NEAR_PLANE * FAR_PLANE) / frustum_length);        projectionMatrix.m33 = 0;    }我认为只有视口是正确的,但模型视图和投影矩阵看起来好像没有加载为它们计算的值。注意:我目前使用的是 lwjgl 2.9.3。
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

我找到了解决我的问题的方法,并且效果很好。这是我的新 get2DFrom3D 方法:


public Vector2f get2DFrom3D(float x, float y, float z)

{

    FloatBuffer screen_coords = BufferUtils.createFloatBuffer(4);

    IntBuffer viewport = BufferUtils.createIntBuffer(16);

    FloatBuffer modelview = BufferUtils.createFloatBuffer(16);  

    FloatBuffer projection = BufferUtils.createFloatBuffer(16);


    Matrix4f modelviewMatrix = new Matrix4f();

    Matrix4f transformationMatrix = new Matrix4f();

    Matrix4f.mul(transformationMatrix

            , Maths.createViewMatrix(camera)

            , modelviewMatrix);


    modelviewMatrix.store(modelview);

    modelview.rewind();


    projectionMatrix.store(projection);

    projection.rewind();


    GL11.glGetInteger(GL11.GL_VIEWPORT, viewport);


    boolean result = GLU.gluProject(x, y, z, modelview, projection, viewport, screen_coords);


    if (result)

    {

        Vector2f vector = new Vector2f((int)screen_coords.get(0), (int)(screen_coords.get(1)));

        return vector;

    }

    else

    {

        return null;

    }

}

而不是使用 glGetFloat 方法来获取模型视图和投影矩阵。我改为使用我已经在其他类中创建的矩阵并将这些矩阵作为参数传递。然后,我将矩阵转换为缓冲区,以便我可以使用它们。倒带它们之后,我终于能够从 gluProject 中获得一个点的正确屏幕坐标。


即使问题解决了,我仍然不知道为什么这些行不起作用:


  GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, modelview);

    System.out.println("modelview:");

    displayFloatBuffer(modelview);


    GL11.glGetFloat(GL11.GL_PROJECTION_MATRIX, projection);


查看完整回答
反对 回复 2021-09-29
  • 1 回答
  • 0 关注
  • 347 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信