視圖矩陣
也稱為攝像機矩陣,它是有三部分組成,即攝像機位置、目標位置以及攝像機上下方向來組成。在DirectX中提供了方法來通過這三部分來形成一個視圖矩陣,這三個參數都為空白間向量(Vector3)。在形成視圖矩陣過程中,如下圖所示,以攝像機位置為起點、攝像機目標位置為終點的單位向量作為攝像機空間的Z’軸座標(相對於世界空間),然後根據左手法則或右手法則計算出攝像機空間的X’軸座標,最後計算出攝像機空間的Y’軸座標。所以視圖矩陣中儲存攝像機空間X’、Y’和Z’軸座標在X、Y和Z方向上的分量,以及在攝像機空間中全局座標原點的位置。
在DirectX中提供了兩種方式來建立視圖矩陣,即Matrix.LookAtLH()和Matrix.LookAtRH(),分別用於建立左手法則的視圖矩陣和右手法則的視圖矩陣,下面就介紹左手法則的視圖矩陣,其定義如下:
public static Matrix LookAtLH( Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector);
其中參數cameraPosition用於指定攝像機位置,參數cameraTarget用於指定攝像機目標位置,參數cameraUpVector用於指定當前全局座標向上的方向,一般為(0,1,0)。
根據前面介紹的原理則可計算出視圖空間各座標軸的向量,如下:
cameraZaxis = Normalize(cameraTarget-cameraPosition)
cameraXaxis = Normalize(Cross(cameraUpVector, cameraZaxis))
cameraYaxis = Cross(cameraZaxis, cameraXaxis)
其中Normalize表示計算向量的單位向量, Cross表示計算兩個向量的向量積。對應於視圖矩陣中各個元素的值為:
cameraXaxis.X cameraYaxis.X cameraZaxis.X 0
cameraXaxis.Y cameraYaxis.Y cameraZaxis.Y 0
cameraXaxis.Z cameraYaxis.Z cameraZaxis.Z 0
DXY DYP DZP 1
其中:
DXY = -Dot(cameraXaxis,cameraPosition)
DYP = -Dot(cameraYaxis, cameraPosition)
DZP = -Dot(cameraZaxis, cameraPosition)
Dot表示計算兩個向量的數量積。如下用於計算視圖矩陣的代碼:
Vector3 cameraPosition = new Vector3(0.0f, 5.0f, 10.0f);
Vector3 cameraTarget = new Vector3(0.2f, 0.0f, 0.0f);
Vector3 cameraUpVector = new Vector3(0, 1, 0);
Vector3 cameraZaxis = Vector3.Normalize(cameraTarget-cameraPosition);
Vector3 cameraXaxis = Vector3.Normalize(Vector3.Cross(cameraUpVector, cameraZaxis));
Vector3 cameraYaxis = Vector3.Cross(cameraZaxis, cameraXaxis);
Matrix viewMatrix=Matrix.Zero;
viewMatrix.M11 = cameraXaxis.X; viewMatrix.M12 = cameraYaxis.X; viewMatrix.M13 = cameraZaxis.X;
viewMatrix.M21 = cameraXaxis.Y; viewMatrix.M22 = cameraYaxis.Y; viewMatrix.M23 = cameraZaxis.Y;
viewMatrix.M31 = cameraXaxis.Z; viewMatrix.M32 = cameraYaxis.Z; viewMatrix.M33 = cameraZaxis.Z;
viewMatrix.M41 = -Vector3.Dot(cameraXaxis, cameraPosition);
viewMatrix.M42 = -Vector3.Dot(cameraYaxis, cameraPosition);
viewMatrix.M43 = -Vector3.Dot(cameraZaxis, cameraPosition);
viewMatrix.M44 = 1;
Console.WriteLine("視圖矩陣為:");
ShowMatrix(viewMatrix);//顯示視圖矩陣
其中Vector3.Normalize()方法用於計算向量的單位向量, Vector3.Cross()方法用於計算兩個向量的向量積,Vector3.Dot()方法用於計算兩個向量的數量積。運行程式,其結果如下圖所示:
如果使用DirectX中的Matrix.LookAtLH()方法來建立視圖矩陣,其代碼如下:
Vector3 cameraPosition = new Vector3(0.0f, 5.0f, 10.0f);
Vector3 cameraTarget = new Vector3(0.2f, 0.0f, 0.0f);
Vector3 cameraUpVector = new Vector3(0, 1, 0);
Matrix viewMatrixComp = Matrix.LookAtLH(cameraPosition, cameraTarget, cameraUpVector);
Console.WriteLine("視圖矩陣為:");
ShowMatrix(viewMatrixComp);//顯示視圖矩陣
運行程式,其結果如下圖所示: