ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

Simple Easing Functions

以前(id:toburau:20180406)、ここで書いたEasing関数の実装例へのリンク。
https://github.com/jesusgollonet/ofpennereasing/tree/master/PennerEasing
ここでの実装されている関数は引数が4つ(t,d,b,c)あり、それぞれ、tが今の時間、dが変化時間、bが開始時の値でcが終了時の値となっている。
もっとシンプルに0から1に変化したときの値でJavaScriptで実装したものがあった。
https://gist.github.com/gre/1650294
で、それをC++へと書き変えてみた。

namespace EasingFunctions {
  float Linear(float t) { return t; }
  float EaseInQuad(float t) { return t*t; }
  float EaseOutQuad(float t) { return t*(2.0f-t); }
  float EaseInOutQuad(float t) { return t<0.5f ? 2.0f*t*t : -1.0f+(4.0f-2.0f*t)*t; }
  float EaseInCubic(float t) { return t*t*t; }
  float EaseOutCubic(float t) { t-=1.0f; return t*t*t+1.0f; }
  float EaseInOutCubic(float t) { return t<0.5f ? 4.0f*t*t*t : (t-1.0f)*(2.0f*t-2.0f)*(2.0f*t-2.0f)+1.0f; }
  float EaseInQuart(float t) { return t*t*t*t; }
  float EaseOutQuart(float t) { t-=1.0f; return 1.0f-t*t*t*t; }
  float EaseInOutQuart(float t) { float t2=t-1.0f; return t<0.5f ? 8.0f*t*t*t*t : 1.0f-8.0f*t2*t2*t2*t2; }
  float EaseInQuint(float t) { return t*t*t*t*t; }
  float EaseOutQuint(float t) { t-=1.0f; return 1.0f+t*t*t*t*t; }
  float EaseInOutQuint(float t) { float t2=t-1.0f; return t<0.5f ? 16.0f*t*t*t*t*t : 1.0f+16.0f*t2*t2*t2*t2*t2; }
}

イージング関数について検索していると、いろいろな人がいろいろな方法で実装したのが出てきた。これよりももっと良い実装方法はあるだろうけど、シンプルに使うにはとりあえずこれで充分かなと。