Как с помощью OpenGL / SDL заставить мышь управлять камерой, как FPS?

Я создал эту базовую 3D-демонстрацию, используя OpenGL / SDL. Я обработал обратный вызов клавиатуры, чтобы я мог перемещаться влево и вправо, используя «a» и «s», и двигаться вперед и назад, используя «s» и «w».

Однако сейчас я хотел бы сделать это так, чтобы я мог контролировать направление, в котором смотрит моя камера, на основе движений мыши. Как и в шутере FPS, когда вы перемещаете мышь, камера смотрит в разные стороны.

Кто-нибудь знает, как я могу использовать обратные вызовы мыши, чтобы правильно указывать класс камеры при перемещении мыши?

#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;
}

Это tar с моим файлом SDL, файлом, который я вставил выше, и моим классом Camera. http://www.filedropper.com/fpsdemotar

Если кто-то может дать мне несколько советов о том, какой алгоритм мне следует использовать при обработке обратных вызовов мыши с точки зрения наведения камеры, я был бы признателен.

Спасибо!


person KingNestor    schedule 24.04.2009    source источник


Ответы (1)


Мышь движется вверх / вниз -> шаг, мышь движется вправо / влево -> рыскание.

Я не верю, что ваши клавиши «a» и «d» будут отклоняться от курса.

На самом деле, вся ваша установка для меня немного странна, поскольку с геометрической точки зрения я рассматриваю координаты как (x, y, z). Вы устанавливаете s и w для перехода «вверх» и «вниз» (z) вместо «вперед» и «назад» (y). Я вижу это как график xy, установленный на столе, и вы смотрите на него сверху. При приближении к нему уменьшается z, выходящий из плоскости.

Вот как я бы это настроил:

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

Я понимаю, что вам не нужно следовать этому соглашению о координатах, но мне оно кажется более интуитивным.

Надеюсь, это поможет.

person CookieOfFortune    schedule 24.04.2009
comment
Спасибо за ваш вклад CookieOfFortune. Некоторые руководства, на которые я наткнулся, предлагают центрировать мышь по центру экрана. Как ты думаешь, я должен это делать или нет? - person KingNestor; 24.04.2009
comment
Одна вещь, которую я обдумывал, заключалась в том, что каждый обратный вызов мыши обрабатывает шаг, рыскание, как вы предлагаете, а затем заставляет мышь перемещаться обратно в центр, чтобы вы никогда не достигли уступа. Что вы думаете? - person KingNestor; 24.04.2009
comment
Хммм ... mousemove перестает регистрировать изменение, если попадает в край? Если это так (а я верю, что это так), тогда да, вы должны центрировать мышь (но только если у вас есть фокус !!, не хотите, чтобы кто-то использовал Alt-Tab, а затем не мог двигать своей мышью! ). - person CookieOfFortune; 24.04.2009