【问题标题】:How to rotate the camera view around a point in OpenGL with gluLookAt如何使用 gluLookAt 围绕 OpenGL 中的一个点旋转相机视图
【发布时间】:2020-01-26 06:35:12
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ c opengl opengl-compat


    【解决方案1】:

    常量up 向量错误!

    当您的xc=0,yc=?,zc=0(即当您在 y 轴上向上/向下移动时)时,您的向上向量与您的视图方向(反)平行,这意味着 gluLookAt 无法使用叉积创建 3 个垂直基向量它需要构建transform matrix

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

    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
    

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

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多