2013-09-26 5 views
0

Я пытаюсь сделать его похожим на камеру стиля FPS, где вы можете смотреть вокруг с помощью мыши. У меня это работает, но когда я перемещаюсь, а затем смотрю горизонтально, он вращает все, начиная с исходной точки. Что я делаю не так?Вращение камеры FPS с помощью OpenGL

private float moveSpeed = 0.1f; 

private Vector3f camera; 

private float horizontalAngle = 0.0f; 
private float verticleAngle = 0.0f; 

public Game() { 
    Mouse.setGrabbed(true); 
    camera = new Vector3f(0.0f, 0.0f, 0.0f); 
} 

public void input(){ 
    horizontalAngle += Mouse.getDX() * 0.05f; 
    verticleAngle += -Mouse.getDY() * 0.05f; 

    if(Keyboard.isKeyDown(Keyboard.KEY_W)){ 
     camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle)); 
     camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle)); 
    } 
    if(Keyboard.isKeyDown(Keyboard.KEY_S)){ 
     camera.x += moveSpeed * Math.sin(Math.toRadians(horizontalAngle)); 
     camera.z -= moveSpeed * Math.cos(Math.toRadians(horizontalAngle)); 
    } 
    if(Keyboard.isKeyDown(Keyboard.KEY_A)){ 
     camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle - 90)); 
     camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle - 90)); 
    } 
    if(Keyboard.isKeyDown(Keyboard.KEY_D)){ 
     camera.x -= moveSpeed * Math.sin(Math.toRadians(horizontalAngle + 90)); 
     camera.z += moveSpeed * Math.cos(Math.toRadians(horizontalAngle + 90)); 
    } 

    if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE)){ 
     Mouse.setGrabbed(false); 
    } 
} 

public void update(){ 

} 

public void render() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // draw quad 

    glTranslatef(camera.x, camera.y, camera.z); 
    glRotatef(verticleAngle, 1.0f, 0.0f, 0.0f); 
    glRotatef(horizontalAngle, 0.0f, 1.0f, 0.0f); 


    glBegin(GL_QUADS); 

    glColor3f(1.0f, 0.5f, 0.5f); 
    glVertex3f(0.0f, 0.0f, -5.0f); 
    glVertex3f(1.0f, 0.0f, -5.0f); 
    glVertex3f(1.0f, 1.0f, -5.0f); 
    glVertex3f(0.0f, 1.0f, -5.0f); 

    glEnd(); 


    glRotatef(-horizontalAngle, 0.0f, 1.0f, 0.0f); 
    glRotatef(-verticleAngle, 1.0f, 0.0f, 0.0f); 
    glTranslatef(-camera.x, -camera.y, -camera.z); 

    Display.sync(60); 
    Display.update(); 
} 

Я использую LWJGL с Java.

ответ

3

Для поворота камеры необходимо два вектора: один для положения камеры (u), другой для ориентации камеры (v) (длина v не имеет значения). Затем используйте gluLookAt(u.x, u.y, u.z, u.x+v.x, u.y+v.y, u.z+v.z, 0.0, 1.0, 0.0), то есть камера находится в позиции u, глядя в точку u + v, а вектор для направления вверх (0,1,0).

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