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 в один момент.

Другие вопросы по тегам