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

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

Я пытаюсь отобразить линию вектора скорости из точки. Нарисовать линию несложно: достаточно вставить в график линию длиной 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:

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

Итак, похоже, что произошла комбинация двух ошибок; на один из них указал House MD (очень плохое наименование переменных: 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();

person Edward Z. Yang    schedule 19.10.2008    source источник
comment
Ваш вопрос почти невозможно понять, особенно ту часть, которая касается половины вектора скорости.   -  person    schedule 19.10.2008
comment
Почему вы вызываете vec_z.normalize дважды и что здесь означает ‹x, y, z›?   -  person    schedule 19.10.2008
comment
Это была опечатка в исходном коде. На самом деле это не повлияло на окончательное решение, но сделало бы масштабирование по оси y довольно странным. :-)   -  person Edward Z. Yang    schedule 19.10.2008


Ответы (2)


Дуп.

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

Боже, интересно, не могли бы вы включить преобразовать одно в другое< /а>?

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

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

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

person House MD    schedule 19.10.2008
comment
Вопрос заключается в том, чтобы получить вращение на определенную ось, тогда как меня интересует получение матрицы вращения. - person Edward Z. Yang; 19.10.2008
comment
Смотрите мои комментарии к ответу выше. Да, я мог бы это сделать, но я хотел бы, чтобы приведенная выше реализация работала. - person Edward Z. Yang; 19.10.2008
comment
Извини за это. Я работал над этим несколько часов, поэтому сейчас я очень расстроен. - person Edward Z. Yang; 19.10.2008
comment
НП. Я надеюсь, что случайное переворачивание векторов помогло? Должен любить графическое программирование... - person House MD; 19.10.2008

Это должно помочь вам

person Simon    schedule 19.10.2008
comment
Это не работает, так как у меня нет углов; только нужный вектор направления. - person Edward Z. Yang; 19.10.2008
comment
Вы можете вычислить углы, используя базовый триггер... SOH CAH TOA Если вы не знаете базовый триггер, вам не стоит возиться с векторами... - person Simon; 19.10.2008
comment
Я знаю, что могу проработать углы, но это крайне неэффективно. Должна быть возможность вычислить матрицу, используя только перекрестные произведения. - person Edward Z. Yang; 19.10.2008
comment
Если вы не можете произнести слово «monkeying», то вам не следует возиться с английским языком. - person House MD; 19.10.2008