四元数行为就像欧纳

四元数行为就像欧纳

问题描述:

我的四元数执行有什么问题?我认为他们仍然像万智牌一样拥有万向锁。四元数行为就像欧纳

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; 

} 
+0

*“我的四元数执行有什么问题?”* - 由于您没有显示*您的*四元数执行,所以我们无法判断。 – luk2302

+0

@ luk2302我认为这是最重要的部分。我可以给你'makeQuaternion'函数,但正如我所说,我认为它给出了正确的结果。 – Maineri

+0

你是否正常化你的四元数? –

四元显得很有欺骗性,这是非常,非常努力拿到了坚实的感觉他们。

首先,您可能已经阅读了一些资源。对于四元数的维基百科页面是方程一个很好的资源: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.

+0

我有2个四元数。一个是对象的方向,另一个是临时的,包含当前的方向变化。临时的x + y + z + w在标准化后为1.01,主要的在-2和2之间跳跃。这两个四元数相乘。 – Maineri

+0

如果使用makeQuaternion并且结果是-2到+2,那么这意味着您的a和n值不合理。如果n个值通过余弦平方检验和,那么它必须是a值。 1.01可能只是一个舍入误差 另外,请确保您使用ijk向量正确地相乘。如果Q1的X = 1,Q2的Y = 1,那么Q1 * Q2 =(Z = 1) – pscheidler

+0

它们应该是什么?他们只规定我跟着那里的角度在0和360之间。轴的值在0和1之间。围绕y轴旋转90°:makeQuaternion(new Vector3f(0,1,0),90)。 – Maineri