java - LWJGL 矩阵堆栈意外行为

标签 java opengl matrix lwjgl

我编写了一个用于矩阵运算的简单类,该类使用 LWJGL 从 C++ OpenGL 移植到 Java。然而,我观察到一些根本不应该发生的奇怪行为。我的pushMatrix()和popMatrix()似乎什么也没做。当我运行此代码时,我显示的模型将浮到屏幕右侧。翻译后它根本不应该移动,因为我插入并弹出了矩阵堆栈。 这是我的 MatrixManager 类:

private static Stack<Matrix4f> stack = new Stack<Matrix4f>();
public static void pushMatrix()
{
    stack.push(stack.peek());
}

public static void popMatrix()
{
    stack.pop();
}
public static Matrix4f getTop()
{
    return stack.peek();
}

public static void setTop(Matrix4f m)
{
    stack.set(stack.size()-1, m);
}

public static void multiplyTop(Matrix4f m)
{
    stack.set(stack.size()-1, Matrix4f.mul(stack.peek(), m,null));
}

public static void SendToGLSL()
{

    stack.peek().store(modelBuf);
    modelBuf.flip();
    //viewBuf.flip();
    //projectionBuf.flip();


    //GL20.glUniformMatrix4(matrixlocations[0], false, modelBuf);
    //GL20.glUniformMatrix4(matrixlocations[1], false, viewBuf);
    //GL20.glUniformMatrix4(matrixlocations[2], false, projectionBuf);
    GL20.glUniformMatrix4(matrixlocations[3], false, modelBuf);
}

以及有问题的代码:

protected void renderTileEntityDirt(TileEntityDirt t)
{
    MatrixManager.pushMatrix();

    MatrixManager.multiplyTop(MatrixManager.getTop().translate(new Vector3f(t.posX,t.posY,t.posZ)));

    MatrixManager.SendToGLSL();
    Model.BindModelDataToRender(t.getClass());
    Main.renderEngine.bindTexture(TextureResource.getTexture("dirt"));
    Model.RenderModel(t.getClass());
    MatrixManager.popMatrix();
}

modelBuf 只是一个 FloatBuffer。 matrixLocations[0] 是我在 GLSL 中使用的矩阵。

最佳答案

当你写下:

stack.push(stack.peek());

你压入从 stack.peek() 返回的矩阵的指针;当您修改两者中的任何一个时,它都会进入内存中的同一插槽。例如当您修改堆栈顶部时,第二个元素也会被修改。尝试:

stack.push(new Matrix4f(stack.peek()));

我在使用 JBox2D Vec2 时遇到过类似的问题。

关于java - LWJGL 矩阵堆栈意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439563/

相关文章:

在 C 中创建矩阵

python - 从数据列表中创建矩阵列表

java - 通过java通过内连接两个表进行SQL查询

java - 获取 json 的确切部分

java - 如何将H2添加到Wildfly中,以便我可以看到数据库中的数据?

opengl - 为什么获取多重采样纹理需要整数 UV 坐标

java - 使用 GWT + AppEngine 还是 LAMP?现有 Java 开发人员

java - 与 LWJGL 共享 OpenGL/OpenCL

opengl - 将 ARB 程序集翻译成 GLSL?

游戏 Ruzzle 中使用的算法