書籍:ゲームアプリの数学 忘備録
行列計算のおぼえがき
個人的なおぼえがき。一般的な憶え方ではない。
- x'とy'の値があってない場合、それは行列計算として成り立っていない式となる
- 一項目は横に向かって二項目の縦とひとつひとつ掛け算され総和して計算される
unity固有の問題の解決
unityのVector4、Vector3、Vector2はMatrix4x4等の正方行列と*+演算子で計算できる。この場合ベクトルは数学の慣例に従って「縦の行列」として扱われる
従って下記のような計算は
一項目が「横の行列」なのでVectorで表現できない。なので以下のように「T 転置(transpose)」を使うなどして同じ意味の式に書き換える必要がある
ちなみに以下のような行列式はx'とy'の値が異なってしまうので行列式として成り立たない(Error:Invalid dimension. Vector3が右側の行列と乗算できない理由はこのため)
これはP199で言及されている。教科書通りに毎回、転置処理を行うのは実用的でないので式を理解して書き換えた方が良いだろう
曲線のアルゴリズムP186
ベジェ曲線を制御する3点a,b,cを用意
tをパラメーターとした線形補完を行う一次関数を始点中点と中点終点に用意し共にブレンドする
tは0以上~1以下になる
この連立方程式を変形してa,b,cに対して整理して行く
a,b,cに対して整理
制御点Pと考える
方程式を行列式に表現を変更する。「拡大係数行列」と呼ばれるもので、例えばp0に対して行列に直すには以下のように考える
この要領で全部、書き換えると以下になる
P188 三次エルミート曲線の導出
想定される三次多項式。係数が未知なので
H(0)は始点、H(1)が終点。H'(0)は始点の傾き、H'(1)は終点の傾き。各々をこの三次多項式に当てはめると教本通りになるので
P188で用意された各式を利用するとc2に関しては以下のようにc2のみを抽出できる
c3に関しては以下の様に確かに抽出できる
これらを元の多項式に代入すると
これらを始点、終点、始点接線、終点接線ごとにまとめると
従って
になる。これを始点に対して行列に表現を変えると
なので、これと同様にを書き換えると
となる。ここでH'(0)とH'(1)に関してプログラムではコントロールポイントの両脇を加算して2で割った値を接線としている。一見乱暴に見えるが始点と終点の2点しかないからベクトルで考えるとこれは正しい接線となる。