【问题标题】:OpenGL - first person cameraOpenGL - 第一人称相机
【发布时间】:2012-12-18 15:50:16
【问题描述】:

恐怕我在尝试在 OpenGL 中实现第一人称相机时遇到Gimbal lock

rotateFPS_OY(float angle){
    forward = forward * cos(angle) + right * sin(angle);
    right = forward.CrossProduct(up);

}
rotateFPS_OX(float angle){
    up = up * cos(angle) + forward * sin(angle); 
    forward = up.CrossProduct(right);
}

稍后,我调用 gluLookAt:

    Vector3D center = position + forward;
    gluLookAt(position.x, position.y, position.z, 
              center.x, center.y, center.z,
              up.x, up.y, up.z);

在测试这一点时,似乎在几次移动后,相机滚动(改变了正确的矢量)。计算似乎是正确的,我就是不知道哪里出了问题。

【问题讨论】:

    标签: opengl


    【解决方案1】:

    计算后归一化向量

    【讨论】:

    • 为什么 up = up * cos(angle) + forward * sin(angle);forward = up.CrossProduct(right)?;可能是 forward=forwadcos+upsin;up=forwardXright;但没有解决。
    • 这种方式也行不通,它实际上将图像向后翻转,仍然具有滚动效果。
    • 哦。不要向上旋转。围绕 (0,0,1) 旋转。
    • 请您解释一下我该怎么做?
    • f1.x=f.xcos-f.ysin;f1.y=f.xsin+f.ycos;f1.z=f.z; f=f1; f 向前;权利相同;上=右Xforward;仅更改 rotateFPS_OY
    【解决方案2】:

    通过将 forward.y 和 right.y 保持为 0 并独立于 forward/right/up 向量计算 lookAt 向量,我成功地实现了相机。

    【讨论】:

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