将相机分别移动到其位置

时间:2013-03-31 13:50:49

标签: c++ opengl freeglut sin cos

我认为这将简单明了,但事实并非如此。我在openGL应用程序中有一个摄像头,我正在将显示的图像分别转换为摄像机“位置”。位置由 Up Down 更改。可以使用 Left Right 旋转相机。旋转摄像机时,前进和后退运动应该不同。这就是我所做的:

  //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;
  }

原始轮播以度为单位,但sin()的{​​{1}}接受弧度。我在结果中加1,得到0-2之间的结果。然后,当我将结果除以2时,我将math.hsin幅度从2更改为1 这意味着 - 当摄像机以0度,90度,180度,270度或360度观看时,这些功能应返回0-1值。我是对的吗? 开头的0.5只是移动速度。

1 个答案:

答案 0 :(得分:0)

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

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

Direction  Angle    Vector   Your Vector  Actual Direction
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

请注意,您只能在一个象限中生成路线(因为您的结果总是正面的)并且它们都不是您想要的。