LWJGL Матричный стек Неожиданное поведение

1

Я написал простой класс для операций с матрицами, который был перенесен с 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.

Теги:
opengl
lwjgl
matrix

1 ответ

2
Лучший ответ

Когда вы пишете:

stack.push(stack.peek());

вы нажимаете указатель на матрицу, возвращаемую из stack.peek(); при изменении одного из двух, он переходит в тот же слот в памяти. например, при изменении верхней части стека изменяется и второй элемент. Пытаться:

stack.push(new Matrix4f(stack.peek()));

У меня была аналогичная проблема с JBox2D Vec2 в один момент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню