其实上一篇的想法都是为了这个问题进行铺垫:
已知任意三维坐标系中一条线上两点坐标AB,及该线绕A点任意方向旋转后B’的坐标,求B点经过怎样的变换(如先绕x轴旋转多少度,再绕y轴转多少度,再绕z轴绕多少度)得到B’。
弄清楚这个问题前,首先需要声明一点:
三维空间中,旋转角不能单纯的认为是某点关于x、y、z轴的旋转角度的线性叠加。
认清这一点后,就应老实放弃向每个平面做投影算旋转角的错误方法。
旋转说穿了是矩阵的相乘。
然后从特殊情况入手,再从特殊到一般。
特殊情况:
1.旋转轴是x轴
2.旋转轴是y轴
3.旋转轴是z轴
一般情况:
旋转轴是任意直线
推导过程网上很多资料,其中,绕x、y、z轴的公式见三维空间中的旋转 ,markdown写数学公式太麻烦了。
旋转轴是任意直线,参考三维旋转矩阵的计算
回到开头问题,既然已知B和B’,和A三点组成一个面,求出它的法向量,结合BB’中垂线,可算出该点的旋转轴向量。将该向量平移到原点处,再使用欧拉角计算旋转向量,进而得到所需要的x、y、z轴旋转角度(这是有顺序的)。这种方法得到的角度如果旋转顺序不同,则得到的解不同。当然最后别忘了反平移回去。
四元数的形式看起来简单些,可惜四元数里的角度不是所希望的关于x、y、z轴的三个角度值。