获得两个四元数角度的问题

时间:2012-01-04 10:37:45

标签: java math matrix lwjgl quaternions

好吧,所以我试图获得两个四元数的角度,它几乎完美无缺,但随后又跳了起来

evec angle: 237.44999653311922
evec angle: 119.60001380112993

我无法弄清楚为什么对我的生活。 (注意:evec是一个旧的变量名称,只留在印刷品中)

无论如何,这是我的代码:

FloatBuffer fb = BufferUtils.createFloatBuffer(16);

// get the current modelview matrix
GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, fb);
Matrix4f mvm = new Matrix4f();
mvm.load(fb);

Quaternion qmv2 = new Quaternion();
Matrix4f imvm = new Matrix4f();
Matrix4f.invert(mvm, imvm);
qmv2.setFromMatrix(imvm);
qmv2.normalise();

Matrix3f nil = new Matrix3f();
nil.setIdentity();
Quaternion qnil = new Quaternion();
qnil.setFromMatrix(nil);
qnil.normalise();

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil)));

System.out.println("evec angle: " + Math.toDegrees(radAngle));

如何让它从237跳到119并继续上升到360?

1 个答案:

答案 0 :(得分:1)

首先,两个四维向量(=四元数)之间的角度对几何意味着什么?你可以计算它,但结果可能没有意义。也许你正在寻找两个四元数代表的旋转轴之间的角度?

其次,你有错误:

float radAngle = (float)(2.0 * Math.acos(Quaternion.dot(qmv2, qnil)));
                         ^^^^^

acos 的结果是角度。不要乘以2。

第三,3D或4D空间中两个矢量之间的角度永远不会大于180°。它可以在飞机上,因为飞机强加了一个方向。在3D空间中,您必须将任意方向定义为“向上”以获得高于180°的角度。