假设要把矢量norm旋转到z轴
    第一步,先把矢量绕x轴在y-z平面内旋转,使得矢量的y为0,矢量处于x-z平面内
    第二步,再把矢量绕y轴在x-z平面内旋转,使得矢量的x为0,转到和z轴重合
    第三步,数据总体可以绕z轴旋转,调整在x-y平面中的分布

    1. from scipy.spatial.transform import Rotation as R
    2. norm=[xmean,ymean,zmean]
    3. print(norm)
    4. # 根据矢量的y和z分量,计算出需要绕x旋转的角度。
    5. r1=np.arcsin(norm[1]/np.sqrt(norm[1]**2+norm[2]**2))
    6. print(r1)
    7. rot1 = R.from_euler('x', r1, degrees=False).as_matrix() # 获得旋转矩阵
    8. norm= np.dot(rot1,norm) # 进行旋转
    9. print(norm) # 检查是否y坐标为0
    10. # 根据矢量的y和z分量,计算出需要绕y旋转的角度。
    11. r2=np.arccos(norm[2]/np.sqrt(norm[0]**2+norm[2]**2))
    12. print(r2)
    13. rot2 = R.from_euler('y', r2, degrees=False).as_matrix() # 获得旋转矩阵
    14. norm= np.dot(rot2,norm) # 进行旋转
    15. print(norm) # 检查是否x坐标为0
    16. rtot=np.dot(rot2,rot1) # 获得总旋转矩阵
    17. norm=[xmean,ymean,zmean]
    18. norm= np.dot(rtot,norm) # 应用总旋转矩阵
    19. print(norm) # 再次验证是否x和y都为0
    20. # 后续还可以绕着z轴旋转,调整x-y平面的形状。
    21. r3=np.pi/6
    22. print(r3)
    23. rot3 = R.from_euler('z', r3, degrees=False).as_matrix()
    24. norm= np.dot(rot3,norm)
    25. print(norm)
    26. rtot=np.dot(rot3,rtot) # 获得总旋转矩阵