我编写了一个用于矩阵运算的简单类,该类使用 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/