繁体   English   中英

OpenGL在点附近移动相机

[英]OpenGL Move camera around point

我使用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),然后正常工作。

显然, glm::yaw()等无法满足您的需求。 您需要对计算进行逆运算。 那是:

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

对于最后一行,请确保asin的参数位于[-1, 1] 浮点数错误可能会导致超出此范围的论点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM