【发布时间】:2016-12-12 14:27:39
【问题描述】:
我正在尝试插入一个 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);
我已经尝试解决这个问题一段时间了,但不知道是什么原因导致这个问题,你们碰巧知道如何解决这个问题吗?
【问题讨论】:
-
b2Vec2::Normalize对 {0,0} 向量有什么作用? -
@1201ProgramAlarm 它返回 0
-
嘿,这条线似乎是问题所在:auto angle = std::acos(cosAngle);取回一个 nan 值
-
问题是 cosAngle 似乎一直为 1,即使我将它打印到控制台但检查它是否大于 1.0f 时它返回 true,这使得 acos 返回一个 nan。所以为了解决这个问题,如果它更大,我必须将它设置为 1.0f,如果它更小,我必须将它设置为 -1.0f。
-
在最后两行计算中,您肯定想使用
v3的坐标,而不是导致标量和向量之和的完整向量。或者将它们组合成一个向量组合return cos(angleAlpha)*v1+sin(angleAlpha)*v3;。
标签: c++ math interpolation