2012-06-17 2 views
0

Alright, так что я получил этот код для gluLookAt:OpenGL матрица не вращается правильно

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 и повернуть его, а затем вернуть обратно туда, где он был.

ответ

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 (где находится ваш куб)

1

Вызов glLoadIdentity перед тем, как вычертить свой куб, уничтожит все настройки gluLookAt в вашей матрице просмотра, я не думаю, что он должен быть там.

Смежные вопросы