将四元数旋转给定量的函数

问题描述 投票: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 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 我希望对象旋转到自己的左侧,考虑到它的俯仰和滚动。

python math 3d rotation coordinates
1个回答
0
投票

找到了一个非常有效的解决方案。我想要的是四元数乘法:我可以将基本旋转和偏移从欧拉转换为四元数,然后将两个四元数相乘即可得到所需的结果。

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)
© www.soinside.com 2019 - 2024. All rights reserved.