- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个用于对象旋转的简单四元数实现。如果我创建两个四元数,表示绕同一轴对齐 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
您在 x
和 z
等式中使用了错误的负项 - 如果两个轴相同,则不会产生任何影响,因为一个也可以写(作为简写)
(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/
我是一名优秀的程序员,十分优秀!