You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Quat类重载__mul__运算符失败,无法实现实例间乘法

四元数类链式乘法问题解决

你的代码核心问题是乘法运算符重载方法的命名错误:你写的是___mul__(三个下划线),但Python规定运算符重载方法必须是双下划线包裹,也就是__mul__,这导致Python无法识别你重载的*运算符,所以抛出类型错误。

修正后的Quat类关键代码如下:

import math
from .vec3 import Vec3

class Quat:
    @classmethod
    def from_axis_angle(cls, _axis=Vec3(1.0, 0.0, 0.0), _angle=0.0):
        w = math.cos(_angle * 0.5)
        x = _axis.x * math.sin(_angle * 0.5)
        y = _axis.y * math.sin(_angle * 0.5)
        z = _axis.z * math.sin(_angle * 0.5)
        return cls(w, x, y, z)

    def __init__(self, _w, _x, _y, _z):
        self.w = _w
        self.x = _x
        self.y = _y
        self.z = _z

    def mult(self, _rhs):
        lhs_vec = Vec3(self.x, self.y, self.z)
        rhs_vec = Vec3(_rhs.x, _rhs.y, _rhs.z)
        w = self.w * _rhs.w - lhs_vec.dot(rhs_vec)
        xyz = self.w * rhs_vec + _rhs.w * lhs_vec + lhs_vec.cross(rhs_vec)
        return Quat(w, xyz.x, xyz.y, xyz.z)

    # 修正:把___mul__改为__mul__
    def __mul__(self, _rhs):
        lhs_vec = Vec3(self.x, self.y, self.z)
        rhs_vec = Vec3(_rhs.x, _rhs.y, _rhs.z)
        w = self.w * _rhs.w - lhs_vec.dot(rhs_vec)
        xyz = self.w * rhs_vec + _rhs.w * lhs_vec + lhs_vec.cross(rhs_vec)
        return Quat(w, xyz.x, xyz.y, xyz.z)
    
    def __rmul__(self, _rhs):
        return _rhs.__mul__(self)

    def to_axis_angle(self):
        xyz = Vec3(self.x, self.y, self.z)
        if xyz.is_zero():
            axis = Vec3(1.0, 0.0, 0.0)
            angle = 0
            return (axis, angle)

        axis = xyz.normalised()
        angle = math.acos(self.w) * 2.0
        return (axis, angle)

修正后,a * b * c会被Python解析为(a * b) * c,由于__mul__方法返回的是新的Quat实例,因此可以正常支持链式乘法操作。

内容的提问来源于stack exchange,提问作者Type Definition

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:22:55