C++ 如何使用gluLookAt在OpenGL中围绕点旋转摄影机视图
我试图使用gluLookAt函数为相机的位置和方向设置正确的视图变换。在我的程序中,有一个以原点为中心的球体,当按下箭头键时,相机围绕球体移动(左、右、上、下) 我尝试使用此转换: gluLookAt(xc,yc,zc,0.0,0.0,0.0,0.0,1,0,0,0) 为了验证它的正确性,我打印了三个轴。它似乎不能正常工作。当我上下移动时,y轴似乎没有移动C++ 如何使用gluLookAt在OpenGL中围绕点旋转摄影机视图,c++,c,opengl,opengl-compat,C++,C,Opengl,Opengl Compat,我试图使用gluLookAt函数为相机的位置和方向设置正确的视图变换。在我的程序中,有一个以原点为中心的球体,当按下箭头键时,相机围绕球体移动(左、右、上、下) 我尝试使用此转换: gluLookAt(xc,yc,zc,0.0,0.0,0.0,0.0,1,0,0,0) 为了验证它的正确性,我打印了三个轴。它似乎不能正常工作。当我上下移动时,y轴似乎没有移动 您能帮助理解该转换的错误吗?常量up向量错误 当您的xc=0,yc=?,zc=0(即您在y轴上/下移动)时,您的上方向向量与视图方向(反)平
您能帮助理解该转换的错误吗?常量
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
这是两个向量之间允许的最大角度差