gpt4 book ai didi

c++ - OpenGL 围绕点移动相机

转载 作者:行者123 更新时间:2023-11-28 04:29:41 25 4
gpt4 key购买 nike

我使用 glm::lookAt 函数从眼睛、目标和向上 vector 初始化相机类,然后从 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 创建 View 矩阵。问题是,对于第一次旋转,眼睛的 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] 内。 float 不准确可能会产生超出此范围的参数。

关于c++ - OpenGL 围绕点移动相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53281436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com