
旋轉(zhuǎn)、平移、縮放……這些變換都能用矩陣表示。本章講透矩陣就是變換這個核心思想這是理解 Eigen 幾何模塊第 32 章的鑰匙。21.1 矩陣 變換一個驚人的事實矩陣乘法 對向量做變換。一個向量 v 被矩陣 A 乘一下A·v就變成了另一個向量——相當于對 v 做了一次變換移動、旋轉(zhuǎn)、縮放、扭曲……。v ──(A 作用)──→ A·v所以學矩陣其實是學變換。下面看幾種基本變換。21.2 縮放對角矩陣表示縮放把坐標各分量分別放大。[ 2 0 ] [ x ] [ 2x ] [ 0 3 ] · [ y ] [ 3y ]這個矩陣把 x 方向放大 2 倍y 方向放大 3 倍。y | · (2x, 3y) | / |/ · (x, y) └────────── x21.3 旋轉(zhuǎn)二維平面繞原點旋轉(zhuǎn)角度 θ用旋轉(zhuǎn)矩陣R(θ) [ cosθ -sinθ ] [ sinθ cosθ ]繞 Z 軸旋轉(zhuǎn) θ三維里最常用Rz(θ) [ cosθ -sinθ 0 ] [ sinθ cosθ 0 ] [ 0 0 1 ]例繞 Z 軸轉(zhuǎn) 90°θ90°cos0sin1[ 0 -1 0 ] [ 1 ] [ 0 ] [ 1 0 0 ] · [ 0 ] [ 1 ] ← X 軸上的點 (1,0,0) 轉(zhuǎn)到了 Y 軸 (0,1,0) [ 0 0 1 ] [ 0 ] [ 0 ]這就是旋轉(zhuǎn)矩陣——用矩陣乘法實現(xiàn)旋轉(zhuǎn)。21.4 平移需要齊次坐標平移整體移動是加上一個向量不是線性變換普通 3×3 矩陣表達不了。于是引入齊次坐標多加一維。二維點 (x, y) 寫成齊次坐標 (x, y, 1)用 3×3 矩陣做平移[ 1 0 tx ] [ x ] [ x tx ] [ 0 1 ty ] [ y ] [ y ty ] [ 0 0 1 ] [ 1 ] [ 1 ]三維點 (x, y, z) 寫成 (x, y, z, 1)用 4×4 矩陣做平移[ 1 0 0 tx ] [ x ] [ x tx ] [ 0 1 0 ty ] [ y ] [ y ty ] [ 0 0 1 tz ] [ z ] [ z tz ] [ 0 0 0 1 ] [ 1 ] [ 1 ]這就是為什么 3D 圖形里到處都是4×4 矩陣——它能把旋轉(zhuǎn)、縮放、平移統(tǒng)一表示。21.5 組合變換矩陣相乘 變換疊加想先旋轉(zhuǎn)再平移把兩個變換矩陣相乘就得到復合變換先做 B 再做 A A · B 注意順序從右往左執(zhí)行因為 (A·B)·v A·(B·v)先對 v 做 B再對結(jié)果做 A。矩陣乘法的意義之一就是變換的組合。21.6 剛體變換保持形狀的變換剛體變換 旋轉(zhuǎn) 平移。它不改變物體的形狀、大小、角度只改變位置和朝向。剛體的運動機器人的移動、相機的運動都是剛體變換用 Eigen 的Isometry3d表示第 32 章21.7 在 Eigen 里做變換先睹為快第 32 章詳解#includeEigen/Dense#includeEigen/Geometry#includeiostreamintmain(){constdoublePI3.14159265358979;// 繞 Z 軸旋轉(zhuǎn) 90°Eigen::AngleAxisdrot(PI/2,Eigen::Vector3d::UnitZ());Eigen::Matrix3d Rrot.toRotationMatrix();Eigen::Vector3dp(1,0,0);// X 軸上的點Eigen::Vector3d p2R*p;// 旋轉(zhuǎn)std::cout旋轉(zhuǎn)后 p2.transpose()std::endl;// (0,1,0)return0;}實際輸出旋轉(zhuǎn)后 1.61554e-15 1 0別被1.61554e-15嚇到數(shù)學上這個數(shù)是 0但計算機用二進制表示π/2的余弦時不可能精確為 0于是留下了 1e-15 量級的浮點殘渣。判斷兩個浮點數(shù)是否相等永遠用差值小于某個容差如 1e-9不要用。第 29、30、36 章的殘差、行列式都會出現(xiàn)這種現(xiàn)象。21.8 小結(jié)矩陣乘法 對向量做變換??s放對角矩陣旋轉(zhuǎn)旋轉(zhuǎn)矩陣平移齊次坐標 4×4 矩陣。矩陣相乘 變換疊加從右往左。剛體變換 旋轉(zhuǎn) 平移用Isometry3d表示。 第二部分完成你現(xiàn)在掌握了理解 Eigen 所需的全部線性代數(shù)基礎向量、矩陣、矩陣運算、方程組、行列式、逆矩陣、特征值、幾何變換。第三部分正式進入 Eigen 庫——你會發(fā)現(xiàn)前面學的數(shù)學和 C 全都用上了。練習題寫出繞 Z 軸旋轉(zhuǎn) 90° 的旋轉(zhuǎn)矩陣用它旋轉(zhuǎn)點 (1,0,0)。寫出把點 (x,y,z) 平移 (1,2,3) 的 4×4 齊次矩陣。解釋為什么先旋轉(zhuǎn)后平移和先平移后旋轉(zhuǎn)結(jié)果不同。用自己的話解釋矩陣就是變換。什么是剛體變換舉一個實際例子。