0

よし、gluLookAt のコードを取得しました。

lookAt = new Vector3f(-player.pos.x, -player.pos.y, -player.pos.z);
       lookAt.x += (float)Math.cos(Math.toRadians(player.yaw)) * Math.cos(Math.toRadians(player.pitch));
       lookAt.y += (float)Math.sin(Math.toRadians(player.pitch));
       lookAt.z += (float) Math.sin(Math.toRadians(player.yaw)) * Math.cos(Math.toRadians(player.pitch));

       GLU.gluLookAt(-player.pos.x, -player.pos.y, -player.pos.z, 
               lookAt.x, lookAt.y, lookAt.z, 
               0, 1, 0);

また、回転した立方体を描画しようとすると、正しく回転しません。

GL11.glPushMatrix();
GL11.glLoadIdentity();
GL11.glTranslatef(-cube.pos.x, -cube.pos.y, -cube.pos.z);
GL11.glRotatef(cube.yaw, 0, 1, 0);
GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);
/*draw the cube normally*/
GL11.glPopMatrix();

だから私の質問は、glulookatによって行われたマトリックスへの変更を適切に処理していますか? または私は何か間違っていますか?私が探している結果は、立方体を 0,0,0 に戻して回転させ、元の場所に戻すことです。

4

2 に答える 2

2

問題はここにあります:

GL11.glTranslatef(-cube.pos.x, -cube.pos.y, -cube.pos.z);
GL11.glRotatef(cube.yaw, 0, 1, 0);
GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);

キューブはすでに'0,0,0にあります。これは、Medel行列が単位行列であるためです(glLoadIdentity()と呼ばれるように)。

だからあなたはすべきです:

 GL11.glRotatef(cube.yaw, 0, 1, 0);
 GL11.glTranslatef(cube.pos.x, cube.pos.y, cube.pos.z);

これは望ましい効果をもたらすはずです。そうでない場合は、固定カメラで試して、glulookat()の前に追加したコードがlookatターゲットを0,0,0(キューブがある場所)から遠すぎていないかどうかを確認してください

于 2012-06-17T00:38:36.770 に答える
1

キューブを描画する前にglLoadIdentityを呼び出すと、ビューマトリックスに設定されているgluLookAtがすべて消去されますが、そこにあるべきではないと思います。

于 2012-06-17T00:36:41.550 に答える