Возникли проблемы при управлении камерой в стиле FPS

Я недавно начал openGL с C ++. У меня нет такого большого опыта в C ++, но хороший опыт в другом языке.

В настоящее время я работаю над управлением стилем FPS камеры, чтобы начать маленькую игру и добавлять что-то одно за другим, пока я учусь. Я знаю, что этот вопрос часто задавался, и я прочитал много учебника / форума.

Я хорошо с gluLookAt (); но я видел, что это не лучший способ управления камерой FPS. Я работал с матричным стеком в последнее время, и я немного потерян.

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

  • Почему я вращаюсь вокруг центральной оси вместо оси камеры?
  • Любое понимание того, как использовать glPopMatrix () и glPushMatrix () в контексте моего кода? Я понимаю функции, но не могу понять, как их использовать при управлении камерой.

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

void renderScene(void) {

if(init==1){
glTranslatef(0.0f,-1.0f,-5.0f);
init = 0;
}
// Clear Color and Depth BuffersWDW
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// Reset transformations
//glLoadIdentity();

// Set the camera

glTranslatef(-deltaStrafe,0,-deltaMove);
glRotatef(Pitch,1.0f,0.0f,0.0f);
glRotatef(Yaw,0.0f,1.0f,0.0f);

// Draw ground

glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-50.0f, 0.0f, -50.0f);
glVertex3f(-50.0f, 0.0f,  50.0f);
glVertex3f( 50.0f, 0.0f,  50.0f);
glVertex3f( 50.0f, 0.0f, -50.0f);
glEnd();

// Draw 36 SnowMan
for(int i = -3; i < 3; i++)
for(int j=-3; j < 3; j++) {
glPushMatrix();
glTranslatef(i*10.0,0,j * 10.0);
if(i==j){
drawSnowMan();
}
else{
drawTree();
}
glPopMatrix();
}

glutSwapBuffers();
printConsole();
}

и основная функция:

int main(int argc, char **argv) {

// init GLUT and create window
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(780,0);
glutInitWindowSize(800,800);
glutCreateWindow("Physic Engine");

// register callbacks
glutDisplayFunc(renderScene);
glutReshapeFunc(changeSize);
glutIdleFunc(renderScene);// OpenGL init
glEnable(GL_DEPTH_TEST);

// enter GLUT event processing cycle
glutMainLoop();

return 1;
}

Спасибо!

Изменить: Изменен порядок вращения / перевода, как предложено:

glRotatef(Yaw,0.0f,1.0f,0.0f);
glRotatef(Pitch,1.0f,0.0f,0.0f);
glTranslatef(-deltaStrafe,0,-deltaMove);

Однако моя камера не вращается вокруг своей оси. Кажется, что они вращаются вокруг центральной оси, и я нахожусь в положении (0,0,0), если я не двигаюсь. Как я могу вращаться вокруг оси камеры как стандартный FPS? Благодарю.

0

Решение

Что вы сделали, это перевести, а затем повернуть.

Поверните камеру, переведите камеру, а затем нарисуйте сцену. Вращение всегда применяется вокруг начала координат, поэтому, если вы поворачиваете и затем переводите, вы применяете вращение, а затем переводите повернутую систему отсчета.

Вы должны также изменить порядок шага и рыскания по тем же причинам.

Вам также следует ограничить высоту звука таким образом, чтобы вы не поворачивались более чем на 90 градусов вверх или вниз, иначе это может привести к дезориентации.

Кроме того, кватернионы не нужны, если вы не применяете повороты на произвольной оси.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]