VRエンジン作成日記

ひたすらVRエンジンを作っていきます

ベジェ曲線の描き方を調べなおしている

ベジェ曲線の描き方を調べなおしている。AnimationCurveクラスに実装を書いているんだけど、weight値を自由に設定した時に思ったような値が出ていなさそうだった。(3次の) ベジェ曲線は雑に言うと次のような感じで求める。

X(t) = t^3 * X0 + t^2 * X1 + t * X2 + X3

Y(t) = t^3 * Y0 + t^2 * Y1 + t * Y2 + Y3

t値を与えるとX,Yそれぞれの座標が出てくるような計算になっている。tというのはtimeのことだと考えている。tは0から1の間の実数の値を取るので、割合 (パーセント) として考えた方が分かりやすいのかもしれない。

3次のベジェ曲線というのは、2つの座標と2つの制御点からなる、合計4つの点で構成される曲線で、上のX0からX3、Y0からY3がそれぞれの点の座標になる。

どこら辺に行き詰まっているのかというと、Unityの場合はAnimationCurveクラスから曲線を求める時、Evaluateというメソッドを呼び出すんだけど、このメソッドのC#の定義は次のようになっている。

float Evaluate(float time)

認識が間違っていないとすれば、これは (t値ではなく) X座標を渡すとY座標が得られるような構造になっているのではないかと考えている。ただ、本当に1つの値を返すことができるのかという疑問がある。

上の2つのベジェ曲線の式を見てもらえれば分かると思うけど、3次関数になっている。3次関数ということは解が1つに定まらないのではないか、という気がしてしまう。AnimationCurveクラスの曲線の場合は、どんな形に曲げても解が1つに定まるんだろうか。

あともう1つ困っているのは、地道に解こうと思っても3次関数の解を出す公式が難しいというのがある。2次のベジェ曲線だったら簡単に疑問が解決したかもしれない。

別のところで考えてみると、AnimationCurveの4つの点はKeyframeというクラスに実装していて、Unityの場合はKeyframeから制御点を求める時、元の座標からの相対X,Y座標ではなくて、tangent (傾き) とweight (X方向の重み) という値で求めるような構造になっている。なぜ相対X,Y座標ではないのかという疑問が自分の中で解決していない。

 とりあえず、UnityのAnimationCurveにいろんな値を入れてみて挙動を見るというのが解決の糸口になる気がしてきた。