基於Visual C#的DirectX開發執行個體——視圖矩陣

來源:互聯網
上載者:User

視圖矩陣

也稱為攝像機矩陣,它是有三部分組成,即攝像機位置、目標位置以及攝像機上下方向來組成。在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);//顯示視圖矩陣

運行程式,其結果如下圖所示:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.