【问题标题】:LWJGL Matrix Stack Unexpected BehaviourLWJGL 矩阵堆栈意外行为
【发布时间】:2014-03-16 16:31:48
【问题描述】:

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

【问题讨论】:

  • 不相关,但是...您有一个名为 setTop (...)getTop (...) 的方法,但您的 multiplyTop (...) 实现没有使用这些方法中的任何一个。看起来这可以/应该实现为 setTop (Matrix4f.mul (getTop (), m, null)) 以保持一致性。
  • 也就是说,我认为Matrix4f.mul (...) 中操作数的顺序可能会颠倒(换句话说,考虑在参数中交换stack.peek()m)。我不确定您的 Matrix 类是如何实现的,无论是行优先还是列优先,乘法前还是后乘法,但操作数的顺序可能会导致此类异常行为。
  • 我尝试交换它们,但没有效果。我认为问题在于推送和弹出,因为即使顺序颠倒它也不应该移出屏幕;它应该锁定在那个位置,因为我们正在推动和弹出矩阵。

标签: java opengl matrix lwjgl


【解决方案1】:

当你写作时:

stack.push(stack.peek());

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-19
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多