gpt4 book ai didi

c++ - 角度的 Slerp 插值结果为 -nan(ind)

转载 作者:行者123 更新时间:2023-11-30 03:35:41 26 4
gpt4 key购买 nike

我正在尝试插入一个 2D 角度,它在 99.9% 的时间内都有效。出于某种原因,我得到 -nan(ind) 某些值,例如:

lastAngle = -0.0613451
currentAngle = -0.061421
alpha = 0.218813

这是代码:

inline float slerpRotation(const float& angle1, const float& angle2, const float& alpha)
{
auto v1 = b2Vec2{std::cos(angle1), std::sin(angle1)};
auto v2 = b2Vec2{std::cos(angle2), std::sin(angle2)};
auto v = this->slerp(v1, v2, alpha);
return std::atan2(v.y, v.x);
}

inline b2Vec2 slerp(const b2Vec2& v1, const b2Vec2& v2, const float& alpha)
{
auto cosAngle = v1.x * v2.x + v1.y * v2.y;
auto angle = std::acos(cosAngle);
auto angleAlpha = angle * alpha;
auto v3 = (v2 - (cosAngle * v1)).Normalize();
auto x = v1.x * std::cos(angleAlpha) + v3 * std::sin(angleAlpha);
auto y = v1.y * std::cos(angleAlpha) + v3 * std::sin(angleAlpha);
return b2Vec2{x, y};
}

所有这些例子的结果都是 inf num:

slerpRotation(-0.0613451f, -0.061421f, 0.218813f);
slerpRotation(-1.63139f, -1.63139f, 0.723703f);
slerpRotation(-0.0614404f, -0.0614034f, 0.199831f);
slerpRotation(0.0194162f, 0.0194164f, 0.259074f);

我已经尝试解决这个问题一段时间了,但不知道是什么原因导致的,你们碰巧知道如何解决这个问题吗?

最佳答案

最后你在计算

angle1+alpha*(angle2-angle1)

或者如果你想排除一些边缘情况,

angle1+alpha*reduce2pi(angle2-angle1)

在哪里

 reduce2pi(phi) = fmod( 3*pi + fmod(phi, 2*pi), 2*pi)-pi

请注意,这些公式完全没有奇点,因为没有除法。角度和单位圆上的点之间不需要来回切换。

在代码中,这将是

inline float slerpRotation(const float& angle1, const float& angle2, const float& alpha)
{
auto angleDiff = angle2-angle1;
angleDiff = std::fmod(angleDiff, 2*std::M_PI);
angleDiff = std::fmod(angleDiff + 3*std::M_PI, 2*std::M_PI)-std::M_PI;
return angle1+alpha*angleDiff;
}

(12/13/2016) 结合几条评论:如果你坚持使用这个接口(interface)结构,那么你可以得到一个无奇点的方法,如下所示:

inline b2Vec2 slerp(const b2Vec2& v1, const b2Vec2& v2, const float& alpha)
{
auto angle = std::atan2(v1.x*v2.y - v1.y*v2.x, v1.x*v2.x + v1.y*v2.y);
auto angleAlpha = angle * alpha;
auto v3=b2Vec2{-v1.y, v1.x}; // rotation by 90°
return std::cos(angleAlpha)*v1 + std::sin(angleAlpha)*v3;
}

关于c++ - 角度的 Slerp 插值结果为 -nan(ind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41103057/

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