Spaces:
Running
Running
# Copyright (c) 2018-present, Facebook, Inc. | |
# All rights reserved. | |
# | |
# This source code is licensed under the license found in the | |
# LICENSE file in the root directory of this source tree. | |
# | |
import torch | |
def qrot(q, v): | |
""" | |
Rotate vector(s) v about the rotation described by 四元数quaternion(s) q. | |
Expects a tensor of shape (*, 4) for q and a tensor of shape (*, 3) for v, | |
where * denotes any number of dimensions. | |
Returns a tensor of shape (*, 3). | |
""" | |
assert q.shape[-1] == 4 | |
assert v.shape[-1] == 3 | |
assert q.shape[:-1] == v.shape[:-1] | |
qvec = q[..., 1:] | |
uv = torch.cross(qvec, v, dim=len(q.shape) - 1) | |
uuv = torch.cross(qvec, uv, dim=len(q.shape) - 1) | |
return (v + 2 * (q[..., :1] * uv + uuv)) | |
def qinverse(q, inplace=False): | |
# We assume the quaternion to be normalized | |
if inplace: | |
q[..., 1:] *= -1 | |
return q | |
else: | |
w = q[..., :1] | |
xyz = q[..., 1:] | |
return torch.cat((w, -xyz), dim=len(q.shape) - 1) | |