C++ 窗口坐标到摄影机角度?
所以我想用四元数和角度来控制我的相机使用我的鼠标 我按如下方式累积垂直/水平角度:C++ 窗口坐标到摄影机角度?,c++,opengl,glm-math,C++,Opengl,Glm Math,所以我想用四元数和角度来控制我的相机使用我的鼠标 我按如下方式累积垂直/水平角度: void Camera::RotateCamera(const float offsetHorizontalAngle, const float offsetVerticalAngle) { mHorizontalAngle += offsetHorizontalAngle; mHorizontalAngle = std::fmod(mHorizontalAngle, 360.0f);
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);
}
Vec3 Camera::Forward() const
{
return Vec3(glm::inverse(Orientation()) * Vec4(0.0f, 0.0f, -1.0f, 0.0f));
}
然后像这样计算我的方向:
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);
}
Vec3 Camera::Forward() const
{
return Vec3(glm::inverse(Orientation()) * Vec4(0.0f, 0.0f, -1.0f, 0.0f));
}
还有前向向量,我需要glm::lookAt,如下所示:
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);
}
Vec3 Camera::Forward() const
{
return Vec3(glm::inverse(Orientation()) * Vec4(0.0f, 0.0f, -1.0f, 0.0f));
}
我认为应该这样做的技巧,但我不知道如何在我的示例游戏中获得实际角度?我只知道鼠标在窗口坐标中的当前位置和上一个位置。。我怎样才能从中得到合适的角度
编辑:再想想。。我的“RotateCamera()”不可能是对的;我正在经历橡皮筋的影响,由于角度重置后达到360度deegres。。。那么如何正确地累积角度呢?我可以无休止地总结它们取视锥体的横截面(蓝色圆圈是您的鼠标位置):
- θ是你视野的一半
- p是投影平面距离(别担心,它会抵消)
其中A是您的纵横比(宽/高)取视锥台的横截面(蓝色圆圈是您的鼠标位置):
- θ是你视野的一半
- p是投影平面距离(别担心,它会抵消)
其中A是您的纵横比(宽/高)取视锥台的横截面(蓝色圆圈是您的鼠标位置):
- θ是你视野的一半
- p是投影平面距离(别担心,它会抵消)
其中A是您的纵横比(宽/高)取视锥台的横截面(蓝色圆圈是您的鼠标位置):
- θ是你视野的一半
- p是投影平面距离(别担心,它会抵消)
其中A是你的纵横比(宽/高)@MichaelIV住手,你让我脸红了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影——它有助于图形程序员理解背后的数学原理。确切地说,没有多少人试图以如此详细的方式解释这些东西:)