一人称カメラを作ってみました。XNA プロジェクトのコードの一部を取り、それを Java (LWJGL) に変換しようとしました。
Matrix4f mx = Matrix4f.rotate(pitch, new Vector3f(1, 0, 0),
new Matrix4f(), null);
Matrix4f my = Matrix4f.rotate(yaw, new Vector3f(0, 1, 0),
new Matrix4f(), null);
Matrix4f rotationMatrix = Matrix4f.mul(mx, my, null);
Vector4f tmp = Matrix4f.transform(rotationMatrix, new Vector4f(0, 0,
-1, 0), null);
target = new Vector3f(position.x + tmp.x, position.y + tmp.y,
position.z + tmp.z);
GLU.gluLookAt(this.position.x, this.position.y, this.position.z,
this.target.x, this.target.y, this.target.z, 0, 1.0f, 0);
マウスを動かすと、ピッチとヨーが増減します。ゲームの実行開始時は正常に動作しますが、いくつかの動きの後、下や上を見ることができません。私の位置が < 0 の場合に発生する必要がありますか?
完璧に動作する XNA コード:
Matrix rotationMatrix = Matrix.CreateRotationX(pitch) * Matrix.CreateRotationY(yaw);
camera.Target = Vector3.Transform(Vector3.Forward, rotationMatrix) + camera.Position;
this.viewMatrix = Matrix.CreateLookAt(this.position, this.target, Vector3.Up);
編集
そのため、行列を回転させるために LWJGL と XNA の間に何か違いがあることがわかりました。
ジャワ:
Matrix4f mx = Matrix4f.rotate(1.2345f, new Vector3f(1,0,0),new Matrix4f(),null);
結果:
{1.0 0.0 0.0 0.0} {0.0 0.3299931 -0.9439833 0.0}{0.0 0.9439833 0.3299931 0.0}{0.0 0.0 0.0 1.0}
XNA
Matrix.CreateRotationX(1.2345f)
結果:
{1,0,0,0} {0,0.3299931,0.9439833,0} {0,-0.9439833,0.3299931,0} {0,0,0,1}
違いは -0.9439833 と +0.9439833 です ... 異なる結果がある理由を誰か説明してもらえますか? 同じ機能じゃない?
ありがとうございました!