)Managed DirectX +C# 開發(入門篇)(六)

來源:互聯網
上載者:User
第五章 矩陣變換 一:為什麼使用4×4矩陣?在3D中進行編程時,使用的是4×4矩陣來進行矩陣變換。初學者往往認為既然是三維空間,為何不使用3×3的矩陣來表示呢?這是因為3×3的矩陣不能表示有些變換,比如比如平移、投影、反射,因此,增大到4×4,這樣,就可以描述更多的變換了。但是矩陣變成了4×4,為了做向量與矩陣的相乘,所以需要把向量增加為1×4,因為1×3的行矩陣和4×4的矩陣是無法相乘的;那麼,如何使用第四個成員(用w來表示)呢?當把一個點放置到一個1×4的行矩陣中時,設定w=1,表示可以對點進行適當的平移,如果w=0,表示不可以對向量進行平移。比如:把點 p = (1, 2, 3)放置到一個行向量中就象這樣[1, 2, 3, 1],同樣把向量 v = (21, 32, 33) 放置到一個行向量中就象這樣[21, 32, 33, 0]; 二、矩陣平移對圖形進行平行移動是最基本的操作: 使用下面的矩陣可以把向量( x, y, z, 1)沿x軸移動 p x個單位,沿y軸移動 py個單位,沿z軸移動 pz個單位:以下代碼為設定一個向量,對它應用一個平移變換後,得到新的向量,完整的代碼參見程式:private void button1_Click(object sender, System.EventArgs e)        {            Clear();            //定義一個測試的向量;                     Vector3 myVect=new Vector3(3,6,8);//用此向量來儲存後來的結果;                     Vector4 resultVect =new Vector4();//產生一個平移矩陣,XYZ方向均增加4個單位            Matrix MatrixA=Matrix.Translation(4,4,4);//對向量應用平移變換;            resultVect=Vector3.Transform(myVect,MatrixA);//將返回的向量顯示出來;            label9.Text =resultVect.ToString();//將矩陣也顯示出來;            DisplayMatrix(MatrixA,label1);        }程式執行結果,執行程式,點擊按鈕,執行結果如下:下面應用一個具體的執行個體:1:建立一個工程,產生一個XOZ水平面(代碼略):2:定義二個Mesh對象:Mesh mesh1=null,mesh2=null;3:在圖形的初始化函數中對它進行執行個體化,在這裡是產生兩個半徑一樣大小的小球:public bool InitializeGraphics()              {……                            mesh1=Mesh.Sphere(device,0.5f,20,20);                            mesh2=Mesh.Sphere(device,0.5f,20,20);
…….              }4:在渲染情境函數裡:一個小球進行平移變換,另一個則不進行任何變換:private void Render()        {                     if (device == null)                             return;                        device.Clear(ClearFlags.Target, System.Drawing.Color.Black , 1.0f, 0);            SetupCamera();            device.BeginScene();            displayPlane();             device.Transform.World=Matrix.Translation(10,0,0);            mesh1.DrawSubset(0);             device.Transform.World=Matrix.Identity;            mesh2.DrawSubset(0);            device.EndScene();            device.Present();                     }程式執行結果如下: 三、矩陣旋轉如果對一個圖形繞一個固定點或一條線進行旋轉,結果示意如下:圖9       下面的矩陣把一個向量圍繞x,y 和z軸旋轉一個角度。注意這裡應當為弧度值, 當俯視繞軸原點時,角度是指順時針方向的角度。樣本一:下面測試一向量應用旋轉變換後的結果:       private void button2_Click(object sender, System.EventArgs e)        {            Clear();                     Vector3 myVect=new Vector3(3,6,8);                     Vector4 resultVect =new Vector4();                     Matrix MatrixA=Matrix.RotationX((float)Math.PI/2);            resultVect=Vector3.Transform(myVect,MatrixA);            label9.Text =resultVect.ToString();            DisplayMatrix(MatrixA,label1);         }在這裡,我們是讓此向量繞X軸旋轉90度,可以想像成直線OA繞X軸旋轉90度,得到直線OB,B點值即為所求向量值;執行結果如下:樣本二:下面應用一個具體的執行個體:1:建立一個工程,產生一個XOZ水平面(代碼略):2:定義二個Mesh對象:Mesh mesh1=null,mesh2=null;3:在圖形的初始化函數中對它進行執行個體化,在這裡是產生兩個長方體:public bool InitializeGraphics()              {……                            mesh1=Mesh.Box(device,0.5f,0.5f,16);                            mesh2=Mesh.Box(device,0.5f,0.5f,16);……              }4:在渲染情境函數裡:對一個長方體繞X軸旋轉45度,另一個長方體則在原點繪出:private void Render()        {……                     device.Transform.World=Matrix.RotationX((float)Math.PI/4);            mesh1.DrawSubset(0);            device.Transform.World=Matrix.Identity;            mesh2.DrawSubset(0);……         }程式執行結果如下:以上介紹的是繞X軸旋轉,繞Y,Z軸旋轉類似,矩陣是: 四、矩陣縮放對物體進行縮放的如下:下面的矩陣即為把向量沿x軸縮放 q x個單位,沿y軸縮放 qy個單位,沿z軸縮放 qz個單位:注意,如果在每個方向上的值大於1為放大,小於1則為縮小;樣本一:              private void button3_Click_1(object sender, System.EventArgs e)        {            Clear();                     Vector3 myVect=new Vector3(3,6,8);                     Vector4 resultVect =new Vector4();            Matrix MatrixA=Matrix.Scaling(2,0.5f,0.5F);            resultVect=Vector3.Transform(myVect,MatrixA);            label9.Text =resultVect.ToString();            DisplayMatrix(MatrixA,label1);         }代碼中,將向量X方向擴大為2倍,Y和Z方向分別縮小為2倍;得到結果向量值為:樣本二:以下代碼將前面建立的兩個長方體其中一個應用縮放變換,其中在X,Y方向上放大為原來的2倍,Z方向上縮小為原來的2倍,相關代碼如下:……                     device.Transform.World=Matrix.Scaling(2,2,0.5f)*Matrix.RotationX((float)Math.PI/4);            mesh1.DrawSubset(0);            device.Transform.World=Matrix.Identity;              mesh2.DrawSubset(0);……程式執行結果如下:  五、組合變換       一般情況下,需要對向量進行一系列的變換。比如,前面顯示的長方體,為了不使兩者疊在一起,先進行了縮放,再進行了旋轉,其實還可以再應用其它變換,比如平移;假設把向量 p = [5, 0, 0, 1] 在所有軸上縮小為原來的1/5,然後沿著y軸旋轉π/4,最後把它在x軸上移動1個單位,在y軸上移動2個單位,在z軸上移動3個單位。設縮放、旋轉、移動的變換矩陣分別是 S, R y, T,如下:因此:這樣就得到了最後的結果,另一種簡便的方法是通過使用矩陣相乘把3個變換矩陣合成一個矩陣。注意次序不要顛倒,否則結果會不一樣。 那麼 pQ = [1.707, 2, –3.707, 1]。和第一種方法得到的結果是一樣的; 六、其它常用變換有兩個矩陣,常常用來設定場影及攝像機:1:device.Transform.Projection用來擷取或者設定投影變換矩陣,它本身也是一個Matrix型的變數。 2:Matrix.PerspectiveFovLH方法:public static Matrix PerspectiveFovLH(    float fieldOfViewY, //Y方向的視覺範圍,弧度表示,即Y方向的視域角     float aspectRatio, //視覺範圍的長寬比     float znearPlane, //近裁剪平面         float zfarPlane//遠裁剪平面);定義長寬比的作用是,如果使用者改變了視窗的大小,那麼仍然就可以正確的顯示物體的大小。最後兩個參數是遠及近裁剪平面,必須為這兩個平面指定2個Z值,一般來說,假設物體將在Z軸的1.0f和1000f之間運動時,就分別把這兩個參數設為1.0f,1000.0f。 3:Matrix.LookAtLH方法。 在使用觀察矩陣來建立一個立體的照相機模型後,需要設定不同的觀察點,可以使用這種方法來設定相機。public static Matrix LookAtLH(    Vector3 cameraPosition,//相機位置    Vector3 cameraTarget,   //相機的方向    Vector3 cameraUpVector //相機的Up向量);其中第二個參數為相機的面對方向,假設相機面對的是Z軸的方向,那麼就設定為(0,0,1)。轉自:dandancool http://blog.csdn.net/dandancool/archive/2007/06/26/1666569.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.