如何让我的OpenGL相机旋转360度

时间:2015-04-05 00:01:46

标签: c++ opengl camera

我正在研究我的实体运动,但我注意到相机只有~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

2 个答案:

答案 0 :(得分:3)

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

由于您试图让相机绕其位置旋转,您需要:

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

答案 1 :(得分:0)

您需要使用三角函数,并且还需要更改您查看的x坐标。看看unit circle。当你增加或减少你的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, ...);

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