所以我想使用四元数和角度来控制我的相机使用鼠标。
我像这样积累垂直/水平角度:
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度后重新设定,我正在经历橡皮筋效应...所以如何正确地积累角度?我可以无休止地总结它们
答案 0 :(得分:3)
截取视锥体的横截面(蓝色圆圈是您的鼠标位置):
从简单的比例可以看出:
但是从简单的三位一体
所以......
只需为每个鼠标位置计算角度 psi ,然后减去以获得差异。
可以找到垂直角度的类似公式:
其中A是您的宽高比(宽度/高度)