Как повернуть нормализованный вектор к точке с помощью joml - PullRequest
0 голосов
/ 11 февраля 2019

Итак, я понимаю, как повернуть вектор к точке:

Вектор A = (0, 0, -1)
Вектор B = (15, 164, 16)

Шаг 1: нормализация B
Шаг 2: Расчет угла между A и нормализованным B
Шаг 3: Расчет перекрестного произведения A и нормализованного B

Затем, вращение A вокруг осимы вычислили в шаге 3 угол, вычисленный в шаге 2 (в радианах), должны дать мне нормализованный вектор B.

Однако, пытаясь сделать это с помощью joml, я не получаю правильный результат.Вот мой код:

Vector3f vecA = new Vector3f(0.0f, 0.0f, -1.0f);
System.out.println("Vector A: " + vecA.toString(FORMAT));
Vector3f vecB = new Vector3f(0, 0.5f, 1.0f).normalize();
System.out.println("Vector B: " + vecB.toString(FORMAT));

float angle = (float) Math.acos(vecA.dot(vecB));
System.out.println("Angle between the two: " + angle + "(" + Math.toDegrees(angle) + "°)");

Vector3f rotationAxis = new Vector3f();
vecA.cross(vecB, rotationAxis);

Vector3f rotatedVector = new Vector3f();
vecA.rotateAxis(angle, rotationAxis.x, rotationAxis.y, rotationAxis.z, rotatedVector).normalize();

System.out.println("Rotated Vector: " + rotatedVector.toString(FORMAT));

Это приводит к следующему выводу:

Vector A: (0 0 -1)
Vector B: (0 0.44721 0.89443)
Angle between the two: 2.6779451(153.43495411905388°)
Rotated Vector: (0 0.82566 0.56416)

Разве повернутый вектор не должен быть равен выходу вектора B?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Если все, что вас волнует, это конечный результат (ваш повернутый вектор), и вам не нужно каким-либо образом сохранять фактическое вращение (например, матрицу 3х3 или кватернион), то простейшее решение, очевидно, таково:

Vector3f rotatedVector = new Vector3f(vecB).normalize();

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

Если вы хотитечтобы сохранить фактическое вращение - которое по сути является ортонормированным базисным преобразованием - так что вы также можете применить его к другим векторам, а затем использовать Quaternionf.rotateTo(srcDir, destDir).Это даст вам кватернион, который вы можете использовать для преобразования любых векторов с помощью того же вращения через Quaternionf.transform(v).

0 голосов
/ 11 февраля 2019

Вы должны нормализовать свой rotationAxis -вектор, поскольку ось представлена ​​единичным вектором (см., Например, https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation).

Таким образом, просто замените

vecA.cross(vecB, rotationAxis);

на

vecA.cross(vecB, rotationAxis).normalize();

и все работает:

Vector A: (0 0 -1)
Vector B: (0 0.44721 0.89443)
Angle between the two: 2.6779451(153.43495411905388°)
Rotated Vector: (0 0.44721 0.89443)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...