變換
? 在OpenGL中望门,所有的變換都是由縮放
平移
旋轉(zhuǎn)
這三種基本的變換方式得到的,實(shí)際上仔粥,是對(duì)片段
的頂點(diǎn)
所進(jìn)行的操作,在圖形簡(jiǎn)單,頂點(diǎn)很少的情況下躯泰,對(duì)每個(gè)頂點(diǎn)
進(jìn)行操作是可行的谭羔,但涉及到大量的頂點(diǎn)數(shù)據(jù)時(shí),這種操作就顯得笨拙且效率低下麦向,所以引入矩陣
與向量
這兩個(gè)數(shù)學(xué)概念(數(shù)學(xué)果然不愧是工具),一次性的操作所有的頂點(diǎn)瘟裸,這樣不僅高效,而且優(yōu)雅(手動(dòng)狗頭).
向量
? 向量是由一個(gè)方向
和大小
所構(gòu)成的诵竭,是一個(gè)矢量(有方向)
單位话告,所以在計(jì)算的時(shí)候,單純的相加是沒有意義的(比如卵慰,向上走了10步沙郭,再向右走10步,距離起點(diǎn)的距離并不是20步),需要使用特定的方式來(lái)處理向量的運(yùn)算裳朋。在數(shù)學(xué)中病线,會(huì)在字母上加上一個(gè)橫線(或箭頭)來(lái)表示向量
向量相加
? 向量相加
并不是單純的對(duì)向量
對(duì)大小進(jìn)行相加,還要考慮到向量
的方向鲤嫡。
?
?
?
最后得到的結(jié)果分別是從原點(diǎn)(0,0,0)指向(5,7,9)的向量和從原點(diǎn)(0,0,0)指向(3,3,3)的向量.
向量相乘
兩個(gè)向量相乘是一種很奇怪的情況送挑。普通的乘法在向量上是沒有定義的,因?yàn)樗谝曈X上是沒有意義的暖眼。但是在相乘的時(shí)候我們有兩種特定情況可以選擇:一個(gè)是點(diǎn)乘(Dot Product)
让虐,記作?,另一個(gè)是叉乘(Cross Product)
罢荡,記作x赡突。
點(diǎn)乘
在計(jì)算時(shí),點(diǎn)乘
的結(jié)果為兩個(gè)向量的大小
乘以它們夾角
之間的余弦值
點(diǎn)乘
的結(jié)果是個(gè)標(biāo)量(相對(duì)于向量而言区赵,沒有方向)
叉乘
叉乘
只在3D空間中有定義惭缰,它需要兩個(gè)不平行向量
作為輸入,生成一個(gè)正交
于兩個(gè)輸入向量的第三個(gè)向量笼才。如果輸入的兩個(gè)向量也是正交
的漱受,那么叉乘
之后將會(huì)產(chǎn)生3個(gè)互相正交
的向量。
矩陣
矩陣
就是一個(gè)矩形的數(shù)字骡送、符號(hào)或表達(dá)式數(shù)組昂羡。
上面的這個(gè)表達(dá)式就是一個(gè)2×3矩陣
矩陣相加
矩陣的相加需要對(duì)矩陣的每一個(gè)位置進(jìn)行加減,最終得到一個(gè)新的矩陣
矩陣相減
矩陣的減法同它的加法
矩陣乘法
在矩陣
中摔踱,一般是以點(diǎn)乘
的形式對(duì)矩陣進(jìn)行乘法運(yùn)算
矩陣和向量
在OpenGL中虐先,我們通常使用4×4的變換矩陣,前三個(gè)值分別代表(x,y,z),最后一個(gè)值代表縮放因子
,矩陣
與向量
相乘
將得到一個(gè)向量
一個(gè)4·4
的矩陣乘以4·1
的向量, 最終得到了4·1
的向量派敷,矩陣
乘以向量
的規(guī)則正是 [m·n] · 蛹批,這是必須遵守的規(guī)則撰洗,否則OpenGL將會(huì)數(shù)據(jù)錯(cuò)亂。
縮放
位移
旋轉(zhuǎn)
旋轉(zhuǎn)
會(huì)麻煩一些腐芍,涉及到三角變換
,切根據(jù)旋轉(zhuǎn)的軸的不同差导,其計(jì)算的方式也有所不同,以繞Z軸順時(shí)針旋轉(zhuǎn)60°為例(也就是360/6=60)猪勇,
旋轉(zhuǎn)為, 如果將x设褐,y坐標(biāo)的變化及旋轉(zhuǎn)的方向(OpenGL以逆時(shí)針為負(fù))加上,則應(yīng)表示為 ,拓展到矩陣則為
萬(wàn)向節(jié)死鎖(Gimbal Lock)
在上述的矩陣變化中泣刹,會(huì)產(chǎn)生一個(gè)新的問題(詳見上述視頻地址)络断,所產(chǎn)生的結(jié)果是片段會(huì)以一個(gè)奇怪的不符合我們希望的軌跡旋到最終的位置,為了解決這個(gè)問題项玛,大佬們?cè)O(shè)計(jì)了一個(gè)超級(jí)復(fù)雜的計(jì)算公式貌笨,但也不能完全解決萬(wàn)向節(jié)死鎖問題,而OpenGL中則是使用了四元數(shù)
來(lái)進(jìn)行解決(四元數(shù)-百度百科),在此不深究襟沮。
OpenGL中的變換
OpenGL對(duì)圖形做變換時(shí)锥惋,最終是要得到每一個(gè)頂點(diǎn)變換后的向量,因此开伏,需要將原頂點(diǎn)放在最后進(jìn)行計(jì)算膀跌,也即是
依照上面的方式,將每個(gè)頂點(diǎn)都進(jìn)行矩陣變換固灵,這樣捅伤,就能得到變換后的頂點(diǎn)信息了,也就能得到變換后的圖像數(shù)據(jù)了