Unityと数学と音楽の学習帳

Unityと数学、音楽の同時学習を目的としたブログ(個人的メモ帳:勉強中なので正確性はない)

書籍:ゲームアプリの数学 忘備録

行列計算のおぼえがき

個人的なおぼえがき。一般的な憶え方ではない。

\overbrace { \overset { x'=3 }{ \underset { y=2 }{ \begin{bmatrix} a & b & c \\ d & e & f \end{bmatrix} }  } \times \overset { y'=3 }{ \underset { x=2 }{ \begin{bmatrix} 2 & 5 \\ 3 & 6 \\ 4 & 7 \end{bmatrix} }  }  }^{ x'とy'の値は合わせる\\ 必要がある } =\underset { x\times yの行列になる }{ \begin{bmatrix} 2a+3b+4c & 5a+6b+7c \\ 2d+3e+4f & 5d+6e+7f \end{bmatrix} }

  • x'とy'の値があってない場合、それは行列計算として成り立っていない式となる
  • 一項目は横に向かって二項目の縦とひとつひとつ掛け算され総和して計算される

unity固有の問題の解決

unityのVector4、Vector3、Vector2はMatrix4x4等の正方行列と*+演算子で計算できる。この場合ベクトルは数学の慣例に従って「縦の行列」として扱われる
従って下記のような計算は

\begin{bmatrix} a & b & c \end{bmatrix}\begin{bmatrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \end{bmatrix}=\begin{bmatrix} a+2b+3c & 4a+5b+6c & 7a+8b+9c \end{bmatrix}

一項目が「横の行列」なのでVectorで表現できない。なので以下のように「T 転置(transpose)」を使うなどして同じ意味の式に書き換える必要がある

{ \begin{bmatrix} 1 & 4 & 7 \\ 2 & 5 & 8 \\ 3 & 6 & 9 \end{bmatrix} }^{ T }\begin{bmatrix} a \\ b \\ c \end{bmatrix}\quad \Leftrightarrow \quad { \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} }\begin{bmatrix} a \\ b \\ c \end{bmatrix}=\begin{bmatrix} a+2b+3c \\ 4a+5b+6c \\ 7a+8b+9c \end{bmatrix}

ちなみに以下のような行列式はx'とy'の値が異なってしまうので行列式として成り立たない(Error:Invalid dimension. Vector3が右側の行列と乗算できない理由はこのため)

\overset { x'=1 }{ \underset { y=3 }{ \begin{bmatrix} a \\ b \\ c \end{bmatrix} }  } \overset { y'=3 }{ \underset { x=3 }{ \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{bmatrix} }  } \quad =\quad Error

これはP199で言及されている。教科書通りに毎回、転置処理を行うのは実用的でないので式を理解して書き換えた方が良いだろう

曲線のアルゴリズムP186

ベジェ曲線を制御する3点a,b,cを用意
tをパラメーターとした線形補完を行う一次関数を始点中点と中点終点に用意し共にブレンドする

\begin{cases} d\left( t \right) =\left( 1-t \right) a+tb \\ e\left( t \right) =\left( 1-t \right) b+tc \\ p\left( t \right) =\left( 1-t \right) d\left( t \right) +te\left( t \right)  \end{cases}

tは0以上~1以下になる

t\in \left[ 0,1 \right]

この連立方程式を変形してa,b,cに対して整理して行く

\Rightarrow \quad p\left( t \right) =\left( 1-t \right) \left\{ \left( 1-t \right) a+tb \right\} +t\left\{ \left( 1-t \right) b+tc \right\} \\ =\left( 1-t \right) \left( a-ta+tb \right) +t\left( b-tb+tc \right) \\ =a-ta+tb-ta+{ t }^{ 2 }a-{ t }^{ 2 }b+tb-{ t }^{ 2 }b+{ t }^{ 2 }c\\ =a-2ta+2tb+{ t }^{ 2 }a-2{ t }^{ 2 }b+{ t }^{ 2 }c

a,b,cに対して整理

={ t }^{ 2 }a-2ta+a\quad \quad -2{ t }^{ 2 }b+2tb\quad \quad +{ t }^{ 2 }c\\ ={ \left( 1-t \right)  }^{ 2 }a\quad \quad +2\left( 1-t \right) tb\quad \quad +{ t }^{ 2 }c

制御点Pと考える

a={ p }_{ 0 }\quad ,\quad b={ p }_{ 1 }\quad ,\quad c={ p }_{ 2 }\\ \Rightarrow \quad B\left( t \right) ={ \left( 1-t \right)  }^{ 2 }{ p }_{ 0 }\quad +2\left( 1-t \right) t{ p }_{ 1 }\quad +{ t }^{ 2 }{ p }_{ 2 }

方程式を行列式に表現を変更する。「拡大係数行列」と呼ばれるもので、例えばp0に対して行列に直すには以下のように考える

{ \left( 1-t \right)  }^{ 2 }{ p }_{ 0 }\quad =\quad \left( { t }^{ 2 }-2t+1 \right) { p }_{ 0 }\quad =\quad \begin{bmatrix} { t }^{ 2 } & t & 1 \end{bmatrix}\begin{bmatrix} 1 \\ -2 \\ 1 \end{bmatrix}{ p }_{ 0 }

この要領で全部、書き換えると以下になる

\Rightarrow \quad \quad B\left( t \right) =TCG=\begin{bmatrix} { t }^{ 2 } & t & 1 \end{bmatrix}\begin{bmatrix} 1 & -2 & 1 \\ -2 & 2 & 0 \\ 1 & 0 & 0 \end{bmatrix}\begin{bmatrix} { p }_{ 0 } \\ { p }_{ 1 } \\ { p }_{ 2 } \end{bmatrix}

