我的四元数实现有什么问题?我认为它们仍然像万向节锁和万能锁一样。
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 :(得分: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中有一些看起来很奇怪的东西,目前还不清楚你是不是错误地使用了东西,或者只是在不同的地方使用碎片。
您正在实施的等式是:
此处,A是总旋转角度,即在围绕单个轴进行总旋转时应用的旋转,Bx,By,Bz是方向角度。方向角的余弦的平方和之和需要为1(即cos ^ 2 Bx + cos ^ 2 By + cos ^ 2 Bz = 1),因为它表示从原点指向的矢量。
你使用n.x,n.y,n.z,只要你确保方块的总和= 1,它们就可以工作,即它们需要是单位球面上的点。 A和方向角之间存在类似的关系,但最简单的验证方法是确保四元数的平方和= 1。