首页 > 解决方案 > 如何使用 gluLookAt 围绕 OpenGL 中的一个点旋转相机视图

问题描述

我正在尝试使用 gluLookAt 函数为相机的位置和方向设置正确的视图转换。在我的程序中有一个以原点为中心的球体,当按下箭头键时,相机会根据(左、右、上、下)球体移动。

我尝试使用这种转换: gluLookAt(xc, yc, zc, 0.0, 0.0, 0.0, 0.0, 1,0, 0,0);

为了验证它的正确性,我打印了三个轴。它似乎无法正常工作。当我上下移动时,y 轴似乎没有移动。

你能帮助理解这种转变有什么问题吗?

标签: c++copenglopengl-compat

解决方案


常量up向量是错误的!

当您xc=0,yc=?,zc=0(即当您在 y 轴上向上/向下移动时)然后您的向上向量与您的视图方向(反)平行时,这意味着gluLookAt不能使用构建变换矩阵所需的叉积创建 3 个垂直基向量。

在这种情况下,向上向量应该不同......我通常使用点积

if (dot(a,b)/(|a|.|b|)>0.9)

检测接近(反)平行向量并在您的情况下设置不同的向量,其简化如下:

if (fabs(yc*yc)/(xc*xc+yc*yc+zc*zc)>(0.9*0.9)) use different up vector

您可以使用(+/-1,0,0)哪个(0,0,+/-1)符号和哪个符号取决于您的坐标系约定(因此您的视图在通过这个奇点时不会扭曲/镜像/旋转)。

0.9阈值意味着:

cos(da) = 0.9
da = acos(0.9)
da = 25.84 deg

这是两个向量之间允许的最大角度差...


推荐阅读