OpenGL教程翻譯 第七課 旋轉變換

2021-07-04 02:55:48 字數 1823 閱讀 2218

接下來的變換是旋轉,就是說給定乙個角度和點,我們將點繞著乙個座標軸旋轉。我們總是變化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 是大小寫...