CameraTransform_K
Blender のカメラ操作を AviUtl2 で再現したものです.AviUtl2 限定機能を使っていないので AviUtl でも使えるようにはできますが面倒くさいので2限定です.
使い方
Parent -> Transform -> カメラ制御 -> Track の順で座標変換するイメージです.
Parent
適当なレイヤーに設置したメディアオブジェクトを Empty Object とみなします.描画エフェクトの XYZ ,XYZ 軸回転,拡大率のトラックバーデータを入手します.基本効果等による座標変化は拾えません. Transform のレイヤー番号がカメラ制御自身を指すか絶対指定で0を指定したとき Transform エフェクトより先に Parent エフェクトを追加することで任意レイヤーにオブジェクトを設置しなくても Parent 制御を行うことが可能です.メリットは ZYX オイラー角以外の姿勢を取れることです.
原理
つまり,根本座標系を $ \Sigma_0 ,カメラ座標系 (座標変換におけるターゲット座標) を $ \Sigma_tとするときカメラの位置姿勢を表す2つのベクトル $ {}^t\bm{u} と $ {}^t\bm{v} が存在するとき,Parent による同次変換行列 $ {}^0T_P と Transform による同次変換行列 $ {}^PT_t を用いて座標変換後のカメラの姿勢を表す2つのベクトル $ {}^0\bm{u} と $ {}^0\bm{v} は以下の式 (1) のように表現できます.
$ {}^0\bm{u}={}^0T_P{}^PT_t{}^t\bm{u}\tag{1a}
$ {}^0\bm{v}={}^0T_P{}^PT_t{}^t\bm{v}\tag{1b}
AviUtlではカメラ座標系の基底ベクトルが提供されていないので,このスクリプトではカメラ制御により得られた前方ベクトル (ターゲットと位置の相対ベクトル) と上方ベクトルの座標変換を行っています.
グローバル空間から見たカメラ座標系の情報として3x3の行列が渡されていればなぁ
オイラー角
オイラー角とは3次元空間における姿勢を任意軸周りの回転量の組み合わせによって表現したものです.オイラー角には1番目と3番目が同じ回転軸の Proper Euler 角6種類と全ての回転軸が異なる Tait–Bryan 角6種類の合計12種類存在します.一般的に XYZ オイラー角のように表現され,この XYZ は回転順序を示しています.例えばXYZ オイラー角は以下の式 (2) のような変換を意味します.
$ T =T_{X}{}^XT_{Y}{}^YT_Z = R_xR_yR_z\tag{2}
この同次変換行列は3次元の回転行列であり,以下の式 (3) で表現されます.
$ R_x = \begin{bmatrix} 1 & 0 & 0 \\ 0 & \cos{\theta} & -\sin{\theta} \\ 0 & \sin{\theta} & \cos{\theta} \end{bmatrix}\tag{3a}
$ R_y = \begin{bmatrix} \cos{\theta} & 0 & \sin{\theta} \\ 0 & 1 & 0 \\ -\sin{\theta} & 0 & \cos{\theta} \end{bmatrix}\tag{3b}
$ R_z = \begin{bmatrix} \cos{\theta} & -\sin{\theta} & 0 \\ \sin{\theta} & \cos{\theta} & 0 \\ 0 & 0 & 1 \end{bmatrix}\tag{3c}
ここで注意すべきなのは2番目の回転軸は1番目の変換後の座標系における軸であること,3番目の回転軸は1番目と2番目の変換後の座標系における回転軸であることです.
Blender では XYZ オイラー角は ZYX オイラー角として表記されています.実はオイラー角の表現方法には内因性と外因性という概念のとらえ方による違いが存在します.一般にオイラー角と表現すれば内因性を示し,外因性は固定角と表現されるようです.Blender では外因性オイラー角で表現されています.
外因性オイラー角とはある空間の固定的な座標軸周りに対象を回転させることを指し,外因性オイラー角は内因性オイラー角の回転順序の逆として表現されます.まず,ベクトルの回転は以下の式 (4) ように表現されます.
$ \bm{y}=R\bm{x}\tag{4}
式 (4) からわかるように,ベクトルの回転は対象ベクトルに対して回転行列を左から掛けます.したがって,オブジェクトを ZYX の順 (先ほどの例と逆の順番) に回転させることは以下の式 (5) で示される回転行列を左から掛けることと同じです.
$ \bm{y}=R\bm{x}=R_xR_yR_z\bm{x}\tag{5}
これは式 (2) と同じ行列を作用させています.つまり,考え方の異なる2つのオイラー角はただ回転順序が逆な関係と言えます.
このスクリプトでは Blender の表記方法に合わせて外因性オイラー角で表現してあるので注意してください.