【问题标题】:OpenGL camera pitch, yaw and roll rotationOpenGL 摄像机俯仰、偏航和滚动旋转
【发布时间】:2013-02-18 22:15:38
【问题描述】:

我正在尝试创建一个类来控制 OpenGL 中的相机。 我有三种方法可以改变相机的俯仰偏航和滚动。 这些方法采用浮点参数作为要添加的旋转量。

这些方法中的代码是我需要帮助的地方。旋转存储在 Vector3 中。 到目前为止,我有改变音高的方法:

void changePitch(float degrees)
{
    float rads = MathHelp::degreesToRadians(degrees);
    m_rotation.x += cos(m_rotation.y) * rads;
}

这是我自己能做到的。它有点工作,相机在向上或向下看 z 轴时向上和向下看,而不是在向下看 x 轴时。我尝试添加 z 旋转:

m_rotation.z += sin(m_rotation.y) * rads;

但这并不顺利。

【问题讨论】:

  • 在进入三角函数之前,必须应用从度数到弧度的转换。不乘以 sin、cos 或 tan 的结果。
  • 角度以弧度形式存储在向量中。
  • 所以? rads 是一个常数,要乘以进入 sin 的角度,而不是乘以它的结果,即 ``cos(m_rotation.y * rads)` - 但是你不能简单地“添加”旋转。这根本不是它的工作原理。旋转的串联是乘法的。
  • rads 是参数(浮点度)到弧度的转换。这是要转的金额。
  • 如果这样更容易理解,此方法将用于将音高更改给定的度数。

标签: c++ opengl camera rotation trigonometry


【解决方案1】:

假设您有指向上方的upVectorlookAtVectorrightVector 3D 向量,并查看相机的方向和右侧。然后,要正确增加音高,您应该按如下方式进行计算:

void changePitch(angle) {
    angle = DegreeToRadian(angle);

    // Rotate lookAtVector around the right vector
    // This is where we actually change pitch
    lookAtVector = Normalize3dVector(viewDir * cos(angle) + UpVector * sin(angle));

    // Now update the upVector
    upVector = CrossProduct(rightVector, lookAtVector);
}

在上面的摘录中,任意使用的函数的名称是不言自明的。

【讨论】:

  • 啊,好吧,这对我来说很有意义。我稍后会试一试!
  • 如何将这些添加到最终的相机矩阵以应用旋转?
  • 但是什么是“viewDir”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
相关资源
最近更新 更多