Come posso fare il mio controllo con il mouse la fotocamera come un FPS usando OpenGL, SDL?

StackOverflow https://stackoverflow.com/questions/784247

  •  16-09-2019
  •  | 
  •  

Domanda

Ho creato questo 3D di base Demo usando OpenGL, SDL.Ho gestito la tastiera richiamata così posso "strafe" di destra e di sinistra con 'a' e 's' e andare avanti e indietro con 's' e 'w'.

Tuttavia, vorrei ora fare così è possibile controllare la direzione in cui la mia macchina fotografica è "cerca" in base al largo i miei movimenti del mouse.Proprio come in un FPS sparatutto quando si sposta il mouse rende la fotocamera guardarsi intorno in varie direzioni.

Qualcuno ha qualche idea di come potrei utilizzare il mouse callback per "punti" la classe camera correttamente quando sposto il 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;
}

Questo è un tar con la mia SDL file, e il file che ho incollato sopra e la mia Macchina fotografica di classe.http://www.filedropper.com/fpsdemotar

Se qualcuno mi può dare alcuni consigli per cosa algoritmo dovrei usare durante l'elaborazione del mouse richiamate in termini di punta la fotocamera sarei grato.

Grazie!

È stato utile?

Soluzione

Il movimento del Mouse su/giù -> passo, il movimento del Mouse destra/sinistra -> imbardata.

Non credo di avere il vostro 'a' e 'd' chiavi di imbardata è accurata.

In realtà, tutto il tuo setup è un po ' strano per me, visto che da un punto di vista geometrico, le coordinate (x, y, z).È un insieme s e w per andare "su" e "giù" (z), invece di "in avanti" e "indietro" (y).Io la vedo come un grafico xy che è stato impostato piatto su un tavolo e si sono guardandolo dall'alto.Movimento vicino ad esso diminuisce z, che è venuta fuori dall'aereo.

Ecco come vorrei avere il programma di installazione:

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

Mi rendo conto che non è necessario seguire questa quota convenzione, ma sembra più intuitivo per me.

Spero che questo aiuta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top