iOS開發(fā)學(xué)習OpenGL ES系列 -- 投影變換矩陣

接著上一篇再繼續(xù)講兩個比較重要的變換矩陣:透視投影和正交投影巩梢。在OpenGL中创泄,如果想對模型進行操作艺玲,就要對這個模型的狀態(tài)(當前的矩陣)乘上這個操作對應(yīng)的一個矩陣。如果乘以變換矩陣(平移, 縮放, 旋轉(zhuǎn)), 那相乘之后, 模型的位置會改變鞠抑,如果乘以投影矩陣(將3D物體投影到2D平面), 模型的投影方式被設(shè)置饭聚,如果乘以紋理矩陣, 模型的紋理方式被設(shè)置,當前矩陣如何改變就看進行了哪些操作(與什么矩陣相乘)搁拙。

透視投影:
透視投影是模仿人眼觀察物體秒梳,有遠小近大的效果,所以這種投影更加真實箕速。

如果設(shè)置當前矩陣的投影方式就需要使用函數(shù)生成透視或正交投影矩陣酪碘,然后與當前矩陣相乘⊙尉ィ看一下生成透視的效果:

對應(yīng)函數(shù)為:GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)

GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)

調(diào)用GLKMatrix4MakePerspective函數(shù)創(chuàng)建一個對稱的透視投影矩陣兴垦。其中參數(shù)fovyRadians定義視野在Y-Z平面的角度,范圍是[0.0,180.0]庭呜;參數(shù)aspect是投影平面寬度與高度的比率滑进;參數(shù)nearZ和farZ分別是近遠裁剪面到視點(沿Z負軸)的距離,它們總為正值募谎。

圖形管線會根據(jù)設(shè)置的fovyRadians扶关、nearZ和farZ參數(shù)確定一個可視空間區(qū)域,由上下左右遠近6個平面組成数冬,在可視區(qū)域內(nèi)的圖形會被投影到近平面节槐,之外的物體會被裁減掉。

物體的透視投影效果:

透視投影代碼:

// 旋轉(zhuǎn)
GLKMatrix4 rotateMatrix = GLKMatrix4MakeRotation(changeValue , 0.0, 1.0, 0.0);
    
// 平移
GLKMatrix4 translateMatrix = GLKMatrix4MakeTranslation(0, 0, -3.0);
    
// 透視投影
float aspect = self.view.frame.size.width / self.view.frame.size.height;
GLKMatrix4 perspectiveMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(90), aspect, 0.1, 20.0);
// GLKMathDegreesToRadians(90) 是將角度轉(zhuǎn)為弧度
transformMatrix = GLKMatrix4Multiply(translateMatrix, rotateMatrix);
transformMatrix = GLKMatrix4Multiply(perspectiveMatrix, transformMatrix);

透視投影矩陣默認的可視方向是向Z軸負方向拐纱。本例中的三角形Z坐標為0顯然不在可視空間區(qū)域內(nèi)铜异,所以上面的代碼中我們先將三角形進行了Z軸平移:GLKMatrix4MakeTranslation(0, 0, -3.0)。為了演示出動態(tài)的效果秸架,我再加上了旋轉(zhuǎn)矩陣:GLKMatrix4MakeRotation(changeValue , 0.0, 1.0, 0.0)揍庄,最后把平移、旋轉(zhuǎn)和透視投影相乘东抹,賦值到頂點著色器中蚂子。透視投影效果:
透視投影.gif

正交投影:
正交投影屬于平行投影, 投影線平行, 視景體是長方形的, 投影的內(nèi)容不會出現(xiàn)近大遠小的效果

對應(yīng)的函數(shù)為:GLKMatrix4MakeOrtho(float left, float right, float bottom, float top, float nearZ, float farZ)
left和right是設(shè)置x軸的最小坐標和最大坐標,bottom和top設(shè)置y軸缭黔,nearZ和farZ設(shè)置Z軸食茎。這樣創(chuàng)建的投影矩陣是一個長方體空間區(qū)域。

// 旋轉(zhuǎn)
GLKMatrix4 rotateMatrix = GLKMatrix4MakeRotation(changeValue , 0.0, 1.0, 0.0);

// 正交投影
float viewWidth = self.view.frame.size.width;
float viewHeight = self.view.frame.size.height;
GLKMatrix4 scaleMatrix = GLKMatrix4MakeScale(300, 300, 300);
GLKMatrix4 orthMatrix = GLKMatrix4MakeOrtho(-viewWidth/2, viewWidth/2, -viewHeight/2, viewHeight/2, -5, 5);

由于圖形原來非常小馏谨,所以這里加了一個縮放矩陣别渔。

看下最終效果:
正交投影.gif

這里用三角形展示的效果不太好,如果改為矩陣那就非常清楚了。這個有興趣的朋友可以自己嘗試一下哎媚。

在上傳的源碼中我已經(jīng)改用矩形展示了喇伯。

本例源碼:LearningOpenGL ES GitHub

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抄伍,隨后出現(xiàn)的幾起案子艘刚,更是在濱河造成了極大的恐慌,老刑警劉巖截珍,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件攀甚,死亡現(xiàn)場離奇詭異,居然都是意外死亡岗喉,警方通過查閱死者的電腦和手機秋度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钱床,“玉大人荚斯,你說我怎么就攤上這事〔榕疲” “怎么了事期?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纸颜。 經(jīng)常有香客問我兽泣,道長,這世上最難降的妖魔是什么胁孙? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任唠倦,我火速辦了婚禮,結(jié)果婚禮上涮较,老公的妹妹穿的比我還像新娘稠鼻。我一直安慰自己,他們只是感情好狂票,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布候齿。 她就那樣靜靜地躺著,像睡著了一般闺属。 火紅的嫁衣襯著肌膚如雪慌盯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天屋剑,我揣著相機與錄音,去河邊找鬼诗眨。 笑死唉匾,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巍膘,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼厂财,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了峡懈?” 一聲冷哼從身側(cè)響起璃饱,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肪康,沒想到半個月后荚恶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡磷支,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年谒撼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雾狈。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡廓潜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出善榛,到底是詐尸還是另有隱情辩蛋,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布移盆,位于F島的核電站悼院,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏味滞。R本人自食惡果不足惜樱蛤,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剑鞍。 院中可真熱鬧昨凡,春花似錦、人聲如沸蚁署。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽光戈。三九已至哪痰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久妆,已是汗流浹背晌杰。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留筷弦,地道東北人肋演。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓抑诸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親爹殊。 傳聞我的和親對象是個殘疾皇子蜕乡,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容