窗口坐标到摄像机角度?

时间:2014-04-17 19:58:42

标签: c++ opengl glm-math

所以我想使用四元数和角度来控制我的相机使用鼠标。

我像这样积累垂直/水平角度:

void Camera::RotateCamera(const float offsetHorizontalAngle, const float offsetVerticalAngle)
{
    mHorizontalAngle += offsetHorizontalAngle;
    mHorizontalAngle = std::fmod(mHorizontalAngle, 360.0f);

    mVerticalAngle += offsetVerticalAngle;
    mVerticalAngle = std::fmod(mVerticalAngle, 360.0f);
}

并像这样计算我的方向:

Mat4 Camera::Orientation() const
{
    Quaternion rotation;
    rotation = glm::angleAxis(mVerticalAngle, Vec3(1.0f, 0.0f, 0.0f));
    rotation = rotation * glm::angleAxis(mHorizontalAngle, Vec3(0.0f, 1.0f, 0.0f));

    return glm::toMat4(rotation);
}

和前向向量,我需要glm :: lookAt,像这样:

Vec3 Camera::Forward() const
{
    return Vec3(glm::inverse(Orientation()) * Vec4(0.0f, 0.0f, -1.0f, 0.0f));
}

我认为应该这样做,但我不知道在我的示例游戏中如何获得实际角度?我所拥有的只是窗口坐标中当前和之前的鼠标位置..我怎样才能从中得到合适的角度?

编辑:第二个想法......我的“RotateCamera()”不对;由于角度在达到360度后重新设定,我正在经历橡皮筋效应...所以如何正确地积累角度?我可以无休止地总结它们

1 个答案:

答案 0 :(得分:3)

截取视锥体的横截面(蓝色圆圈是您的鼠标位置):

enter image description here

  • Theta是你FOV的一半
  • p是您的投影平面距离(不用担心 - 它会取消)

从简单的比例可以看出:

enter image description here

enter image description here

enter image description here

但是从简单的三位一体

enter image description here

所以......

enter image description here

只需为每个鼠标位置计算角度 psi ,然后减去以获得差异。

可以找到垂直角度的类似公式:

enter image description here

其中A是您的宽高比(宽度/高度)