四元数就像欧拉一样

时间:2017-12-02 19:12:28

标签: java 3d rotation lwjgl quaternions

我的四元数实现有什么问题?我认为它们仍然像万向节锁和万能锁一样。

Quaternionf rotations = makeQuaternion(new Vector3f(1, 0, 0), angles.x);
            rotations.mul(makeQuaternion(new Vector3f(0, 1, 0), angles.y));
            rotations.mul(makeQuaternion(new Vector3f(0, 0, 1), angles.z));

Matrix4f matrix = new Matrix4f();

matrix.translate(position);
matrix.rotate(rotations);
matrix.scale(scale);

angles包含欧拉角。人们总是告诉我,我根本不应该使用它们,但我不知道如何改变四元数的价值。我认为Quaternionf rotations是正确的。例如。角度为0, 90, 0的四元数包含0.00, 0.707, 0.00, 0.707 (x,y,z,w)。哪个是对的?

问题出在哪里?我读过关于这个主题的所有内容,但我显然仍然没有得到它。

修改

private static Quaternionf makeQuaternion(Vector3f n, float a) {

    float w, x, y, z; 

    a = a / 360 * (float) Math.PI * 2;

    w = (float) Math.cos(a / 2);

    x = (float) (n.x * Math.sin(a / 2));
    y = (float) (n.y * Math.sin(a / 2));
    z = (float) (n.z * Math.sin(a / 2));

    Quaternionf quaternion = new Quaternionf(x, y, z, w);

    return quaternion;

}

1 个答案:

答案 0 :(得分:1)

Quaternions看起来非常具有欺骗性,很难为他们获得坚实的感觉。

首先,您可能已阅读过一些资源。四元数的维基百科页面是方程式的一个很好的资源:https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation

我还有关于四元数的基础知识的博客文章以及帮助我​​了解它们的原因: https://blog.mide.com/quaternions-for-orientation

在makeQuaternion中有一些看起来很奇怪的东西,目前还不清楚你是不是错误地使用了东西,或者只是在不同的地方使用碎片。

您正在实施的等式是:

quaternion equation

此处,A是总旋转角度,即在围绕单个轴进行总旋转时应用的旋转,Bx,By,Bz是方向角度。方向角的余弦的平方和之和需要为1(即cos ^ 2 Bx + cos ^ 2 By + cos ^ 2 Bz = 1),因为它表示从原点指向的矢量。

你使用n.x,n.y,n.z,只要你确保方块的总和= 1,它们就可以工作,即它们需要是单位球面上的点。 A和方向角之间存在类似的关系,但最简单的验证方法是确保四元数的平方和= 1。