【问题标题】:Having trouble controling camera FPS style无法控制相机 FPS 风格
【发布时间】:2013-01-26 21:22:20
【问题描述】:

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

【问题讨论】:

  • 只是一个评论:如果您遇到云台锁定问题,请考虑使用四元数而不是欧拉角。

标签: c++ opengl camera frame-rate


【解决方案1】:

您所做的是先平移然后旋转。

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

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

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

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

【讨论】:

  • 嗨,我编辑了主要问题并提供了更多信息。我会注意角度限制,我想最终在任意轴上应用旋转,我喜欢四元数。谢谢!
猜你喜欢
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2012-01-17
相关资源
最近更新 更多