我有一个用 LWJGL 为 java 编写的基本 OpenGL 程序。在阅读了为什么使用俯仰、偏航和滚动变量是一个坏主意后,我才刚刚开始研究旋转矩阵。然而,由于矩阵更难使用,我正在编写一个函数,它接受偏航、俯仰和滚动并将它们转换为旋转矩阵,然后将其与 Modelview 矩阵相乘。我的代码如下:
public static void loadRotationalMatrix(double pitch, double yaw, double roll)
{
FloatBuffer Ry = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();
FloatBuffer Rx = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();
FloatBuffer Rz = ByteBuffer.allocateDirect(16 * Double.SIZE).asFloatBuffer();
Rx.put(new float[]
{
1, 0, 0, 0,
0, (float) cos(pitch), (float) sin(pitch), 0,
0, (float) -sin(pitch), (float) cos(pitch), 0,
0, 0, 0, 1
});
Ry.put(new float[]
{
(float) cos(yaw), 0, (float) -sin(yaw), 0,
0, 1, 0, 0,
(float) sin(yaw), 0, (float) cos(yaw), 0,
0, 0, 0, 1
});
Rz.put(new float[]
{
(float) cos(roll), (float) sin(roll), 0, 0,
(float) -sin(roll), (float) cos(roll), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1
});
GL11.glMultMatrix(Rx);
GL11.glMultMatrix(Ry);
GL11.glMultMatrix(Rz);
}
首先,我传递0, 0, 0
给了这个函数,我希望它对渲染的场景没有影响。但是,我正在绘制的简单正方形在函数调用后消失了。为了调试,我曾经glGetFloat
访问模型视图矩阵并查看发生了什么。
这就是事情变得奇怪的地方(至少对我来说):在我调用我的函数之前,检索到的FloatBuffer
存储模型视图矩阵是
4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41, 0.0, 0.0, 0.0, 0.0, 4.6006E-41,
或者,更具可读性,
4.6006E-41, 0.0, 0.0, 0.0,
0.0, 4.6006E-41, 0.0, 0.0,
0.0, 0.0, 4.6006E-41, 0.0,
0.0, 0.0, 0.0, 4.6006E-41,
一切正常。
在我打电话之后,矩阵变成了
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.0,
我的测试方块消失了。
怎么了?我的矩阵是否创建不正确?有什么我不明白的glMultMatrix
吗?有什么我需要启用或禁用的吗?为什么普通矩阵中有那些奇怪的浮点数?它不应该是单位矩阵(带1)吗?
编辑:
如果BufferUtils.createFloatBuffer(16 * Float.SIZE);
使用而不是ByteBuffer.allocateDirect(16 * Float.SIZE).asFloatBuffer();
,则提到的字节顺序问题消失并且4.6006E-41
' 成为1.0
预期的那样。但是,矩阵仍然从单位转换为纯零。