1.?Transform
?類:仿射/射影變換
模板參數
cpp
Transform<Scalar, Dim, Mode, Options>
-
Scalar
:數據類型(如?float
,?double
)。 -
Dim
:維度(2 或 3)。 -
Mode
:變換類型:-
Affine
(默認):仿射變換(平移+旋轉+縮放)。 -
AffineCompact
:無縮放項的仿射變換。 -
Projective
:射影變換(含透視效果)。
-
-
Options
:存儲順序(ColMajor
?或?RowMajor
)。
核心屬性與方法
方法/屬性 | 參數說明 | 返回值/功能 | 示例 |
---|---|---|---|
matrix() | 無 | 返回底層 4x4 變換矩陣 | Matrix4f m = t.matrix(); |
translate(Vector3f) | 平移向量 | 應用平移(修改自身) | t.translate(Vector3f(1, 0, 0)); |
rotate(Quaternionf) | 四元數或旋轉矩陣 | 應用旋轉 | t.rotate(AngleAxisf(M_PI/2, Vector3f::UnitZ())); |
scale(Scalar) ?或?scale(Vector3f) | 統一縮放因子或各軸獨立縮放 | 應用縮放 | t.scale(2.0); |
prescale() ,?prerotate() ,?pretranslate() | 類似上述方法,但右乘(先執行新變換) | 鏈式變換 | t.pretranslate(Vector3f(0, 1, 0)); |
inverse() | 無 | 返回逆變換 | Transform3f inv_t = t.inverse(); |
linear() | 無 | 返回線性部分(旋轉+縮放,3x3矩陣) | Matrix3f R = t.linear(); |
translation() | 無 | 返回平移部分(向量) | Vector3f pos = t.translation(); |
初始化方式
方法 | 示例 | 說明 |
---|---|---|
單位變換 | Transform3f t = Transform3f::Identity(); | 初始化為單位變換 |
從旋轉矩陣構造 | t.linear() = AngleAxisf(θ, axis).toRotationMatrix(); | 設置旋轉部分 |
2.?Quaternion
?類:三維旋轉
模板參數
cpp
Quaternion<Scalar, Options>
-
Scalar
:數據類型(如?float
,?double
)。 -
Options
:存儲順序(AutoAlign
?或?DontAlign
)。
核心屬性與方法
方法/屬性 | 參數說明 | 返回值/功能 | 示例 |
---|---|---|---|
w() ,?x() ,?y() ,?z() | 無 | 訪問四元數分量(實部?w ,虛部?x,y,z ) | float qw = q.w(); |
coeffs() | 無 | 返回向量格式?[x, y, z, w] | Vector4f coeff = q.coeffs(); |
normalize() | 無 | 歸一化四元數(修改自身) | q.normalize(); |
conjugate() | 無 | 返回共軛四元數 | Quaternionf q_conj = q.conjugate(); |
toRotationMatrix() | 無 | 轉換為 3x3 旋轉矩陣 | Matrix3f R = q.toRotationMatrix(); |
AngleAxis(angle, axis) | angle :弧度,axis :旋轉軸(需歸一化) | 從軸角構造四元數 | Quaternionf q = AngleAxisf(M_PI/2, Vector3f::UnitZ()); |
slerp(Scalar t, Quaternion other) | t :插值因子(0~1),other :目標四元數 | 球面線性插值 | Quaternionf q_interp = q1.slerp(0.5, q2); |
初始化方式
方法 | 示例 | 說明 |
---|---|---|
直接構造 | Quaternionf q(w, x, y, z); | 注意參數順序(w在前) |
從旋轉矩陣構造 | Quaternionf q(rotation_matrix); | 需矩陣正交 |
3. 其他幾何類
(1)?AngleAxis
(軸角表示)
方法/屬性 | 參數說明 | 示例 |
---|---|---|
angle() | 返回旋轉角度(弧度) | float θ = aa.angle(); |
axis() | 返回旋轉軸(需歸一化) | Vector3f axis = aa.axis(); |
toRotationMatrix() | 轉換為 3x3 旋轉矩陣 | Matrix3f R = aa.toRotationMatrix(); |
(2)?Rotation2D
(二維旋轉)
方法 | 參數說明 | 示例 |
---|---|---|
angle() | 返回旋轉角度(弧度) | Rotation2Df rot(M_PI/4); |
toRotationMatrix() | 轉換為 2x2 旋轉矩陣 | Matrix2f R = rot.toRotationMatrix(); |
4. 代碼示例
組合變換(平移+旋轉+縮放)
cpp
#include <Eigen/Geometry>
using namespace Eigen;// 初始化變換
Transform<float, 3, Affine> t = Transform<float, 3, Affine>::Identity();
t.translate(Vector3f(1, 2, 3)); // 平移
t.rotate(Quaternionf(AngleAxisf(M_PI/2, Vector3f::UnitX()))); // 繞 X 軸旋轉 90°
t.scale(0.5); // 縮放// 應用變換到點
Vector3f p(0, 1, 0);
Vector3f p_transformed = t * p; // 結果: (1, 2.5, 3)
四元數插值
cpp
Quaternionf q1 = Quaternionf::Identity();
Quaternionf q2(AngleAxisf(M_PI/2, Vector3f::UnitZ()));
Quaternionf q_mid = q1.slerp(0.5, q2); // 中間旋轉
5. 關鍵注意事項
-
變換順序:Eigen 默認左乘(即?
t.rotate()
?是相對于局部坐標系)。-
使用?
prerotate()
/pretranslate()
?可切換為右乘(相對于世界坐標系)。
-
-
性能優化:
-
對于純旋轉,直接使用?
Quaternion
?或?AngleAxis
?比?Transform
?更高效。 -
頻繁變換組合時,優先復用?
Transform
?對象。
-
-
歸一化:四元數和旋轉軸需手動歸一化(
normalize()
)。
6. 幾何類對比
類名 | 最佳用途 | 內存占用 | 計算效率 |
---|---|---|---|
Transform | 復合變換(平移+旋轉+縮放) | 16 floats (3D) | 中等 |
Quaternion | 純旋轉/插值 | 4 floats | 高 |
AngleAxis | 軸角表示旋轉 | 4 floats (3+1) | 低(需轉換) |
Rotation2D | 二維旋轉 | 1 float | 高 |
掌握這些類后,可高效處理 2D/3D 空間中的幾何變換!更多細節見?Eigen Geometry 文檔。