更新中……

配置C++的Eigen库请看这篇文章

几何方法构建旋转矩阵

简化一下:

思路:先施加一个先转矩阵,把旋转轴转到任意一个我们会写旋转矩阵的轴上,也就是任意一个基轴上,施加对应旋转之后乘以逆矩阵再转回来。

众所都周知旋转矩阵是正交矩阵,所以他的逆矩阵就是他的转置,挺好,省的算了。

使用C++和Eigen库进行实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Eigen::Matrix4f GetRotation(Eigen::Vector3f axis, float rotAngle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
axis.normalize();
float rotRadian = rotAngle / 180 * acos(-1);
//构建把z轴旋转到axis的矩阵
Eigen::Matrix4f zToAxis = Eigen::Matrix4f::Identity();
zToAxis << 1, 0, axis.x(), 0,
0, 1, axis.y(), 0,
0, 0, axis.z(), 0,
0, 0, 0, 1;
//因为旋转矩阵是正交矩阵,所以他的逆矩阵就是他的转置
Eigen::Matrix4f axisToZ = Eigen::Matrix4f::Identity();
axisToZ << 1, 0, 0, 0,
0, 1, 0, 0,
axis.x(), axis.y(), axis.z(), 0,
0, 0, 0, 1;

//构建绕z轴旋转矩阵
Eigen::Matrix4f rotZ = Eigen::Matrix4f::Identity();
rotZ << cos(rotRadian), -sin(rotRadian), 0, 0,
sin(rotRadian), cos(rotRadian), 0, 0,
0, 0, 1, 0,
0, 0, 0, 1;

model = zToAxis * rotZ * axisToZ;
return model;
}

使用罗德里格斯旋转公式构建旋转矩阵

Rodrigues' Rotation Formula

罗德里格斯公式的推导:https://www.cnblogs.com/wtyuan/p/12324495.html

思路:首先用罗德里格斯旋转公式计算出3×3旋转矩阵,然后返回其的4×4齐次坐标仿射变换矩阵。

使用C++和Eigen库进行实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Eigen::Matrix4f GetRotation(Eigen::Vector3f axis, float rotAngle)
{
Eigen::Matrix4f model = Eigen::Matrix4f::Identity();
axis.normalize();
//罗德里格斯旋转
Eigen::Matrix3f rotation = Eigen::Matrix3f::Identity();
float rotRadian = rotAngle / 180 * acos(-1);
Eigen::Matrix3f i = Eigen::Matrix3f::Identity();
i << 0, -axis.z(), axis.y(),
axis.z(), 0, -axis.x(),
-axis.y(), axis.x(), 0;
//套用罗德里格斯旋转公式
rotation = cos(rotRadian) * Eigen::Matrix3f::Identity() + (1 - cos(rotRadian)) * axis * axis.transpose() + sin(rotRadian) * i;
//构建仿射变换矩阵
model << rotation(0, 0), rotation(0, 1), rotation(0, 2), 0,
rotation(1, 0), rotation(1, 1), rotation(1, 2), 0,
rotation(2, 0), rotation(2, 1), rotation(2, 2), 0,
0, 0, 0, 1;
return model;
}

使用四元数旋转

四元数是用来进行旋转的线性插值的(矩阵不能用来线性插值,基于欧拉角的物理万向轴线性插值可能会出现万向锁情况)。

啥是四元数

比如我们需要绕轴v(vx,vy,vz)旋转θ的话,那按照如下公式构建q:

image-20210131151932330

用其进行旋转运算的方法如下(这里因为是单位向量,所以四元数的逆等于四元数的共轭):

image

用程序实现的话,下次一定更(主要是因为我害没看懂四元数插值是咋插的)