矩陣乘法

矩陣乘法

在三維圖形學中,一般使用四維矩陣,也就是四行四列的方陣,下面是一個典型的四維矩陣

既然是三維圖形學,為什麼使用四維矩陣呢?主要有兩個原因,第一,為了平移變換,第二,為了區別點和向量。

一、矩陣平移

二、矩陣旋轉

三、矩陣縮放

在蘋果提供的GLKit.framework中,定義了GLKMatrix4結構體:

/* m30, m31, and m32 correspond to the translation values tx, ty, and tz, respectively. m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively. */#if defined(__STRICT_ANSI__)struct _GLKMatrix4{ float m[16];} __attribute__((aligned(16)));typedef struct _GLKMatrix4 GLKMatrix4; #elseunion _GLKMatrix4{ struct { float m00, m01, m02, m03; float m10, m11, m12, m13; float m20, m21, m22, m23; float m30, m31, m32, m33; }; float m[16];} __attribute__((aligned(16)));typedef union _GLKMatrix4 GLKMatrix4;#endif

看了蘋果的注釋,再對比我們給出的矩陣平移的公式,可能會有疑問,為什麼是m30, m31, m32對應tx, ty, tz而不是m03,m13,m23對應tx, ty, tz呢?

這涉及到矩陣在內存中的存儲順序,對於一個矩陣,在內存中有兩種存儲順序,列優先和行優先。左為列優先,右為行優先:

顧名思義,列優先:優先按列存儲,先存完第一列再存第二列,行優先同理。

[ m00 m10 m20 m30 m01 m11 m21 m31 m02 m12 m22 m32 m03 m13 m23 m33 第一列 第二列 第三列 第四列]

m[16] = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, tx, ty, tz, 1],列優先排列如下:

[ 1, 0, 0, tx, 0, 1, 0, ty, 0, 0, 1, tz, 0, 0, 0, 1]

End.

推薦閱讀:

K - means 聚類筆記
九章演算法 | Google 面試題:奇怪的印表機
2.機器學習演算法應用--特徵選擇
數據結構——隊列與棧
021 Merge Two Sorted Lists[E]

TAG:演算法 | 機器學習 |