0

我正在尝试实现一个简单的应用程序,在该应用程序中,用户可以通过更改 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 轴旋转时,我没有得到想要的行为。我想“向上”和“向下”旋转相机,但要朝我当时所处的特定方向旋转。绕x轴旋转的代码实现如下: float d1 = cy - eyey; 浮动 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 轴进行一些反向旋转?如果是这样,旋转所需的角度值是多少?

4

1 回答 1

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);
于 2014-12-25T01:27:51.417 回答