この2本の式を連立方程式で解けば、a=-2、b=3がわかります。上のグラフは、という事がわかりました。これ、物凄い使います。ease-outなもう一つの補間としてcos補間があります。その名の通りcosカーブを使った補間です:青い方がcos補間で、補間式は次のようになります:cosは0〜πの間で1〜-1まで数値が動きます。1からそれを引けば0〜2となるので、それを半分に割れば上のようになるというわけです。ピンク色の方は3次関数補間です。これを見るとわかるように、両者の間に殆ど違いはありません。3次関数補間の方が若干ease感が無いという感じですが...多分殆どわかりません(^-^;。これなら、普通は計算負荷が軽い3次関数補間を使いますね。補間関数の使い方ここまで挙げてきた補間関数を実際にどう使うのか?色々な所に使えるのですが、例えばキャラクタをA地点からB地点に10秒かけて移動させたいという例を見てみましょう。Az)という3次元ベクトルで表現します。ゲームはupdateメソッドが毎フレーム呼ばれますので、メソッド内で前回のフレームからの差分を取得します。UnityだとTime.deltaTimeがそれに該当するので楽です。いわゆるLerp}elapsedTimeが経過時間で、それを10秒で割り算すれば媒介変数tが算出できます。tの範囲は通常0〜1の間なので、tが1を超えた場合はクランプします。このtをそのまま使えば線形補間になりますが、それだとキャラクタの動きが機械的なので、上の例では3次関数補間にしています。outな動きをしてくれます。補間は本当に良く使うので、上のような3次関数補間などを関数化しておくのも手です。いわゆるLerp}こういうcube補間メソッドを作っておくと潰しが利きます。他の補間関数も同じように作れますが、違うのはrateを求めている1行だけです。いわゆるLerp}第6引数にfuncが追加されています。);}これで2点間を3次関数補間する事が出来ます。線形補間(linear)とか2次関数(easeIn)などを作れば、同じような呼び出しで別の移動を実現できます。これがもう少し進歩すると、いわゆる「Tweener」等の補間ライブラリが作れるわけです。�Bで挙げた3次関数補間は本当にあらゆる所で多用されています。この関数は曲線の形が完全に固定されているので、例えば「もっと曲がりがきついのが欲しいなぁ」と望んでも3次関数の世界ではもう見つかりません。高次の関数で何とかならないかと言うと、これがそう簡単でもありません。そもそも、次数を上げる方向性ではパラメータが増えすぎて微妙な調整が難しいのです。outな曲線(最初ゆっくりで真ん中あたりで最速、終わりでまたゆっくりになる)は「S字曲線」と呼ばれます。実はS字曲線には3次関数以外にもいくつか種類があります。その中で有名なのが「シグモイド曲線」で、次の式で表現されます:この関数は係数が一つaしかありません。この値を変えてプロットするとこんな感じになります:aの値が1の時はぱっと見ほぼ直線です(実際はほんのりとカーブしてます)が、値が大きくなるとどんどんS字度合いが強くなっています。0.5)を必ず通ります。理由は簡単、x=0を式に代入するとaの値によらずy=0.5になるからですね。その共通点を中心に点対象になっています。これも証明は簡単でx=sとx=-sを代入した式y1とy2を作り、それを足すと答えが綺麗に1になります。これはx=sの時の値y1に対し、x=-sの時の値が1-y1になる事を表します。よって点対象になるわけです。証明はさて置き、この曲線の性質は正に臨んだものに近いのですが、x=-1やx=1の所が各曲線ともバラバラの値を取っているため、このままではやや使いにくい。1.0)を通るように変形してみましょう。0.5)を原点を通るように関数の位置をずらしてみます。これはY軸方向に-1/2だけオフセットするだけなので、式の左辺に1/2を足すと実現できます:シグモイド曲線を原点対称にするとyの値にスケールを掛けることで曲線を上下方向に拡縮させることができます。-1/2)の所を通すことができるスケールが存在できるはずです。1/2)も同時に通ることになります。上式の右辺にスケール値sを掛け算し、(1,1/2)を代入して条件に叶うsを算出してみます:対称的でシンプルなsが出てきました(^-^)。このスケールを掛けたシグモイド曲線の式とグラフはこんな感じです:(-1,-0.5)、(0,0)そして(1,0.5)を通るS字曲線になりました。1)を通るようにしてみましょう。これはxの所を2xにするだけです:先程とグラフの見た目は変わっていませんが、X軸の目盛り幅が先程の半分になっている事に注意して下さい。これでX軸方向の幅が1、Y軸方向の高さが1になりました。補間関数としてほぼ仕上がっています(^-^)。最後の仕上げはこのグラフをX軸方向に0.5、Y軸方向に0.5だけオフセットしてX軸及びY軸の範囲をそれぞれ0〜1にしてあげます。これはxの所をx-1/2、yの所をy-1/2にします:できました!これがS字の曲がり具合を調節できるシグモイド補間関数です。0.5)〜(1,1)を通っています。0.5)で点対象なS字曲線です。aの値を大きくするほどS字の曲がり具合が急激になります。計算コストについては、べき数が異なるexp関数が2箇所あるだけで、後は四則演算ですから言うほど程遅い訳でもありません。重要なのはあるxに対して曲がりの強さを調整した一意のyが場合分けなどせずに単純な計算で求められるという事です。この単純さから、この補間はシェーダ内でも十分使えます!(実はシェーダで調整可能なS字曲線が欲しくてこの記事を追加しました(^-^;)。式をもう少し整理したりスケール部分を事前計算しておくなどすると計算コストを下げる事も出来ます。0)の所でX軸と不連続です。(1,1)の所ではY=1とも不連続なので扱いにご注意下さい。黄色い線は連続的になっているように見えますが、数学的にはどれだけaが大きくなっても不連続です。x<0では0未満に、y>0の範囲では1より大きくなります(-s及び1+sに漸近)。性質を理解の上ご使用下さい。1)で傾きが0にはなりませんでした。�Eでも十分実用性があるのですが、こだわるならば何とかそれらの点で傾きを0にしたい。そこで、�Bの3次補間関数と合わせ技を使ってみます。3次補間関数はx=0及びx=1で傾きは0になるのでした。あれば「シグモイド補間関数で求めた値をXとして、それを3次補間関数に放り込めばいいんじゃね?」と考えました。結果はこちら:ご機嫌(^-^)。1)で傾きが0になりました。係数aを大きくすれば曲がりが急になる性質もちゃんと入っています。唯一3次補間関数がベースなのでaをどれだけ小さくしても3次関数よりも曲がりを小さくは出来ません。ちなみに、xの範囲を広げるとこんなグラフになるようです:数学って面白いなぁ...。