将相机分别移动到其位置

Posted

技术标签:

【中文标题】将相机分别移动到其位置【英文标题】:Moving camera respectively to its location 【发布时间】:2013-03-31 13:50:48 【问题描述】:

我认为这会简单明了,但事实并非如此。我在 openGL 应用程序中有一个摄像头,我正在将显示的图像分别转换为摄像头“位置”。 UpDown 改变位置。可以使用 LeftRight 旋转相机。当相机旋转时,向前和向后移动应该是不同的。这是我编造的:

  //Somewhere in event handler switch
  else if (key == GLUT_KEY_UP|| key == GLUT_KEY_DOWN) 
    char direction = key==GLUT_KEY_UP?1:-1;   //Whether it is forward or backward movement
    std::cout<<"Moving camera in direction "<<(int)direction<<" with angle "<<rotate_y<<'\n';
    std::cout<<" - this means X is multiplied by "<<((sin((rotate_y/180)*M_PI)+1)/2)<<'\n';
    camera_x += 0.5*((sin((rotate_y/180)*M_PI)+1)/2)*direction;
    camera_z += 0.5*((cos((rotate_y/180)*M_PI)+1)/2)*direction;
  

原始旋转以度为单位,但来自math.hsin() 接受弧度。我在结果中加 1 以获得 0-2 之间的结果。然后,当我将结果除以 2 时,我将 sincos 幅度从 2 更改为 1。 这意味着 - 当相机观察 0、90、180、270 或 360 度时,函数应返回 0-1 值。我说的对吗? 开头的0.5只是移动速度。

【问题讨论】:

【参考方案1】:

我认为您不希望 sin/cos 的输出在 0 - 1 范围内。

如果您尝试在特定方向生成运动矢量,则需要在原点周围生成一个圆圈中的点,这正是您在应用比例和偏移之前所拥有的。相反,您正在围绕点 0.5,0.5 生成一个圆圈,如果将其用作方向向量,则可能指向错误的方向:

方向角向量 你的向量 实际方向 N 0 0, 1 0.5, 1 ~NNE E 90 1, 0 1 , 0.5 ~ENE S 180 0, -1 0.5, 0 E W 270 -1, 0 0 , 0.5 N

请注意,您只能在一个象限中生成方向(因为您的结果始终为正),而且它们都不是您想要的。

【讨论】:

感谢您让我明白这一点。看来 OpenGL 世界有点扭曲,所以我不得不做sin(360-angle) 以获得想要的结果。

以上是关于将相机分别移动到其位置的主要内容,如果未能解决你的问题,请参考以下文章

如何将 DataTable 行移动到其 DataTable 的第一个位置

将 Google 地图相机移动到某个位置

Flutter Google Maps - 将相机移动到当前位置

如何停止位置光随相机移动

使相机随着位置的变化而移动(Google Maps Api)

使用camera.unproject重新渲染纹理会在相机移动时设置错误的位置