gpt4 book ai didi

java - 四元数串联仅在轴对齐时有效

转载 作者:行者123 更新时间:2023-12-02 00:05:29 24 4
gpt4 key购买 nike

我有一个用于对象旋转的简单四元数实现。如果我创建两个四元数,表示绕同一轴对齐 vector (即沿 X、Y 或 Z 轴)的旋转,则结果与按其大小之和进行的单个旋转相同(即先旋转 PI/2,然后再旋转 PI)/2 与按 PI 旋转相同)。这很好。

一旦旋转轴不是轴对齐,连接就会偏离预期(按 PI/2 旋转,然后再次 PI/2 与按 PI 旋转相同) 。这可不好。

仔细研究我的代码几天后,我没有发现任何问题,所以现在让我问:我是否在某种程度上从根本上误解了四元数的工作原理?我根据四元数所代表的轴角旋转来推理四元数,因为坦率地说,我并不完全理解四元数。

如果没有的话,你能看看我的代码吗? :-) 我刚刚将整个内容(用 Java 编写——我的目标是 Android)推送到 GitHub: https://github.com/wtracy/quaternionsQuaternions目录下是一个Eclipse项目。 (您不需要 Eclipse 来读取任何内容,但这很方便。)四元数类位于 src/文件夹下。 test/文件夹中包含运行我的四元数类所需的 JUnit 测试和类 stub 。

我已尽力使我的代码和测试易于理解。我觉得在互联网上寻找我的代码中的错误很愚蠢,但我没有任何想法。 :-P

最佳答案

您的四元数乘法有符号错误。

public Quaternion times(Quaternion q2) {
Quaternion q1 = this;
float w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
float x = q1.x*q2.w + q1.w*q2.x + q1.z*q2.y - q1.y*q2.z;
float y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
float z = q1.w*q2.z - q2.x*q2.y + q1.y*q2.x + q1.z*q2.w;
return new Quaternion(w, x, y, z);
}

写出的产品是

(w1 + x1*i + y1*j + z1*k)*(w2 + x2*i + y2*j + z2*k)
= w1*w2 - x1*x2 - y1*y2 - z1*z2
+ (w1*x2 + x1*w2 + y1*z2 - z1*y2)*i
+ (w1*y2 - x1*z2 + y1*w2 + z1*x2)*j
+ (w1*z2 + x1*y2 - y1*x2 + z1*w2)*k

自从

i*j = k    j*i = -k
j*k = i k*j = -i
k*i = j i*k = -j

您在 xz 等式中使用了错误的负项 - 如果两个轴相同,则不会产生任何影响,因为一个也可以写(作为简写)

(r + v)*(s + w) = r*s - <v|w> + r*w + s*v + v×w

v×w = 0 对于共线 vector ,但如果轴不同,则会显示出来。

此外,在 z 的等式中,

float z = q1.w*q2.z - q2.x*q2.y + q1.y*q2.x + q1.z*q2.w;
^^^^^^^^^

您有一个拼写错误,对两个因素都使用了 q2 一次。

应该是

public Quaternion times(Quaternion q2) {
Quaternion q1 = this;
float w = q1.w*q2.w - q1.x*q2.x - q1.y*q2.y - q1.z*q2.z;
float x = q1.x*q2.w + q1.w*q2.x - q1.z*q2.y + q1.y*q2.z;
float y = q1.w*q2.y - q1.x*q2.z + q1.y*q2.w + q1.z*q2.x;
float z = q1.w*q2.z + q1.x*q2.y - q1.y*q2.x + q1.z*q2.w;
return new Quaternion(w, x, y, z);
}

关于java - 四元数串联仅在轴对齐时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13982255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com