OpenGL应用程序旋转相机

时间:2014-12-24 12:48:17

标签: opengl rotation graphical-programming

我试图实现一个简单的应用程序,用户可以通过更改gluLookAt函数的参数来查看自己。我通过以下方式围绕y轴实现了旋转:

float cx1;
float cz1;

float d1 = cx - eyex;
float d2 = cz - eyez;

cx1 = d2*sin(alfa*PI / 180) + d1*cos(alfa*PI / 180);
cz1 = d2*cos(alfa*PI / 180) - d1*sin(alfa*PI / 180);
yRotationAngle = yRotationAngle +alfa;

cx = cx1 + eyex;
cz = cz1 + eyez;

这很好用,但是当我试图围绕x轴旋转时,我没有得到所需的行为。我想旋转相机" up" " down"但在那个特定的方向,我在那一刻。围绕x轴旋转的代码按以下方式实现:     float d1 = cy - eyey;     float d2 = cz - eyez;

//rotate around x
cy1 = cos(angleToRotate) * d1 - sin(angleToRotate) * d2;
cz1 = sin(angleToRotate) * d1 + cos(angleToRotate) * d2;

cy = cy1 + eyey;
cz = cz1 + eyez;

在围绕x旋转之前,我是否需要围绕y轴进行一些反向旋转?如果是这样,旋转所需角度​​的值是多少?

1 个答案:

答案 0 :(得分:1)

第二次旋转的数学运算会稍微复杂一些,因为您想要相对于当前位置应用它。但是我认为如果你跟踪当前的角度,并且在旋转相机时加/减它们,你可以使整个事情变得更简单。基本上,您主要在球面坐标空间中操作,并且仅在应用旋转时计算笛卡尔坐标。

要做到这一点,你需要两个角度。我将使用以下命名法:

  • yawAng:围绕y轴的当前旋转角度,相对于z轴测量。
  • pitchAng:相对于xz平面的角度。积极向上(正y的方向,向下的负向)。

这样,基本的相机旋转只会变为这些角度的增量/减量。增量为angInc

  • 左:yawAng += angInc
  • 右:yawAng -= angInc
  • 向上:pitchAng += angInc
  • 向下:pitchAng -= angInc

然后,当应用gluLookAt()变换时,您可以使用标准公式将球面坐标转换为笛卡尔坐标。相机与中心之间的距离为d

cx = eyex + d * sin(yawAng) * cos(pitchAng);
cy = eyey + d * sin(pitchAng)
cz = eyez + d * cos(yawAng) * cos(pitchAng);