在三维空间中,旋转操作是经常使用的。对于欧拉角,我们可以用三个轴向下的旋转角度来描述一个旋转操作。在给定旋转角度 psi, theta, phi
的情况下, get_rotation_matrix_from_zyx
函数可以返回这个旋转矩阵。这个函数返回的是一个 3x3
的旋转矩阵。
def get_rotation_matrix_from_zyx(psi, theta, phi):
"""
Returns 3x3 rotation matrix using ZYX intrinsic rotations.
Parameters
----------
psi : float
rotation angle around z-axis
theta : float
rotation angle around y-axis
phi : float
rotation angle around x-axis
Returns
-------
numpy.ndarray
3x3 rotation matrix using ZYX intrinsic rotations
"""
psi
: float
,绕 z
轴旋转的角度theta
: float
,绕 y
轴旋转的角度phi
: float
,绕 x
轴旋转的角度这个函数返回一个 numpy 的 ndarray
对象,包含了一个 3x3
的旋转矩阵。
import open3d as o3d
import numpy as np
psi, theta, phi = np.pi/2, np.pi/3, np.pi/6
R = o3d.geometry.HalfEdgeTriangleMesh.get_rotation_matrix_from_zyx(psi, theta, phi)
print(R)
输出结果为:
array([[ 0.70710678, -0.35355339, 0.61237244],
[ 0.70710678, 0.35355339, -0.61237244],
[ 0. , 0.8660254 , 0.5 ]])
无。
如下是 get_rotation_matrix_from_zyx
的实现过程:
def get_rotation_matrix_from_zyx(psi, theta, phi):
"""
Returns 3x3 rotation matrix using ZYX intrinsic rotations.
Parameters
----------
psi : float
rotation angle around z-axis
theta : float
rotation angle around y-axis
phi : float
rotation angle around x-axis
Returns
-------
numpy.ndarray
3x3 rotation matrix using ZYX intrinsic rotations
"""
cpsi, spsi = np.cos(psi), np.sin(psi)
ctheta, stheta = np.cos(theta), np.sin(theta)
cphi, sphi = np.cos(phi), np.sin(phi)
Rz = np.array([[cpsi, -spsi, 0], [spsi, cpsi, 0], [0, 0, 1]])
Ry = np.array([[ctheta, 0, stheta], [0, 1, 0], [-stheta, 0, ctheta]])
Rx = np.array([[1, 0, 0], [0, cphi, -sphi], [0, sphi, cphi]])
return np.dot(np.dot(Rz, Ry), Rx)