P188 三次エルミート曲線の導出

想定される三次多項式。係数が未知なので

H\left( t \right) ={ c }_{ 0 }+{ c }_{ 1 }t+{ c }_{ 2 }{ t }^{ 2 }+{ c }_{ 3 }{ t }^{ 3 }

H(0)は始点、H(1)が終点。H'(0)は始点の傾き、H'(1)は終点の傾き。各々をこの三次多項式に当てはめると教本通りになるので
P188で用意された各式を利用するとc2に関しては以下のようにc2のみを抽出できる

{ c }_{ 2 }\quad =\quad 3\left( H\left( 1 \right) -H\left( 0 \right)  \right) -2H'\left( 0 \right) -H'\left( 1 \right) \quad =\quad 3\left\{ \left( { c }_{ 0 }+{ c }_{ 1 }+{ c }_{ 2 }+{ c }_{ 3 } \right) -{ c }_{ 0 } \right\} -2{ c }_{ 1 }-\left( { c }_{ 1 }+{ 2c }_{ 2 }+3{ c }_{ 3 } \right)

c3に関しては以下の様に確かに抽出できる

{ c }_{ 3 }\quad =\quad 2\left( H\left( 0 \right) -H\left( 1 \right)  \right) +H'\left( 0 \right) +H'\left( 1 \right) \quad =\quad 2\left\{ { c }_{ 0 }-\left( { c }_{ 0 }+{ c }_{ 1 }+{ c }_{ 2 }+{ c }_{ 3 } \right)  \right\} +{ c }_{ 1 }+\left( { c }_{ 1 }+{ 2c }_{ 2 }+3{ c }_{ 3 } \right)

これらを元の多項式に代入すると

H\left( t \right) ={ c }_{ 0 }+{ c }_{ 1 }t+{ c }_{ 2 }{ t }^{ 2 }+{ c }_{ 3 }{ t }^{ 3 }\\ \Rightarrow \quad H\left( t \right) =H\left( 0 \right) \quad \quad +\quad \quad H'\left( 0 \right) t\quad \quad +\quad \quad \left\{ 3\left( H\left( 1 \right) -H\left( 0 \right)  \right) -2H'\left( 0 \right) -H'\left( 1 \right)  \right\} { t }^{ 2 }\quad \quad +\quad \quad \left\{ 2\left( H\left( 0 \right) -H\left( 1 \right)  \right) +H'\left( 0 \right) +H'\left( 1 \right)  \right\} { t }^{ 3 }\\ \Rightarrow \quad H\left( t \right) =H\left( 0 \right) \quad +\quad H'\left( 0 \right) t\quad +\quad 3H\left( 1 \right) { t }^{ 2 }-3H\left( 0 \right) { t }^{ 2 }-2H'\left( 0 \right) { t }^{ 2 }-H'\left( 1 \right) { t }^{ 2 }\quad +\quad 2H\left( 0 \right) { t }^{ 3 }-2H\left( 1 \right) { t }^{ 3 }+H'\left( 0 \right) { t }^{ 3 }+H'\left( 1 \right) { t }^{ 3 }

これらを始点、終点、始点接線、終点接線ごとにまとめると

H\left( t \right) =H\left( 0 \right) -3H\left( 0 \right) { t }^{ 2 }+2H\left( 0 \right) { t }^{ 3 }\quad \quad +\quad \quad 3H\left( 1 \right) { t }^{ 2 }-2H\left( 1 \right) { t }^{ 3 }\quad \quad +\quad \quad H'\left( 0 \right) t-2H'\left( 0 \right) { t }^{ 2 }+H'\left( 0 \right) { t }^{ 3 }\quad \quad -H'\left( 1 \right) { t }^{ 2 }+H'\left( 1 \right) { t }^{ 3 }

従って

H\left( t \right) =\left( 1-3{ t }^{ 2 }+2{ t }^{ 3 } \right) H\left( 0 \right) \quad +\quad \quad \left( 3{ t }^{ 2 }-2{ t }^{ 3 } \right) H\left( 1 \right) \quad \quad +\quad \quad \left( t-2{ t }^{ 2 }+{ t }^{ 3 } \right) H'\left( 0 \right) \quad \quad +\quad \quad \left( { -t }^{ 2 }+{ t }^{ 3 } \right) H'\left( 1 \right)

になる。これを始点に対して行列に表現を変えると

\left( 1-3{ t }^{ 2 }+2{ t }^{ 3 } \right) H\left( 0 \right) \quad =\quad \begin{bmatrix} 1 & { t }^{ 1 } & { t }^{ 2 } & { t }^{ 3 } \end{bmatrix}\begin{bmatrix} 1 \\ 0 \\ -3 \\ 2 \end{bmatrix}H\left( 0 \right)

なので、これと同様にH\left( t \right) を書き換えると

\Rightarrow \quad \quad H\left( t \right) =TCG=\begin{bmatrix} 1 & { t }^{ 1 } & { t }^{ 2 } & { t }^{ 3 } \end{bmatrix}\begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ -3 & 3 & -2 & -1 \\ 2 & -2 & 1 & 1 \end{bmatrix}\begin{bmatrix} H\left( 0 \right)  \\ H\left( 1 \right)  \\ H'\left( 0 \right)  \\ H'\left( 1 \right)  \end{bmatrix}

となる。ここでH'(0)とH'(1)に関してプログラムではコントロールポイントの両脇を加算して2で割った値を接線としている。一見乱暴に見えるが始点と終点の2点しかないからベクトルで考えるとこれは正しい接線となる。