проблемы получения угла двух кватернионов - PullRequest
4 голосов
/ 04 января 2012

Хорошо, поэтому я пытаюсь получить угол двух кватернионов, и он почти работает идеально, но затем он прыгает с

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 Ответ

1 голос
/ 08 февраля 2012

Во-первых, что для вас геометрически значит угол между двумя четырехмерными векторами (= кватернионами)? Вы можете рассчитать это, но результат может не иметь смысла. Может быть, вы ищете угол между осями вращений, которые представляют два кватерниона?

Во-вторых, у вас есть ошибка здесь:

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

Результат от acos равен угла. Не умножайте на 2.

В-третьих, угол между двумя векторами в трехмерном или четырехмерном пространстве никогда не может превышать 180 °. На плоскости это возможно, потому что плоскость накладывает ориентацию. В трехмерном пространстве вы должны определить произвольное направление как «вверх», чтобы получить углы выше 180 °.

...