【发布时间】: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 类是如何实现的,无论是行优先还是列优先,乘法前还是后乘法,但操作数的顺序可能会导致此类异常行为。 -
我尝试交换它们,但没有效果。我认为问题在于推送和弹出,因为即使顺序颠倒它也不应该移出屏幕;它应该锁定在那个位置,因为我们正在推动和弹出矩阵。