这个问题和@senderle给出的答案真的帮助了我的一个项目。答案是最小的,涵盖了一个人可能需要执行的大多数四元数计算的核心。
对于我自己的项目,我发现为所有操作分别使用函数并在每次需要时逐个导入它们是很乏味的,所以我实现了一个面向对象的版本。
四元数.py:import numpy as np
from math import sin, cos, acos, sqrt
def normalize(v, tolerance=0.00001):
mag2 = sum(n * n for n in v)
if abs(mag2 - 1.0) > tolerance:
mag = sqrt(mag2)
v = tuple(n / mag for n in v)
return np.array(v)
class Quaternion:
def from_axisangle(theta, v):
theta = theta
v = normalize(v)
new_quaternion = Quaternion()
new_quaternion._axisangle_to_q(theta, v)
return new_quaternion
def from_value(value):
new_quaternion = Quaternion()
new_quaternion._val = value
return new_quaternion
def _axisangle_to_q(self, theta, v):
x = v[0]
y = v[1