Матрица вращения для вектора направления

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

Я пытаюсь визуализировать векторную линию скорости из точки. Провести линию несложно: достаточно вставить в график линию длиной velocity.length. Линия будет центрирована в точке в направлении оси Y. Нам нужно получить это сейчас при правильном вращении и перемещении.

Вектор поступательного движения вычислить несложно: это половина вектора скорости. Однако вращательная матрица для меня чрезвычайно неуловима. Учитывая направленный вектор <x, y, z>, какая матрица мне нужна?

Изменить 1: Посмотрите; если вы не понимаете вопрос, вы, вероятно, не сможете дать мне ответ.

Вот что у меня сейчас есть:

                    Vector3f translation = new Vector3f();
                    translation.scale(1f/2f, body.velocity);

                    Vector3f vec_z = (Vector3f) body.velocity.clone();
                    vec_z.normalize();

                    Vector3f vec_y; // reference vector, will correct later
                    if (vec_z.x == 0 && vec_z.z == 0) {
                        vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized
                    } else {
                        vec_y = new Vector3f(0f, 1f, 0f);
                    }
                    Vector3f vec_x = new Vector3f();
                    vec_x.cross(vec_y, vec_z);
                    vec_z.normalize();

                    vec_y.cross(vec_x, vec_z);
                    vec_y.normalize();
                    vec_y.negate();

                    Matrix3f rotation = new Matrix3f(
                        vec_z.z, vec_z.x, vec_z.y,
                        vec_x.z, vec_x.x, vec_x.y,
                        vec_y.z, vec_y.x, vec_y.y
                    );

                    arrowTransform3D.set(rotation, translation, 1f);

на основе эта статья. И да, я пробовал стандартную матрицу вращения (vec_x.x, vec_y.x и т. д.), И она не сработала. Я вращал столбцы и строки, чтобы увидеть, есть ли какой-нибудь эффект.

Изменить 2:

Извиняюсь за грубую формулировку моих комментариев.

Похоже, это комбинация двух ошибок; один из них указал доктор Хауса (действительно плохое именование переменных: vec_z на самом деле был vec_y и так далее), а другой заключался в том, что мне нужно было инвертировать матрицу, прежде чем передавать ее механизму рендеринга (транспонирование было близко!). Итак, модифицированный код:

                    Vector3f vec_y = (Vector3f) body.velocity.clone();
                    vec_y.normalize();

                    Vector3f vec_x; // reference vector, will correct later
                    if (vec_y.x == 0 && vec_y.z == 0) {
                        vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized
                    } else {
                        vec_x = new Vector3f(0f, 1f, 0f);
                    }

                    Vector3f vec_z = new Vector3f();
                    vec_z.cross(vec_x, vec_y);
                    vec_z.normalize();

                    vec_x.cross(vec_z, vec_y);
                    vec_x.normalize();
                    vec_x.negate();

                    Matrix3f rotation = new Matrix3f(
                        vec_x.x, vec_x.y, vec_x.z,
                        vec_y.x, vec_y.y, vec_y.z,
                        vec_z.x, vec_z.y, vec_z.z
                    );
                    rotation.invert();

Ваш вопрос практически невозможно понять, особенно часть о «половине вектора скорости».

Account deleted 19.10.2008 15:37

Почему вы дважды вызываете vec_z.normalize и что здесь за <x, y, z>?

Account deleted 19.10.2008 16:14

Это была опечатка в исходном коде. На самом деле это не повлияло на окончательное решение, но сделало бы масштабирование по оси странным. :-)

Edward Z. Yang 19.10.2008 16:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
3
8 289
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Этот должен сделать вам

Это не работает, так как у меня нет углов; только желаемый вектор направления.

Edward Z. Yang 19.10.2008 15:28

Вы можете определить углы, используя базовый триггер ... SOH CAH TOA Если вы не знаете свой базовый триггер, вам не следует копаться в векторах ...

Simon 19.10.2008 15:40

Я знаю, что могу работать с углами, но это крайне неэффективно. Должно быть возможно вычислить матрицу, используя только перекрестные произведения.

Edward Z. Yang 19.10.2008 15:44

Если вы не можете произнести слово «обезьяна», то вам не следует баловаться английским языком.

House MD 19.10.2008 15:52
Ответ принят как подходящий

Дупи.

The question there involves getting a rotation to a certain axis, whereas I'm concerned with getting a rotation matrix.

Ну и дела, интересно, можешь ли ты повернуть преобразовать одно в другое?

Кстати, ваше текущее решение по выбору произвольной оси Y и последующей реортогонализации должно работать нормально; он выглядит ошибочно или, по крайней мере, плохо написанным. «z_vec» - не лучшее имя переменной для оси ординат. Что вообще с порядком "z, x, y"?

Если это по-прежнему не работает, попробуйте вносить случайные изменения, пока это не произойдет - транспонируйте матрицу, инвертируйте векторы, пока не получите четное количество ошибок знака, и тому подобное.

Кроме того, ваш тон голоса кажется грубым, учитывая, что вы просите незнакомцев потратить свое время, помогая вам.

Вопрос в том, чтобы получить поворот на определенную ось, тогда как меня интересует получение матрицы вращения.

Edward Z. Yang 19.10.2008 15:54

См. Мои комментарии к приведенному выше ответу. Да, я мог бы это сделать, но я бы хотел, чтобы вышеуказанная реализация работала.

Edward Z. Yang 19.10.2008 16:03

Прости за это. Я работал над этим несколько часов, так что сейчас я очень расстроен.

Edward Z. Yang 19.10.2008 16:16

Н.П. Я полагаю, что случайное переворачивание векторов помогло? Должен любить программирование графики ...

House MD 19.10.2008 16:21

Другие вопросы по теме