LWJGL矩阵堆栈意外行为

时间:2014-03-16 16:31:49

标签: 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中使用的矩阵。

1 个答案:

答案 0 :(得分:2)

当你写:

stack.push(stack.peek());

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

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

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