Como posso fazer meu rato controlar a câmera como um FPS usando OpenGL / SDL?

votos
1

Eu criei esta demonstração básica 3D usando OpenGL / SDL. Eu segurei o retorno do teclado para que eu possa metralhar esquerda e direita usando 'a' e 's' e mover-se para frente e para trás usando 's' e 'w'.

No entanto, eu gostaria de fazer agora para que eu possa controlar a direção minha câmera está olhando baseado fora meus movimentos do mouse. Assim como em um jogo de tiro FPS quando você move o mouse em torno dela torna a câmera olhar ao redor em várias direções.

Alguém tem alguma idéia de como eu poderia utilizar os retornos do mouse para pontos a classe câmera corretamente quando eu mover o mouse?

#include SDL.h
#include Camera.h

Camera cam;
Scene scn;

//<<<<<<<<<<<<<<<<<myKeyboard>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
void myKeyboard(unsigned char key, int x, int y)
{
  switch(key)
    {
    case 's': cam.slide(0.0, 0.0, 0.2); break;
    case 'w': cam.slide(0.0, 0.0, -0.2); break;
    case 'a': cam.yaw(-1.0); break;
    case 'd': cam.yaw(1.0); break;


    case 27: exit(0);
    }
  glClear(GL_COLOR_BUFFER_BIT);
  glutPostRedisplay();
}

void displaySDL( void )
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
    scn.drawSceneOpenGL();
    glFlush();
    glutSwapBuffers();
}

int main( int argc, char* argv[] )
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(640, 480);
    glutInitWindowPosition(100, 100);
    glutCreateWindow(SDL Sence With Camera);
    glutKeyboardFunc(myKeyboard);
    glutDisplayFunc(displaySDL);
    glShadeModel(GL_SMOOTH);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_NORMALIZE);
    glViewport(0, 0, 640, 480);
    scn.read(fig5_63.dat);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    scn.makeLightsOpenGL();

    cam.set(2.3, 1.3, 2.0, 0, 0.25, 0, 0, 1, 0);
    cam.setShape(30.0f, 64.0f/48.0f, 0.5f, 50.0f);

    glutMainLoop();
    return 0;
}

Este é um tar com meu arquivo SDL, eo arquivo colei acima e minha classe Camera. http://www.filedropper.com/fpsdemotar

Se alguém pode me dar algumas dicas para o que algoritmo devo usar ao processar chamadas de retorno do mouse em termos de apontar a câmera eu apreciaria.

Obrigado!

Publicado 24/04/2009 em 02:58
fonte usuário
Em outras línguas...                            


1 respostas

votos
4

Rato mover-se para cima / baixo -> campo, rato mover-se para a direita / esquerda -> guinada.

Eu não acredito que ter o seu 'a' e as teclas 'd' ser guinada é preciso.

Na verdade, a sua configuração toda é um pouco estranho para mim, já que do ponto de vista geométrico, eu ver a coordenar como (x, y, z). Você define s e w para ir "para cima" e "para baixo" (z), em vez de "forward" e "back" (y). Eu vejo isso como um gráfico xy que foi definido em uma mesa plana e você está olhando para ele de cima. Movendo-se para perto diminui z, que está a sair do avião.

Aqui está como eu gostaria que fosse configuração:

w -> slide(0, 0.2, 0); // y
s -> slide(0, -0.2, 0);
a -> slide(-0.2, 0, 0); // x
d -> slide(0.2, 0, 0);

//The following goes in your mouse event handler or something:
pitch(newMouseLocation.y - oldMouseLocation.y); // mouse y is related to pitch
yaw(newMouseLocaiton.x - oldMouseLocation.x); // mouse x is related to yaw

Sei que você não precisa seguir esta convenção coordenar, mas ele só parece mais intuitivo para mim.

Eu espero que isso ajude.

Respondeu 24/04/2009 em 03:11
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more