[7].了解下Opengl的矩陣變換吧

跳去目錄


變換

? 在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)表示向量 \vec{v}

向量相加

? 向量相加并不是單純的對(duì)向量對(duì)大小進(jìn)行相加,還要考慮到向量的方向鲤嫡。
? \vec{v} = \begin{pmatrix} 1 \\ 2 \\ 3 \\ \end{pmatrix} , \vec{j} = \begin{pmatrix} 4 \\ 5 \\ 6 \\ \end{pmatrix} , \vec{k} = \vec{v} + \vec{j} = \begin{pmatrix} 1 + 4 \\ 2 + 5 \\ 3 + 6 \\ \end{pmatrix} = \begin{pmatrix} 5 \\ 7 \\ 9 \\ \end{pmatrix}
? \vec{v} = \begin{pmatrix} 4 \\ 5 \\ 6 \\ \end{pmatrix} , \vec{j} = \begin{pmatrix} 1 \\ 2 \\ 3 \\ \end{pmatrix} , \vec{k} = \vec{v} - \vec{j} = \begin{pmatrix} 4 - 1 \\ 5 - 2 \\ 6 - 3 \\ \end{pmatrix} = \begin{pmatrix} 3 \\ 3 \\ 3 \\ \end{pmatrix}
?
最后得到的結(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)让虐,記作\vec{v}?\vec{k},另一個(gè)是叉乘(Cross Product)罢荡,記作\vec{v}x\vec{k}赡突。

點(diǎn)乘
在計(jì)算時(shí),點(diǎn)乘的結(jié)果為兩個(gè)向量的大小乘以它們夾角之間的余弦值
\vec{v} · \vec{j} = ||\vec{v}| · |\vec{j}|| · \cos θ
點(diǎn)乘的結(jié)果是個(gè)標(biāo)量(相對(duì)于向量而言区赵,沒有方向)

叉乘
叉乘只在3D空間中有定義惭缰,它需要兩個(gè)不平行向量作為輸入,生成一個(gè)正交于兩個(gè)輸入向量的第三個(gè)向量笼才。如果輸入的兩個(gè)向量也是正交的漱受,那么叉乘之后將會(huì)產(chǎn)生3個(gè)互相正交的向量。


矩陣

矩陣就是一個(gè)矩形的數(shù)字骡送、符號(hào)或表達(dá)式數(shù)組昂羡。
\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix}
上面的這個(gè)表達(dá)式就是一個(gè)2×3矩陣

矩陣相加

矩陣的相加需要對(duì)矩陣的每一個(gè)位置進(jìn)行加減,最終得到一個(gè)新的矩陣
\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} + \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} = \begin{bmatrix} 1 + 1 & 2 + 2 & 3 + 3 \\ 4 + 4 & 5 + 5 & 6 + 6 \\ \end{bmatrix} = \begin{bmatrix} 2 & 4 & 6 \\ 8 & 10 & 12 \\ \end{bmatrix}

矩陣相減

矩陣的減法同它的加法
\begin{bmatrix} 3 & 2 & 1 \\ 6 & 5 & 4 \\ \end{bmatrix} - \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ \end{bmatrix} = \begin{bmatrix} 3-1 & 2 - 2 & 1-3 \\ 6 - 4 & 5 - 5 & 4 6 6 \\ \end{bmatrix} = \begin{bmatrix} 2 & 0 & -2 \\ 2 & 0 & -2 \\ \end{bmatrix}

矩陣乘法

矩陣中摔踱,一般是以點(diǎn)乘的形式對(duì)矩陣進(jìn)行乘法運(yùn)算

\begin{bmatrix} 1 & 2 \\ 3 & 4 \\ \end{bmatrix} · \begin{bmatrix} 5 & 6 \\ 7 & 8 \\ \end{bmatrix} = \begin{bmatrix} 1*5 + 2*7 & 1*6+2*8 \\ 3*5+4*7 & 3*6+4*8 \\ \end{bmatrix} = \begin{bmatrix} 19 & 22 \\ 43 & 50 \\ \end{bmatrix}

矩陣點(diǎn)乘


矩陣和向量

在OpenGL中虐先,我們通常使用4×4的變換矩陣,前三個(gè)值分別代表(x,y,z),最后一個(gè)值代表縮放因子,矩陣向量 相乘將得到一個(gè)向量

矩陣乘以向量

一個(gè)4·4的矩陣乘以4·1的向量, 最終得到了4·1的向量派敷,矩陣乘以向量的規(guī)則正是 [m·n] · \vec{n}= \vec{m} 蛹批,這是必須遵守的規(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)

旋轉(zhuǎn)為, 如果將x设褐,y坐標(biāo)的變化及旋轉(zhuǎn)的方向(OpenGL以逆時(shí)針為負(fù))加上,則應(yīng)表示為 ,拓展到矩陣則為
繞軸旋轉(zhuǎn)

萬(wàn)向節(jié)死鎖(Gimbal Lock)

萬(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ù)了


跳去目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末巫玻,一起剝皮案震驚了整個(gè)濱河市丛忆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仍秤,老刑警劉巖熄诡,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異诗力,居然都是意外死亡凰浮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門苇本,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袜茧,“玉大人,你說(shuō)我怎么就攤上這事瓣窄〉严茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵康栈,是天一觀的道長(zhǎng)递递。 經(jīng)常有香客問我,道長(zhǎng)啥么,這世上最難降的妖魔是什么登舞? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮悬荣,結(jié)果婚禮上菠秒,老公的妹妹穿的比我還像新娘。我一直安慰自己氯迂,他們只是感情好践叠,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚼蚀,像睡著了一般禁灼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上轿曙,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天弄捕,我揣著相機(jī)與錄音,去河邊找鬼导帝。 笑死守谓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的您单。 我是一名探鬼主播斋荞,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虐秦!你這毒婦竟也來(lái)了平酿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤悦陋,失蹤者是張志新(化名)和其女友劉穎染服,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叨恨,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡柳刮,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痒钝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉颗。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖送矩,靈堂內(nèi)的尸體忽然破棺而出蚕甥,到底是詐尸還是另有隱情,我是刑警寧澤栋荸,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布菇怀,位于F島的核電站凭舶,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏爱沟。R本人自食惡果不足惜帅霜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呼伸。 院中可真熱鬧身冀,春花似錦、人聲如沸括享。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铃辖。三九已至剩愧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娇斩,已是汗流浹背隙咸。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留成洗,地道東北人五督。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瓶殃,于是被迫代替她去往敵國(guó)和親充包。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348