Я недавно начал openGL с C ++. У меня нет такого большого опыта в C ++, но хороший опыт в другом языке.
В настоящее время я работаю над управлением стилем FPS камеры, чтобы начать маленькую игру и добавлять что-то одно за другим, пока я учусь. Я знаю, что этот вопрос часто задавался, и я прочитал много учебника / форума.
Я хорошо с gluLookAt (); но я видел, что это не лучший способ управления камерой FPS. Я работал с матричным стеком в последнее время, и я немного потерян.
У меня работает код, но мой поворот, кажется, вокруг центральной оси или что-то в этом роде. Я также получаю странный контроль, который может быть связан с блокировкой подвеса. Я имею опыт работы с ними и буду использовать их, как только у меня будет что-то хорошее.
Я пытался сохранить самый важный код и оставить все остальное, рендер и основной. Элементы управления мышью и клавиатурой работают по назначению:
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? Благодарю.
Что вы сделали, это перевести, а затем повернуть.
Поверните камеру, переведите камеру, а затем нарисуйте сцену. Вращение всегда применяется вокруг начала координат, поэтому, если вы поворачиваете и затем переводите, вы применяете вращение, а затем переводите повернутую систему отсчета.
Вы должны также изменить порядок шага и рыскания по тем же причинам.
Вам также следует ограничить высоту звука таким образом, чтобы вы не поворачивались более чем на 90 градусов вверх или вниз, иначе это может привести к дезориентации.
Кроме того, кватернионы не нужны, если вы не применяете повороты на произвольной оси.
Других решений пока нет …