osgAnimation.InOutBounceFunction
类是 OpenSceneGraph 模块中的一个函数类,该类提供了一种在起点和终点之间进行缓动运动的方法,使得运动轨迹呈现出反弹效果。
继承自 osgAnimation.EaseInBounceFunction
,并实现了 operator()
方法。
#include <osgAnimation/InOutBounceFunction>
#include <iostream>
int main()
{
osgAnimation::InOutBounceFunction func;
const int steps = 10;
for (int i = 0; i <= steps; ++i) {
float t = static_cast<float>(i) / static_cast<float>(steps);
float value = func(t);
std::cout << "t: " << t << ", value: " << value << std::endl;
}
return 0;
}
输出结果:
t: 0, value: 0
t: 0.1, value: 0.098125
t: 0.2, value: 0.320312
t: 0.3, value: 0.6975
t: 0.4, value: 0.944
t: 0.5, value: 1
t: 0.6, value: 0.944
t: 0.7, value: 0.6975
t: 0.8, value: 0.320312
t: 0.9, value: 0.098125
t: 1, value: 0
InOutBounceFunction();
默认构造函数,不需要参数。
virtual double operator()(double t);
重载了 operator()
方法,用于计算运动轨迹上某个位置的函数值。
该函数类的实现原理与 osgAnimation.InBounceFunction
类相同,只不过计算时采用了双曲线函数的形式,使得曲线既具有反弹效果,又能够保持平稳。该函数类是 osgAnimation.EaseInBounceFunction
类的子类,因此在计算 T
值时,采用了该类的算法:先将 T
乘以 2
,然后计算其在 [0, 1]
区间内的值,最后再将其除以 2
,得到最终的 T
值。具体实现如下:
double EaseInBounceFunction::operator()(double t)
{
t = Math::clampAbove(t, 0.0);
t = Math::clampBelow(t, 1.0);
double uc = 1.0 - cos(t * M_PI * 0.5); // 双曲线函数
double newT = calculateT(uc);
return newT;
}
double InBounceFunction::operator()(double t)
{
EaseInBounceFunction func;
return 1.0 - func(1.0 - t);
}
double InOutBounceFunction::operator()(double t)
{
if (t < 0.5) {
EaseInBounceFunction easeIn;
return 0.5 * easeIn(2.0 * t);
} else {
EaseInBounceFunction easeOut;
return 0.5 + 0.5 * easeOut(2.0 * t - 1.0);
}
}