[DirectX12] View Matrix での変換は何をしているか

[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}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA