[DirectX12] View Matrix での変換は何をしているか
View 行列を掛けることによって、カメラを基準にした相対座標に変換される。
# ローカルの頂点座標
LocalPos = [0.0,0.0,0.0])
# Model のワールド座標
WorldPos = [1.0,0.0,3.0]
# カメラポジション
eye = [1.0, 0.0,-3.0]
at = [1.0,0.0,0.0]
up = [0.0,1.0,0.0]
この座標を使い View 変換行った結果は下記になる。
[0.0, 0.0, 6.0]
Model が(1.0, 0.0, 3.0)、Eye が(1.0, 0.0, -3.0)のところにあるため、カメラから見た相対座標は Z 軸が 6.0 だけ離れているという事。
カメラの向いている方向
View 行列から、カメラの視線の Direction を取得できる。まず、View 行列の計算式は下記の通り。
zaxis = normal(At - Eye)
xaxis = normal(cross(Up, zaxis))
yaxis = cross(zaxis, xaxis)
xaxis.x yaxis.x zaxis.x 0
xaxis.y yaxis.y zaxis.y 0
xaxis.z yaxis.z zaxis.z 0
-dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1
式を見れば分かるが、zaxisは Eye から見た注視点へのベクトルになる(正規化済み)。
eye = [1.0, 0.0,-3.0]
at = [1.0,0.0,0.0]
この場合の View Matrix の zaxis は (0.0, 0.0, 1.0) になる。
eye = [1.0, 0.0,3.0]
at = [1.0,0.0,0.0]
この場合はマイナス軸方向を向くことになるので、zaxis は (0.0, 0.0, -1.0) の値になる。
View Matrix
例1
XMVECTOR Eye = XMVectorSet( 0.0f, 0.0f, 3.0f, 0.0f );
XMVECTOR At = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );
XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
g_View = XMMatrixLookAtLH( Eye, At, Up );
こちらで定義した場合は、下記のような Matrix が作られる。
{-1.0, 0.0, 0.0, 0.0}
{0.0, 1.0, 0.0, 0.0}
{0.0, 0.0, -1.0, 0.0}
{0.0, -0.0, 3.0, 1.0}
例2
XMVECTOR Eye = XMVectorSet( 1.0f, 0.0f, 3.0f, 0.0f );
XMVECTOR At = XMVectorSet( 0.0f, 0.0f, 0.0f, 0.0f );
XMVECTOR Up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
g_View = XMMatrixLookAtLH( Eye, At, Up );
Eye の X 位置が 1.0f にした状態。
{-0.948, 0.0, -0.316, 0.0}
{0.0, 1.0, 0.0, 0.0}
{0.316, 0.0, -0.948, 0.0}
{-5.96046448e-08, -0.0, 3.16, 1.0}