Java 四元数相乘时的结果无效,不知道原因

Java 四元数相乘时的结果无效,不知道原因,java,math,quaternions,Java,Math,Quaternions,我目前正在开发一个包含四元数的3D库。作为每一位专家,我根据我在维基百科上找到的东西编写了我的方法,但它并不完全正确 这是计算两个四元数之间乘积的方法: 以下是它的实施: 下面是我写的一个小测试: 请注意,create()方法使用x,y,z,w初始化四元数 不幸的是,尽管我拥有复制和粘贴维基百科公式的惊人技能,但测试结果却毫无意义: (0.2617994+1.0i+1.0j+1.0k)*(0.2617994+1.0i+1.0j+1.0k)=(-2.931461+-2.6696618i+1.0j+

我目前正在开发一个包含四元数的3D库。作为每一位专家,我根据我在维基百科上找到的东西编写了我的方法,但它并不完全正确

这是计算两个四元数之间乘积的方法: 以下是它的实施: 下面是我写的一个小测试: 请注意,
create()
方法使用
x
y
z
w
初始化四元数

不幸的是,尽管我拥有复制和粘贴维基百科公式的惊人技能,但测试结果却毫无意义:

(0.2617994+1.0i+1.0j+1.0k)*(0.2617994+1.0i+1.0j+1.0k)=(-2.931461+-2.6696618i+1.0j+-6.3393235k)

为了进行比较,Wolfram正确地求解它并返回
-2.93146+0.523599i+0.523599j+0.523599k

以下是我从维基百科中巧妙复制的公式:


除了请帮帮我,我真的没有什么要说的,维基百科不能。

我认为在用新值更新临时变量之前,应该将当前值
x
y
z
w
存储在临时变量中

    public Quaternion multiply(Quaternion q) {
        float rx = q.getX(), ry = q.getY(), rz = q.getZ(), rw = q.getW();

        float cx = x; // cx = current X
        float cy = y;
        float cz = z;
        float cw = w;

        this.w = cw*rw - cx*rx - cy*ry - cz*rz;
        this.x = cw*rx + cx*rw + cy*rz - cz*ry;
        this.y = cw*ry - cx*rz + cy*rw + cz*rx;
        this.z = cw*rz + cx*ry - cy*rx + cz*rw;
        return this;
    }

在你的代码中,当你使用
this.w=w*rw-x*rx-y*ry-z*rz
,您将覆盖
w
的当前值,接下来的3个操作将受到此更改的影响。

我认为您应该在使用新值更新临时变量之前,将
x
y
z
w
的当前值存储在临时变量中

    public Quaternion multiply(Quaternion q) {
        float rx = q.getX(), ry = q.getY(), rz = q.getZ(), rw = q.getW();

        float cx = x; // cx = current X
        float cy = y;
        float cz = z;
        float cw = w;

        this.w = cw*rw - cx*rx - cy*ry - cz*rz;
        this.x = cw*rx + cx*rw + cy*rz - cz*ry;
        this.y = cw*ry - cx*rz + cy*rw + cz*rx;
        this.z = cw*rz + cx*ry - cy*rx + cz*rw;
        return this;
    }

在你的代码中,当你使用
this.w=w*rw-x*rx-y*ry-z*rz
,您将覆盖当前值
w
,接下来的3个操作将受到此更改的影响。

成功,谢谢。有时这是我们看不到的最简单的事情。我想我并不像我想的那样擅长从维基百科上抄袭……这很有效,谢谢。有时这是我们看不到的最简单的事情。我想我并不像我想的那样擅长从维基百科复制…你可以使用一些参考实现来调试和验证你自己的代码你可以使用一些参考实现来调试和验证你自己的代码
Quaternion a = Quaternion.create(1, 1, 1, Spatium.DEG_TO_RAD *  15);
Quaternion b = Quaternion.create(1, 1, 1, Spatium.DEG_TO_RAD *  15);
Quaternion c = Quaternion.product(a, b);
System.out.println(a + " * " + b + " = " + c);
    public Quaternion multiply(Quaternion q) {
        float rx = q.getX(), ry = q.getY(), rz = q.getZ(), rw = q.getW();

        float cx = x; // cx = current X
        float cy = y;
        float cz = z;
        float cw = w;

        this.w = cw*rw - cx*rx - cy*ry - cz*rz;
        this.x = cw*rx + cx*rw + cy*rz - cz*ry;
        this.y = cw*ry - cx*rz + cy*rw + cz*rx;
        this.z = cw*rz + cx*ry - cy*rx + cz*rw;
        return this;
    }