0

我最近用 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 围绕相机轴旋转?谢谢。

4

1 回答 1

0

你所做的是先翻译然后旋转。

旋转相机,平移相机,然后绘制场景。旋转始终围绕原点应用,因此如果先旋转然后平移,则应用旋转,然后平移旋转的参考系。

出于类似的原因,您还应该颠倒俯仰和偏航的顺序。

你还应该限制俯仰,这样你向上或向下旋转的角度不会超过 90 度,否则可能会迷失方向。

此外,除非您在任意轴上应用旋转,否则四元数不是必需的。

于 2013-01-26T23:39:27.193 回答