class quaternion:
__slots__ = ("x", "y", "z", "w")
def __init__(self, x: float, y: float, z: float, w: float):
self.x = x
self.y = y
self.z = z
self.w = w
def rotate(self, x: float, y: float, z: float):
# Correctly bump self.x, self.y, self.z, self.w with the provided radians
对于欧拉向量是次要选择的情况,我在代码中实现四元数旋转。我有函数来设置它们并检索向前/向右/向上向量,但找不到如何应用旋转的好例子。与欧拉不同,我不能单独碰撞 x、y、z、w:对一个轴的每次修改都必须反映在其他轴上,并且我需要四元数沿其自身旋转,例如,如果我想通过旋转 来碰撞它X 轴上 -0.1 我希望对象旋转到自己的左侧,考虑到它的俯仰和滚动。
找到了一个非常有效的解决方案。我想要的是四元数乘法:我可以将基本旋转和偏移从欧拉转换为四元数,然后将两个四元数相乘即可得到所需的结果。
class quaternion:
__slots__ = ("x", "y", "z", "w")
def __init__(self, x: float, y: float, z: float, w: float):
self.x = x
self.y = y
self.z = z
self.w = w
def multiply(self, other):
x = other.x * self.w + other.y * self.z - other.z * self.y + other.w * self.x
y = other.x * self.z + other.y * self.w + other.z * self.x + other.w * self.y
z = other.x * self.y - other.y * self.x + other.z * self.w + other.w * self.z
w = other.x * self.x - other.y * self.y - other.z * self.z + other.w * self.w
return quaternion(x, y, z, w)