最近,遇到一个需要将平面上的三维点云进行旋转,使之与xoy平面平行。
- 平面上的点分布如下图所示。
经过详细摸索,步骤如下:
- 求取该平面的法向量n1(可通过PCA方法进行求解,不在这进行赘述)。
- 表达出目标平行面的法向量,比如我想要与xoy平面平行,则我在这一步骤求得的法向量n2=(0,0,1)。
- 求得旋转轴,即求解垂直于原平面法向量n1与目标平面法向量n2的向量(本步骤通过叉乘方法求得)。
- 求解n1与**n2*之间的夹角φ。
- 根据旋转轴和夹角φ求解旋转矩阵R(本步骤通过罗德里格斯方法进行求解)
- 对点云中点坐标左乘旋转矩阵R,即可得到旋转后的点云。
- 平面上的点旋转后分布如下图所示。
n0=[0,0,1]; %xoy平面法向量
rotation_axis= cross(normal_pnts',n0); %求旋转角
theta = acos((n0*normal_pnts) / ( norm(n0)*norm(normal_pnts') )); %求夹角
Rv = rotation_axis / norm(rotation_axis) * theta;
Rotation_matrix = rodrigues(Rv); %基于罗德里格斯求解旋转矩阵
proj_pnts_1=Rotation_matrix * proj_pnts; %每个点左乘旋转矩阵得到旋转后的平面点
部分代码块见上述代码,我把罗德里格斯方法的子函数放到下载专栏,有需要的自取。