1. 程式人生 > >OpenGL的矩陣變換詳解——有圖有真相

OpenGL的矩陣變換詳解——有圖有真相

OpenGL有個小小的難點,就是矩陣變換的順序問題。一不小心就會用錯,變換後的物體和自己想要的完全不一樣。為了自己的理解,也為了幫助別人的理解,我下面對矩陣變換做一個解釋。當然,大片大片的文字肯定會讓大家看的雲裡霧裡,所以我特意畫了一些示意圖供大家理解。
首先向大家明確一點,當你在程式中呼叫矩陣變換函式時,實際執行順序呼叫順序剛好相反,例如:

glm::mat4 trans;
    trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
    trans = glm::rotate(trans, glm::radians
(90.0f), glm::vec3(0.0, 0.0, 1.0));

呼叫順序是先平移,再旋轉。但是程式碼執行的時候,是先旋轉後平移。這是為什麼呢?主要是由於矩陣乘法右乘的特性。
假如有一個頂點假設我們有一個頂點(x, y, z),我們希望將其縮放2倍,然後位移(1, 2, 3)個單位。那麼進行的矩陣運算則如下圖所示:
這裡寫圖片描述
這裡寫圖片描述
上面圖中每個矩陣中間都有數字,用於標記這個矩陣,和描述矩陣。
1矩陣 * 2矩陣 = 3矩陣。3矩陣 * 4向量 = 最終變換結果
也就是:
1矩陣 * 2矩陣 * 4向量= 最終變換結果
根據矩陣和向量運算的性質,4向量先和2矩陣運算,再和1矩陣運算。所有,呼叫順序剛好和執行順序相反。
明白了執行順序和呼叫順序不同之後,咱們再來了解下。變化順序不同會帶來什麼影響。
比如先向右平移2個單位,再順時針旋轉90度,和先順時針旋轉90度,再向右平移2個單位,有啥區別?
上圖:

這裡寫圖片描述

讓其先平移兩個單位,再順時針旋轉90度後的圖片如下:

這裡寫圖片描述

如果先順時針旋轉90度,再向右平移2個單位,則與上圖效果完全不一樣。如下:

這裡寫圖片描述

造成這種現象的主要原因是:變換操作是相對於當前位置來進行的
其他的類似,請大家舉一反三。