gpt4 book ai didi

c++ - 旋转精度误差增长太快?

转载 作者:行者123 更新时间:2023-11-30 01:35:39 24 4
gpt4 key购买 nike

当一个接一个地应用旋转时,精度误差会累积。

但我对错误累积的速度感到惊讶。

在这个例子中,我比较了理论上等价的 2 个转换。

在实践中,我只旋转 2 圈而不是旋转 1 圈,得到 0.02 度的误差。

我原以为错误会更低。

有没有办法让这2个转换的结果更接近?除了使用 double 变量。

#include <glm/gtx/rotate_vector.hpp>

double RadToDeg(double rad)
{
return rad * 180.0 / M_PI;
}

const glm::vec3 UP(0, 0, 1);

void CompareRotations()
{
glm::vec3 v0 = UP;
glm::vec3 v1 = glm::normalize((glm::vec3(0.0491, 0.0057, 0.9987)));
glm::vec3 v2 = glm::normalize((glm::vec3(0.0493, 0.0057, 0.9987)));

glm::vec3 axis_0_to_1 = glm::cross(v0, v1);
glm::vec3 axis_1_to_2 = glm::cross(v1, v2);
glm::vec3 axis_global = glm::cross(v0, v2);

float angle_0_to_1 = RadToDeg(acos(glm::dot(v0, v1)));
float angle_1_to_2 = RadToDeg(acos(glm::dot(v1, v2)));
float angle_global = RadToDeg(acos(glm::dot(v0, v2)));

glm::vec3 v_step = UP;
v_step = glm::rotate(v_step, angle_0_to_1, axis_0_to_1);
v_step = glm::rotate(v_step, angle_1_to_2, axis_1_to_2);

glm::vec3 v_glob = UP;
v_glob = glm::rotate(v_glob, angle_global, axis_global);

float angle = RadToDeg(acos(glm::dot(v_step, v_glob)));
if (angle > 0.01)
{
printf("error");
}
}

最佳答案

如果您只想继续沿同一轴旋转,那么最好只增加围绕该轴的旋转角度,并每次都从该角度重新计算一个新矩阵。注意可以直接compute a matrix for rotation around an arbitrary axis .例如,从欧拉角构建旋转通常既不是必需的,也不是很好的解决方案(奇点、数值上不理想、行为不是很直观)。 glm::rotate() 有一个重载,它接受一个轴和一个角度,您可以为此使用。

如果您真的必须围绕任意轴串联许多任意旋转,那么使用四元数来表示您的旋转可能在数值上更稳定。由于您已经在使用 GLM,您可以只使用 quaternions在那里。你可能会发现 this tutorial有用。

关于c++ - 旋转精度误差增长太快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53641340/

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