我为矩阵操作编写了一个简单的类,它使用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中使用的矩阵。
答案 0 :(得分:2)
当你写:
stack.push(stack.peek());
你按下了从stack.peek()返回的矩阵的指针;当你修改两者中的任何一个时,它会转到内存中的同一个插槽。例如修改堆栈顶部时,也会修改第二个元素。尝试:
stack.push(new Matrix4f(stack.peek()));
我在使用JBox2D Vec2时遇到了类似的问题。