【问题标题】:OpenGL Move camera around pointOpenGL围绕点移动相机
【发布时间】:2019-04-16 07:28:51
【问题描述】:

我使用glm::lookAt 函数从眼睛、目标和向上向量初始化相机类,然后从glm::yaw 获得Yaw、Pitch 和Roll 值等等。 我制作了一个旋转方法,使用xoffsetyoffset 将相机围绕其目标点旋转。

void ThirdPersonCamera::Rotate(float _yaw, float _pitch) {
    view.yaw += _yaw;
    view.pitch += _pitch;
    float radius = glm::length(view.GetEye() - view.GetTarget());
    view.GetEye().x = glm::cos(glm::radians(view.yaw)) * glm::cos(glm::radians(view.pitch)) * radius;
    view.GetEye().y = glm::sin(glm::radians(view.pitch)) * radius;
    view.GetEye().z = glm::sin(glm::radians(view.yaw)) * glm::cos(glm::radians(view.pitch)) * radius;
    view.init();
}

view.init()lookAt 创建视图矩阵。 问题在于,对于第一次旋转,眼睛的 X 和 Z 值会被交换,因此相机会从它的位置跳到另一个位置,例如,如果相机在 (0,10,10) 处初始化,那么在第一次移动后,眼睛会变为 (10 ,10,0) 那么它工作正常。

【问题讨论】:

  • 是的,我知道,那么计算出了什么问题?初始化后,我尝试从视图矩阵的逆矩阵中获取 Yaw 和 Pitch,但 Y 为负数。

标签: c++ opengl rotation glm-math euler-angles


【解决方案1】:

很明显,glm::yaw() 等等并不能满足你的需要。你需要你的眼睛计算的倒数。那就是:

auto d = eye - target;
yaw = std::atan2(d.z, d.x);
pitch = std::asin(d.y / glm::length(d));

对于最后一行,确保asin 的参数保持在[-1, 1] 内。浮点数不准确可能会产生超出此范围的参数。

【讨论】:

  • 已解决,谢谢
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2012-12-10
  • 2014-07-31
相关资源
最近更新 更多