所以我想使用四元数和角度来使用鼠标控制我的相机。
我像这样累积垂直/水平角度:
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 度后重置,我遇到了橡皮筋效应......那么我如何正确地累积角度?我可以无休止地总结它们
最佳答案
截取视锥的横截面(蓝色圆圈是您的鼠标位置):
- Theta 是您 FOV 的一半
- p 是您的投影平面距离(别担心 - 它会抵消)
从简单的比率可以清楚地看出:
但是从简单的三角学
所以...
只需计算每个鼠标位置的角度 psi 并减去差值即可。
可以找到垂直角的类似公式:
A 是纵横比(宽度/高度)
关于c++ - 窗口坐标到摄像机角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23142354/