3DCG というといわゆる MVP 変換がポイントとなるのだろうが、最近はあっさりと説明してある記事が多いようだ。
確かに環境によっては View 変換を表す行列を準備してくれたりするので、行列の知識も不要であったりするのだが、現在、取り組んでいる環境は Metal だ。
各種行列がAppleから提供されているわけではない。LookAt 関数なんてものはない。
(続く)
ModernRendering というサンプルに以下のメソッドが定義されている。
static float4x4 sInvMatrixLookat(float3 inEye, float3 inTo, float3 inUp)
{
float3 z = normalize(inTo - inEye);
float3 x = normalize(cross(inUp, z));
float3 y = cross(z, x);
float3 t = (float3) { -dot(x, inEye), -dot(y, inEye), -dot(z, inEye) };
return float4x4 ( float4 { x.x, y.x, z.x, 0 },
float4 { x.y, y.y, z.y, 0 },
float4 { x.z, y.z, z.z, 0 },
float4 { t.x, t.y, t.z, 1 } );
}
以下のように利用されている。
_uniforms.viewMatrix = sInvMatrixLookat(_position, _position + _direction, _up);
inTo が注視点、inEYE が(いわゆる)カメラ座標、inUp がカメラの上方向のベクトルでしょう。
