【问题标题】:How can I make my OpenGL camera turn 360 degrees如何让我的 OpenGL 相机旋转 360 度
【发布时间】:2015-04-05 00:01:45
【问题描述】:

我目前正在处理我的实体移动,但我注意到相机只有约 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

【问题讨论】:

  • 你如何转动相机?
  • 您的摄像头位置是否在 (0,0,0)?

标签: c++ opengl camera


【解决方案1】:

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

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

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

【讨论】:

  • 这很好用,非常感谢!除了在不同的轴上之外,上下转动相机的概念是否相同?
  • 是的。您的原始代码是使相机瞄准远离相机某处的圆周运动点。这就像看着一只狗在房间的某个地方转圈跑——你可以一直看着这只狗,而不用看你的身后。你真正想要的是让狗绕着你转圈,然后转身跟着它。
  • 我现在明白了,谢谢!由于 sin 和 cos 用于 z 和 x 轴,tan 是否可以用于 y 上下查找?
  • 对不起,不,这只是考虑相机位置的原则仍然适用。当您围绕单个轴旋转时,只需跟踪单个角度即可计算向左或向右添加旋转的含义非常简单。全三维旋转是一个复杂得多的话题。
【解决方案2】:

您需要使用三角函数,并且您还需要更改您查看的 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, ...);

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

【讨论】:

  • 这似乎不起作用。我应该更改 gluLookAt 函数吗?当我尝试在游戏循环中设置方向时,它试图移动但随后又将其自身设置回来。 i.gyazo.com/ed09fa47ad0929077cdd9e471657d3ca.gif
  • 如果 camera->lookat->z 和 x 被传递给 gluLookAt 那么你应该没问题。角度变量是否在某处被重置?它可能应该是您的相机类的成员,因为它需要保留。
  • 是的,它是我的相机课程的成员,我不认为它正在重置。 sin(角度)有问题吗?因为我已经打印出这些值并且它们永远不会超过 1。我已经编辑了我的帖子以现在显示我的代码
  • 不,它应该是这样工作的。再看看单位圆。你的相机是那个圆圈的中心。当您围绕该圆圈旋转时,您看到的坐标会发生变化。当角度为 0 时,您的 x 值为 1,您的 y 值为 0。随着角度的增加,您的 x 值减小,y 值增加。一旦角度为 90 度,x = 0 且 y = 1。然后情况会发生变化。 x 继续减少,但 y 停止增加并改为减少。 sin 和 cos 是 x 和 y 坐标的函数。要记住的重要一点是,这些函数不是线性的。
  • 这会如何影响 Z 轴?我现在只想绕一个轴旋转,作为 Z,所以我可以有旋转 360 度的效果
猜你喜欢
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2020-07-05
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
相关资源
最近更新 更多