如何让我的 OpenGL 相机旋转 360 度
How can I make my OpenGL camera turn 360 degrees
我目前正在处理我的实体移动,但我注意到相机只有 ~180 度 "view",并且不会转过这个位置。尝试在达到阈值或其他任何原因后转动,会使相机转动得非常慢,并且需要很长时间才能 return。我希望能够 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
你需要用到三角函数,你也需要改变你看的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, ...);
一旦开始向上和向下看,您可以使用相同的方法,同时保持垂直角度。
您的注视计算需要考虑相机的位置。
由于您要使相机围绕其位置旋转,因此您需要:
camera->lookat->z = camera->position->getZ() + sin(camera->angle);
camera->lookat->x = camera->position->getX() + cos(camera->angle);
我目前正在处理我的实体移动,但我注意到相机只有 ~180 度 "view",并且不会转过这个位置。尝试在达到阈值或其他任何原因后转动,会使相机转动得非常慢,并且需要很长时间才能 return。我希望能够 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
你需要用到三角函数,你也需要改变你看的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, ...);
一旦开始向上和向下看,您可以使用相同的方法,同时保持垂直角度。
您的注视计算需要考虑相机的位置。
由于您要使相机围绕其位置旋转,因此您需要:
camera->lookat->z = camera->position->getZ() + sin(camera->angle);
camera->lookat->x = camera->position->getX() + cos(camera->angle);