如何使OpenGL相机旋转360度

How can I make my OpenGL camera turn 360 degrees

本文关键字:旋转 360度 相机 OpenGL 何使      更新时间:2023-10-16

我目前正在进行实体移动,但我注意到相机只有大约180度的"视野",不会转过这个位置。试图在达到阈值后转动或其他什么,会使相机转动得很慢,而且需要很长时间才能返回。我希望能够360度环游世界。这可能吗?我有一个演示的短gif

gif快结束时,很明显,动作开始放缓并停止。

如果有人能帮我解决这背后的数学问题,或者为什么会发生这种情况,我将不胜感激。我在网上查了一下,找不到任何相关的东西。

    case GLUT_KEY_LEFT:
        base->camera->angle += 3.0f;
        break;
    case GLUT_KEY_RIGHT:
        base->camera->angle -= 3.0f;
        break;

camera->lookat->z = sin(camera->angle);
camera->lookat->x = cos(camera->angle);

gluLookAt(camera->position->getX(), camera->position->getY(), camera->position->getZ(),
            camera->lookat->getX(), camera->lookat->getY(), camera->lookat->getZ(),
            camera->up->getX(), camera->up->getY(), camera->up->getZ());//camera

您的计算需要考虑相机的位置。

由于你试图使相机围绕其位置旋转,你需要:

camera->lookat->z = camera->position->getZ() + sin(camera->angle);
camera->lookat->x = camera->position->getX() + cos(camera->angle);

您需要使用三角法,还需要更改所查看的x坐标。看看单位圆。当你增加或减少x坐标时,你离x=0线越来越近。要想真正看到你身后,你需要改变你所看到的y坐标。

因此,在OpenGL中,这意味着保持一个角度,即你所观察的方向。在你的事件循环中,你会更新它:

case GLUT_KEY_LEFT:
    camera->angle_look_at -= 5; // 5 is a totally random value.
                        // You can choose something more appropriate
    break;
case GLUT_KEY_RIGHT:
    camera->angle_look_at += 5;
    break;

当你调用gluLookAt时,你应该使用这个角度来生成你所看到的坐标

x = sin(camera->angle_look_at);
y = 0; // Or any other number.
z = cos(camera->angle_look_at);
gluLookAt(..., x, y, z, ...);

一旦你开始向上和向下看,你也可以使用同样的方法,保持垂直的角度。