Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 窗口坐标到摄影机角度?_C++_Opengl_Glm Math - Fatal编程技术网

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是投影平面距离(别担心,它会抵消)
从简单的比率可以看出:

但是从简单的三角测量

所以

只需计算每个鼠标位置的角度psi,然后减去即可得到差值

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


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

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

  • θ是你视野的一半
  • p是投影平面距离(别担心,它会抵消)
从简单的比率可以看出:

但是从简单的三角测量

所以

只需计算每个鼠标位置的角度psi,然后减去即可得到差值

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


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

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

  • θ是你视野的一半
  • p是投影平面距离(别担心,它会抵消)
从简单的比率可以看出:

但是从简单的三角测量

所以

只需计算每个鼠标位置的角度psi,然后减去即可得到差值

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


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

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

  • θ是你视野的一半
  • p是投影平面距离(别担心,它会抵消)
从简单的比率可以看出:

但是从简单的三角测量

所以

只需计算每个鼠标位置的角度psi,然后减去即可得到差值

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


其中A是你的纵横比(宽/高)

@MichaelIV住手,你让我脸红了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影-它有助于图形程序员理解所有背后的数学。确切地说,没有多少人试图如此详细地解释这些东西:)@MichaelIV住手,伙计,你让我发火了。。。不,这真的只是证明(反向)透视投影——它有助于图形程序员理解背后的数学原理。确切地说,没有多少人试图以如此详细的方式解释这些东西:)