c++ - 窗口坐标到摄像机角度?

标签 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);
}

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

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

我认为这应该可以解决问题,但我不知道在我的示例游戏中如何获得实际角度?我所拥有的只是窗口坐标中当前和先前的鼠标位置。我怎样才能从中获得正确的角度?

编辑:再想想......我的“RotateCamera()”不可能是对的;由于角度在达到 360 度后重置,我遇到了橡皮筋效应......那么我如何正确地累积角度?我可以无休止地总结它们

最佳答案

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

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 是纵横比(宽度/高度)

关于c++ - 窗口坐标到摄像机角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142354/

相关文章:

macos - 使用GLFW库的Mac OSX 10.9上的OpenGL 3.3/4.1

c++ - OpenGL Vertexbuffer对象纹理坐标

math - glm::normalize 有什么作用?

c++ - 从 Assimp 加载 Collada (dae) 模型显示法线不正确

c++ - 当我的项目在 Visual Studio 和 Qt Creator 中构建时,Q_ASSERT 具有不同的行为

c++ - 如何获取取消引用的 std::map 迭代器的类型?

c++ - 如何强制不在 C++ 中使用转换构造函数

c++ - 了解用于运算符重载的 C++03 标准语法

c++ - 如何为不同的类设置 glfwSetKeyCallback?

c++ - 在 GLM 中旋转模型