0

Java用のLWJGLで書かれた基本的な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を取得しました

Float1.0はビッグエンディアン0x3f800000です。

于 2013-02-13T22:41:01.903 に答える