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