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
ます。ただし、行列は恒等から純粋なゼロに変換されます。