我最近用 C++ 开始了 openGL。我在 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 围绕相机轴旋转?谢谢。