LWJGL Матричный стек Неожиданное поведение
Я написал простой класс для матричных операций, который был перенесен из 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.
1 ответ
Когда вы пишете:
stack.push(stack.peek());
вы нажимаете указатель на матрицу, возвращенную из stack.peek(); когда вы изменяете любой из них, он попадает в один и тот же слот памяти. Например, когда вы изменяете вершину стека, второй элемент также изменяется. Пытаться:
stack.push(new Matrix4f(stack.peek()));
У меня была похожая проблема при работе с JBox2D Vec2 в один момент.