Я написал простой класс для операций с матрицами, который был перенесен с C++ OpenGL на Java с помощью LWJGL. Однако я наблюдал какое-то странное поведение, которое не должно происходить вообще. Мои 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 в один момент.