现在使用线性贝塞尔曲线来插入角度:
float CardAnimation::valueAt( float valueA, float valueB, float t ) const
{
return (1.0f - t) * valueA + t * valueB;
}
....
if(m_startCard.m_angle != m_endCard.m_angle)
{
m_targetCard->m_angle =
valueAt(m_startCard.m_angle, m_endCard.m_angle,m_interval);
}
这可以按预期工作。但这是我的问题。如果您的起始角度是0.5f并且您想要达到6.0f(以弧度表示)那么它将从0.5f到6.0f从顺时针方向移动到真正自6.0f到0.5f> 0。 3.14f逆时针方向从0.5f到6.0f会更加智能(导致仅移动0.78弧度而不是5.5)。如果abs(endAngle - startAngle> PI),我应该怎么做才能逆时针插值?
由于
答案 0 :(得分:1)
也许是这样的:
通过重复添加或减去[0, 2Pi)
,将所有角度标准化为2Pi
。
按min(a, b)
换算,以便您的新终点为0
和c
。
您希望自己的范围为c
或2Pi - c
,以较小者为准,您必须根据您在(2)处的操作找出符号。然后,您希望在原始起点和起点加上范围之间进行插值。
答案 1 :(得分:1)
如果abs(endAngle - startAngle) > PI
,则从2*PI
中减去endAngle
。然后,您不是从0.5
转到6.0
,而是从0.5
转到-0.28
。
修改强>
这实际上假定为0 <= startAngle < endAngle <= 2*Pi
。
如果0 <= endAngle < startAngle <= 2*Pi
和startAngle - endAngle > PI
,则将 2*PI
添加到endAngle
。