0

我有一个用 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预期的那样。但是,矩阵仍然从单位转换为纯零。

4

1 回答 1

2

(这真的是一个扩展注释,有代码)

这里肯定存在字节顺序问题。我运行了以下内容:

public class Test {
  public static void main(String[] args) {
    float f = (float)4.6006E-41;
    System.out.println(Integer.toHexString(Float.floatToIntBits(f)));
  }
}

并得到输出 803f

浮点 1.0 是大端 0x3f800000。

于 2013-02-13T22:41:01.903 回答