接下來的變換是旋轉,就是說給定乙個角度和點,我們將點繞著乙個座標軸旋轉。我們總是變化x,y,z三個裡面的兩個,而不讓第三部分變化。這意味著,旋轉路徑總在三個座標軸平面中的乙個之中:繞z軸的是xy面、繞x軸的是yz面、繞y軸的是xy面。還有許多複雜的旋轉轉變可以讓你繞任意乙個向量旋轉,但是眼下我們並不需要這些。
讓我們概括地定義這個問題這個問題。看看下面的這個圖:
我們想沿著圓圈從(x1,y1)移動到(x2,y2)。也就是說我們讓向量(x1,y1)轉過a2角度。我們假設這個圓的半徑是1。這意味著下列成立:
x1=cos(a1)
y1=sin(a1)
x2=cos(a1+a2)
y2=sin(a1+a2)
我們用下面的三角恒等式來產生x2和y2:
cos(a+b) = cosacosb - sinasinb
sin(a+b) = sinacosb+cosasinb
使用上面的式子我們可以寫出:
x2=cos(a1+a2) = cosa1cosa2- sina1sina2 = x1cosa2- y1sina2
y2=sin(a1+a2) = sina1cosa2+ cosa1sina2 = y1cosa2+ x1sina2
在上面的圖中我們看向xy平面,z軸指向頁面!如果x分量和y分量是思維向量的一部分,那樣上面的等式可以寫成下面的矩陣形式(不影響z和w)為:
如果我們想建立乙個繞著y軸、z軸的旋轉,那麼方程基本相同但是矩陣的安排卻略有不同!這是繞y軸旋轉的矩陣:
繞x軸的旋轉矩陣為:
本章中編碼的變化非常小,在編碼中我們只改變乙個變換矩陣的內容:
world.m[0][0]=cosf(scale); world.m[0][1]=-sinf(scale);world.m[0][2]=0.0f;
world.m[0][3]=0.0f;
world.m[1][0]=sinf(scale);
world.m[1][1]=cosf(scale); world.m[1][2]=0.0f;world.m[1][3]=0.0f;
world.m[2][0]=0.0f; world.m[2][1]=0.0f; world.m[2][2]=1.0f;
world.m[2][3]=0.0f;
world.m[3][0]=0.0f; world.m[3][1]=0.0f; world.m[3][2]=0.0f;
world.m[3][3]=1.0f;
正如你所看到的,我們繞z軸旋轉。你也可以嘗試其他的旋轉但是我認為這時候從沒有真正的從3d到2d的投影,其他的旋轉看起來有點奇怪。我們將在之後的章節中用乙個完整的轉變管線類來完成他們。
教程 逆向反彙編第七課
在以c為代表的高階語言中用if then else,switch case等高階語句來構成程式的判斷流程,不僅條理清晰且維護性還是不錯的.而組合語言的 則複雜得多,會看到cmp等指令的後面跟著 各類的跳轉指令jz jnz等.識別關鍵跳轉是軟體破解的乙個重要技能,許多軟體用乙個或多個跳轉 來實現註冊或...
C語言第七課
主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...
第七課 C變數
第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...