gpt4 book ai didi

java - LWJGL 矩阵堆栈意外行为

转载 作者:行者123 更新时间:2023-11-30 03:58:41 26 4
gpt4 key购买 nike

我编写了一个用于矩阵运算的简单类,该类使用 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 中使用的矩阵。

最佳答案

当你写下:

stack.push(stack.peek());

你压入从 stack.peek() 返回的矩阵的指针;当您修改两者中的任何一个时,它都会进入内存中的同一插槽。例如当您修改堆栈顶部时,第二个元素也会被修改。尝试:

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

我在使用 JBox2D Vec2 时遇到过类似的问题。

关于java - LWJGL 矩阵堆栈意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com