Closed Apeng-Rzp closed 1 year ago
You can check rotation_converter.py for more rotation conversion operations.
sorry,the angle_axis_to_rotation_matrix () is not completely pasted and can be converted to and from your rotation_matrix_to_angle_axis ().
def angle_axis_to_rotation_matrix(angle_axis: Tensor) -> Tensor:
r"""Convert 3d vector of axis-angle rotation to 3x3 rotation matrix.
Args:
angle_axis: tensor of 3d vector of axis-angle rotations in radians with shape :math:`(N, 3)`.
Returns:
tensor of rotation matrices of shape :math:`(N, 3, 3)`.
Example:
>>> input = tensor([[0., 0., 0.]])
>>> angle_axis_to_rotation_matrix(input)
tensor([[[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]]])
>>> input = tensor([[1.5708, 0., 0.]])
>>> angle_axis_to_rotation_matrix(input)
tensor([[[ 1.0000e+00, 0.0000e+00, 0.0000e+00],
[ 0.0000e+00, -3.6200e-06, -1.0000e+00],
[ 0.0000e+00, 1.0000e+00, -3.6200e-06]]])
"""
if not isinstance(angle_axis, Tensor):
raise TypeError(f"Input type is not a Tensor. Got {type(angle_axis)}")
if not angle_axis.shape[-1] == 3:
raise ValueError(f"Input size must be a (*, 3) tensor. Got {angle_axis.shape}")
def _compute_rotation_matrix(angle_axis, theta2, eps=1e-6):
# We want to be careful to only evaluate the square root if the
# norm of the angle_axis vector is greater than zero. Otherwise
# we get a division by zero.
k_one = 1.0
theta = torch.sqrt(theta2)
wxyz = angle_axis / (theta + eps)
wx, wy, wz = torch.chunk(wxyz, 3, dim=1)
cos_theta = torch.cos(theta)
sin_theta = torch.sin(theta)
r00 = cos_theta + wx * wx * (k_one - cos_theta)
r10 = wz * sin_theta + wx * wy * (k_one - cos_theta)
r20 = -wy * sin_theta + wx * wz * (k_one - cos_theta)
r01 = wx * wy * (k_one - cos_theta) - wz * sin_theta
r11 = cos_theta + wy * wy * (k_one - cos_theta)
r21 = wx * sin_theta + wy * wz * (k_one - cos_theta)
r02 = wy * sin_theta + wx * wz * (k_one - cos_theta)
r12 = -wx * sin_theta + wy * wz * (k_one - cos_theta)
r22 = cos_theta + wz * wz * (k_one - cos_theta)
rotation_matrix = concatenate([r00, r01, r02, r10, r11, r12, r20, r21, r22], dim=1)
return rotation_matrix.view(-1, 3, 3)
def _compute_rotation_matrix_taylor(angle_axis):
rx, ry, rz = torch.chunk(angle_axis, 3, dim=1)
k_one = torch.ones_like(rx)
rotation_matrix = concatenate([k_one, -rz, ry, rz, k_one, -rx, -ry, rx, k_one], dim=1)
return rotation_matrix.view(-1, 3, 3)
# stolen from ceres/rotation.h
_angle_axis = torch.unsqueeze(angle_axis, dim=1)
theta2 = torch.matmul(_angle_axis, _angle_axis.transpose(1, 2))
theta2 = torch.squeeze(theta2, dim=1)
# compute rotation matrices
rotation_matrix_normal = _compute_rotation_matrix(angle_axis, theta2)
rotation_matrix_taylor = _compute_rotation_matrix_taylor(angle_axis)
# create mask to handle both cases
eps = 1e-6
mask = (theta2 > eps).view(-1, 1, 1).to(theta2.device)
mask_pos = (mask).type_as(theta2)
mask_neg = (~mask).type_as(theta2)
# create output pose matrix
rotation_matrix = eye_like(3, angle_axis, shared_memory=False)
# fill output matrix with masked values
rotation_matrix[..., :3, :3] = mask_pos * rotation_matrix_normal + mask_neg * rotation_matrix_taylor
print(rotation_matrix)
return rotation_matrix # Nx3x3
However, despite the correct conversion of posture parameters, [1*15*3]—[1*15*3*3
]the full-obj is still very poor. I don't know why the face is particularly bad in my result
I'm sorry to bother you, but I met a problem when replacing the hand posture parameters. I notice that your hand attitude parameter is in the tensor form of
[1*15*3*3]
. I have the hand attitude parameter in the form of1*15*3
tensor, converted by the angle_axis_to_rotation_matrix () ————https://github.com/kornia/kornia.The method adopted is to directly replace the hand parameters in the data with the converted hand parameters, but the final result is very bad. May I ask what should we pay attention to when replacing the hand posture parameters