【问题标题】:OpenGL application rotate CameraOpenGL 应用程序旋转相机
【发布时间】:2014-12-24 12:48:16
【问题描述】:

我正在尝试实现一个简单的应用程序,在该应用程序中,用户可以通过更改 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轴旋转的代码实现如下: 浮动 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 轴进行一些反向旋转?如果是这样,旋转所需的角度值是多少?

【问题讨论】:

    标签: opengl rotation graphical-programming


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多